diff --git a/.github/workflows/main.yml b/.github/workflows/CI.yml similarity index 60% rename from .github/workflows/main.yml rename to .github/workflows/CI.yml index bc4920e..88c2133 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/CI.yml @@ -10,21 +10,6 @@ on: - "**" jobs: - format-frontend: - name: 'Format Frontend' - runs-on: ubuntu-latest - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Prettify code - uses: creyD/prettier_action@v4.3 - with: - prettier_options: --write src/frontend/**/*.{ts,tsx} - - - name: Post Formatting Check - run: git diff --exit-code - format-core: name: 'Format Core' runs-on: ubuntu-latest @@ -49,7 +34,7 @@ jobs: - name: Format Backend run: | - black src/core + black version_1/ version_2/ - name: Post Formatting Check - run: git diff --exit-code + run: git diff --exit-code \ No newline at end of file diff --git a/README.md b/README.md index 28a3852..edfb0f4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -# Snowflake Branch: Hyperledger Labs AIFAQ prototype ![Hyperledger Labs](https://img.shields.io/badge/Hyperledger-Labs-blue?logo=hyperledger) ![Apache License 2.0](https://img.shields.io/badge/license-Apache%202.0-green.svg) @@ -7,140 +6,118 @@ [![GitHub Stars](https://img.shields.io/github/stars/hyperledger-labs/aifaq?style=social)](https://github.com/hyperledger-labs/aifaq/stargazers) [![GitHub Forks](https://img.shields.io/github/forks/hyperledger-labs/aifaq?style=social)](https://github.com/hyperledger-labs/aifaq/network/members) -[![Language Stats](https://img.shields.io/github/languages/top/hyperledger-labs/aifaq)](https://github.com/hyperledger-labs/aifaq) [![Issues](https://img.shields.io/github/issues/hyperledger-labs/aifaq)](https://github.com/hyperledger-labs/aifaq/issues) [![Pull Requests](https://img.shields.io/github/issues-pr/hyperledger-labs/aifaq)](https://github.com/hyperledger-labs/aifaq/pulls) -![Language Stats](https://img.shields.io/github/languages/count/hyperledger-labs/aifaq) -![Python](https://img.shields.io/badge/Python-85%25-blue?logo=python) -![HTML](https://img.shields.io/badge/HTML-10%25-orange?logo=html5) -![Other](https://img.shields.io/badge/Others-5%25-lightgrey?logo=github) ---- -## πŸš€ Overview +# Hyperledger Labs AIFAQ Prototype in Snowflake +An Open-Source Conversational AI - Intelligence App built on Snowflake Cloud Environment + +## Overview + +The **Hyperledger Labs AIFAQ Prototype** is an open-source conversational intelligence system designed to deliver accurate, context-aware answers from enterprise documentation, technical references, and organizational knowledge bases. It integrates the governance strengths of Hyperledger with the scalability of **Snowflake** and the flexibility of **open-source LLMs** to create a secure, multi-tenant production grade enterprise knowledge assistant. + +The prototype demonstrates a complete pipeline for ingesting, embedding, storing, and querying documents using Snowflake’s native capabilities and external AI inference. It supports open models such as **Llama**, **Mistral**, and **Snowflake Arctic** etc, offering a modular architecture suitable for production-grade deployments. + +## Features + +- **Multi-User Authentication** + Secure login and strict data isolation across document sets and chat histories. + +- **Hybrid LLM Support** + Route queries to Snowflake Cortex or external OpenSource LLM models through secure external functions. + +- **Multi-Document Knowledge Retrieval** + Supports structred and unstructred data. + +- **Persistent Chat Sessions** + Full session history stored in Snowflake with easy retrieval. + +- **Streamlit Frontend** + Intuitive UI for uploading documents, interacting with the assistant, and browsing past conversations. + +- **Snowflake Vector Search** + High-performance similarity search using Cortex Vector Search and SQL APIs inside the snowflake cloud environment. + +- **Automated Pipelines** + Re-embedding and re-indexing triggered by Snowflake Streams and Tasks when documents update. -The **Hyperledger Labs AIFAQ Prototype** is an open-source conversational AI tool designed to answer questions from technical documentation, FAQs, and internal knowledge bases with high accuracy and context awareness. This implementation of AIFAQ integrates deeply with **Snowflake**, providing secure multi-user support, persistent chat history, and access to powerful LLMs like OpenAI, Anthropic, and Snowflake Cortex. +- **Enterprise Governance** + RBAC, row-level security, and masking policies ensure protected data access. -πŸ‘‰ Official Wiki Pages: -- [Hyperledger Labs Wiki](https://lf-hyperledger.atlassian.net/wiki/spaces/labs/pages/20290949/AI+FAQ+2025) +## Architecture -πŸ‘‰ Weekly Community Calls: +### 1. Ingestion Layer +- Accepts structured and unstructured formats including PDFs, HTML, plain text, and transcripts. +- Uses Snowflake external tables, stages, Snowpipe, or cloud functions to store and extract metadata. +- All raw inputs move through well-defined staging schemas. -- Every Monday (public) β€” join via [Hyperledger Labs Calendar](https://wiki.hyperledger.org/display/HYP/Calendar+of+Public+Meetings). +### 2. Preprocessing & Embedding +- Snowpark UDFs handle chunking, cleaning, and tokenization. +- Embeddings generated using Cortex or external open-source models. +- Metadata and embedding vectors stored inside Snowflake as the unified knowledge base. + +### 3. Access Control & Security +- Document and chat isolation enforced via Snowflake roles. +- Row-level security restricts user visibility to their own data. +- Sensitive fields are masked using policy-based governance. + +### 4. Retrieval-Augmented Generation (RAG) +- User query β†’ vector search β†’ relevant context retrieval β†’ model response. +- Hybrid routing selects the best LLM based on context given by the user preference. +- Ensures responses are grounded in user-provided documentation. + +### 5. Automation & Observability +- Snowflake Streams detect document changes. +- Tasks automate reprocessing and embedding updates. +- Monitoring through Snoopy and event notifications for operational visibility. --- -## Features -- User Authentication: Secure, multi-user access with isolated document and chat histories -- LLM Integration: Seamless access to Cortex, OpenAI, and Anthropic models via Snowflake external functions -- Multi-Document Support: Upload and query multiple documents per session -- Persistent Chat History: Retrieve and continue conversations across sessions -- Streamlit UI: Intuitive document upload and chat interface +## Getting Started + +1. Choose the appropriate implementation folder: + - **version_1** for stable production deployment + - **version_2** for advanced workflows with Multi cloud data ingestion + +2. Follow the README inside the selected folder to set up: + - Warehouses + - Stages and schemas + - Pipelines + - External LLM functions + - Streamlit deployment +--- + +## Folder Descriptions + +### `version_1/` +A simplified demonstration build intended for quick snowflake evaluation adn to get hands on for beginners. + +Includes: +- Lightweight ingestion + embedding flow +- Basic Streamlit UI +- Environment dependencies +- Minimal Snowflake setup scripts +- Ingestion and RAG flows --- -## πŸ› οΈ Architecture -![Snowflake integration architecture](./images/snowflake-architecture.png) +### `version_2/` +A more advanced, optimized version improving modularity and performance. -1. Flexible Document Ingestion: AIFAQ supports various source formats (PDFs, HTML, YouTube transcripts, etc.) ingested into Snowflake via external tables, raw storage, and pipelines using tools like Snowpipe and Lambda-based metadata extractors. -2. Preprocessing & Embedding: Documents are chunked using Snowpark UDFs and embedded using LLM-based models. Embedding vectors are stored in Snowflake, forming the searchable knowledge base alongside metadata. -3. Access Control & Governance: Fine-grained access is enforced through Snowflake's role-based permissions, row-level security, and data masking policies to protect sensitive content. -4. LLM Query Augmentation & Retrieval: User queries are augmented with context by retrieving relevant chunks from the vector database (via Cortex Vector Search or SQL API), then sent to external LLMs (OpenAI, Anthropic) for response generation. -5. Automation & Monitoring: Updates to documents automatically re-trigger embedding pipelines using Snowflake Streams and Tasks, while monitoring tools like Snoopy and event notifications ensure system observability and orchestration. +Includes: +- Refined RAG pipeline ( Improved data ingestion pipeline) +- Cortex Vector Search & utilities +- Advanced version of Role Base Access Control (RBAC) +- Enhanced logging/observability +- Stronger multi-tenant isolation +- Updated Streamlit interface +- Multi Cloud ingestion --- -## πŸ“ Setup Instructions (Snowflake Branch) -Follow these steps to configure your Snowflake environment using the provided `setup.sql` script. - -1. Set up a role for the chatbot and grant access to required resources: - -``` -CREATE OR REPLACE ROLE chatbot_user; - -GRANT USAGE ON WAREHOUSE compute_wh TO ROLE chatbot_user; -GRANT USAGE ON DATABASE llm_chatbot TO ROLE chatbot_user; - -``` -2. Initialize the database and schema for storing documents and chat data: - -``` -CREATE OR REPLACE DATABASE llm_chatbot; -CREATE OR REPLACE SCHEMA chatbot; -USE SCHEMA llm_chatbot.chatbot; - -``` -3. Create two core tables, one for document chunks and another for chat history: - -``` -CREATE OR REPLACE TABLE documents ( - user_id STRING, - doc_id STRING, - doc_name STRING, - chunk_id STRING, - chunk_text STRING, - embedding VECTOR(FLOAT, 1536) -); - -CREATE OR REPLACE TABLE chat_history ( - user_id STRING, - session_id STRING, - doc_id STRING, - turn INT, - user_input STRING, - bot_response STRING, - timestamp TIMESTAMP -); -``` -4. External Function – OpenAI: Create an external function to call OpenAI's API: - -``` -CREATE OR REPLACE EXTERNAL FUNCTION openai_complete(prompt STRING) -RETURNS STRING -API_INTEGRATION = my_api_integration -HEADERS = ( - "Authorization" = 'Bearer ', - "Content-Type" = 'application/json' -) -URL = 'https://api.openai.com/v1/completions' -POST_BODY = '{ - "model": "gpt-3.5-turbo-instruct", - "prompt": "' || prompt || '", - "max_tokens": 200 -}'; - -``` -> Replace with your actual OpenAI API key. - -5. External Function – Anthropic: Similarly, set up a function to call Anthropic's Claude model: - -``` -CREATE OR REPLACE EXTERNAL FUNCTION anthropic_complete(prompt STRING) -RETURNS STRING -API_INTEGRATION = my_api_integration -HEADERS = ( - "x-api-key" = '', - "Content-Type" = 'application/json' -) -URL = 'https://api.anthropic.com/v1/complete' -POST_BODY = '{ - "model": "claude-3-opus-20240229", - "prompt": "Human: ' || prompt || '\nAssistant:", - "max_tokens": 200 -}'; - -``` -> Replace with your actual key. - -6. Deploy the chatbot interface using the Streamlit app stored in your project: - -``` -CREATE OR REPLACE STREAMLIT chatbot_ui -FROM '/chatbot_app' -MAIN_FILE = '/app.py'; -``` - ---- + + ## 🌐 Open Source License @@ -159,8 +136,9 @@ We welcome contributions! Please check our [CONTRIBUTING](./docs/CONTRIBUTING.md Join our weekly public calls every Monday! See the [Hyperledger Labs Calendar](https://wiki.hyperledger.org/display/HYP/Calendar+of+Public+Meetings) for details. -## πŸ“’ Stay Connected +## Stay Connected - [Slack Discussions](https://join.slack.com/t/aifaqworkspace/shared_invite/zt-337k74jsl-tvH_4ct3zLj99dvZaf9nZw) - [Hyperledger Labs Community](https://lf-hyperledger.atlassian.net/wiki/spaces/labs/pages/20290949/AI+FAQ+2025) - Official Website: [aifaq.pro](https://aifaq.pro) +- Official Wiki Pages: [Hyperledger Labs Wiki](https://lf-hyperledger.atlassian.net/wiki/spaces/labs/pages/20290949/AI+FAQ+2025) diff --git a/images/activate_gpu.png b/images/activate_gpu.png deleted file mode 100644 index 4e71fc0..0000000 Binary files a/images/activate_gpu.png and /dev/null differ diff --git a/images/compress_files.png b/images/compress_files.png deleted file mode 100644 index df6c824..0000000 Binary files a/images/compress_files.png and /dev/null differ diff --git a/images/copy_paste_code.png b/images/copy_paste_code.png deleted file mode 100644 index 21a645a..0000000 Binary files a/images/copy_paste_code.png and /dev/null differ diff --git a/images/curl_results.png b/images/curl_results.png deleted file mode 100644 index b60d736..0000000 Binary files a/images/curl_results.png and /dev/null differ diff --git a/images/move_command.png b/images/move_command.png deleted file mode 100644 index 6a51631..0000000 Binary files a/images/move_command.png and /dev/null differ diff --git a/images/new_studio.png b/images/new_studio.png deleted file mode 100644 index bbc121e..0000000 Binary files a/images/new_studio.png and /dev/null differ diff --git a/images/open_terminal.png b/images/open_terminal.png deleted file mode 100644 index 9518503..0000000 Binary files a/images/open_terminal.png and /dev/null differ diff --git a/images/prototype_schema_v1.drawio.png b/images/prototype_schema_v1.drawio.png deleted file mode 100644 index eadbf02..0000000 Binary files a/images/prototype_schema_v1.drawio.png and /dev/null differ diff --git a/images/remove_command.png b/images/remove_command.png deleted file mode 100644 index bd6aced..0000000 Binary files a/images/remove_command.png and /dev/null differ diff --git a/images/rename_studio.png b/images/rename_studio.png deleted file mode 100644 index f6ca07d..0000000 Binary files a/images/rename_studio.png and /dev/null differ diff --git a/images/run_api.png b/images/run_api.png deleted file mode 100644 index d20cbd2..0000000 Binary files a/images/run_api.png and /dev/null differ diff --git a/images/run_ingest.png b/images/run_ingest.png deleted file mode 100644 index 6f27ca2..0000000 Binary files a/images/run_ingest.png and /dev/null differ diff --git a/images/select_L4.png b/images/select_L4.png deleted file mode 100644 index d1c6f88..0000000 Binary files a/images/select_L4.png and /dev/null differ diff --git a/images/snowflake-architecture.png b/images/snowflake-architecture.png deleted file mode 100644 index 4008ced..0000000 Binary files a/images/snowflake-architecture.png and /dev/null differ diff --git a/images/studio_code.png b/images/studio_code.png deleted file mode 100644 index 5bc2d68..0000000 Binary files a/images/studio_code.png and /dev/null differ diff --git a/images/wget_rtdocs.png b/images/wget_rtdocs.png deleted file mode 100644 index e3adbbe..0000000 Binary files a/images/wget_rtdocs.png and /dev/null differ diff --git a/src/Dockerfile b/src/Dockerfile deleted file mode 100644 index 871e1bf..0000000 --- a/src/Dockerfile +++ /dev/null @@ -1,44 +0,0 @@ -FROM node:20-alpine AS frontend-build -WORKDIR /app/frontend -COPY frontend . -RUN yarn install - -FROM nvidia/cuda:11.8.0-cudnn8-devel-ubuntu22.04 AS backend-build -ENV DEBIAN_FRONTEND=noninteractive -ENV PYTHONUNBUFFERED=1 -ENV PATH="/usr/local/bin:${PATH}" -RUN apt-get update && \ - apt-get install -y python3-pip python3-dev && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* -WORKDIR /app/core -COPY core/requirements.txt . -RUN pip3 install --no-cache-dir -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu118 - -FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 -ENV DEBIAN_FRONTEND=noninteractive -ENV PYTHONUNBUFFERED=1 -ENV PATH="/usr/local/bin:${PATH}" -ENV NODE_VERSION=20.x -RUN apt-get update && apt-get install -y \ - python3-pip \ - wget \ - curl \ - && curl -fsSL https://deb.nodesource.com/setup_${NODE_VERSION} | bash - \ - && apt-get install -y nodejs \ - && npm install -g yarn \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - -WORKDIR /app -COPY --from=backend-build /usr/local/lib/python3.10/dist-packages /usr/local/lib/python3.10/dist-packages -COPY core ./core -COPY --from=frontend-build /app/frontend ./frontend -COPY frontend/package.json frontend/yarn.lock ./frontend/ -WORKDIR /app/frontend -RUN yarn install --production -WORKDIR /app -COPY entrypoint.sh . -RUN chmod +x entrypoint.sh -EXPOSE 3000 8080 -ENTRYPOINT ["./entrypoint.sh"] \ No newline at end of file diff --git a/src/Readme.md b/src/Readme.md deleted file mode 100644 index 12216fd..0000000 --- a/src/Readme.md +++ /dev/null @@ -1,30 +0,0 @@ -```bash -docker build -t aifaq . -``` -Now run this image from this command -```bash -docker run --gpus all -p 3000:3000 -p 8080:8080 aifaq -``` - -### To check the frontend running on the lightining ai studio. -1. Click on this add icon. - -![alt text](image-3.png) - -2. Install the web port from here . - -![alt text](image.png) - -3. Now click on this icon. - -![alt text](image-1.png) - -4. Now update the port 3000 in here. - -![alt text](image-2.png) - -### The Backend can be checked using this curl request on the new terminal by this curl request. - -```console -curl --header "Content-Type: application/json" --request POST --data '{"text": "How to install Hyperledger fabric?"}' http://127.0.0.1:8080/query -``` \ No newline at end of file diff --git a/src/core/.gitignore b/src/core/.gitignore deleted file mode 100644 index 82f9275..0000000 --- a/src/core/.gitignore +++ /dev/null @@ -1,162 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/latest/usage/project/#working-with-version-control -.pdm.toml -.pdm-python -.pdm-build/ - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ diff --git a/src/core/README.md b/src/core/README.md deleted file mode 100644 index 84dc99a..0000000 --- a/src/core/README.md +++ /dev/null @@ -1,138 +0,0 @@ -# Hyperledger Labs AIFAQ prototype - -The scope of this Hyperledger Labs project is to support the users (users, developer, etc.) to their work, avoiding to wade through oceans of documents to find information they are looking for. We are implementing an open source conversational AI tool which replies to the questions related to specific context. This is a prototype which allows to create a chatbot running a RESTful API which requires GPU. Here the official Wiki pages: [Hyperledger Labs aifaq](https://labs.hyperledger.org/labs/aifaq.html) and [Hyperledger Labs wiki](https://wiki.hyperledger.org/display/labs/AI+FAQ). Please, read also the [Antitrust Policy and the Code of Conduct](https://wiki.hyperledger.org/pages/viewpage.action?pageId=41587043). Every Monday we have a public meeting and the invitation is on the Hyperledger Labs calendar: [[Hyperledger Labs] FAQ AI Lab calls](https://wiki.hyperledger.org/display/HYP/Calendar+of+Public+Meetings). - -## Background - -The system is an open source python project which implements an AI chatbot that replies to HTTP requests. The idea is to implement an open source framework/template, as example, for other communities/organizations/companies. Last results in open LLMs allow to have good performance using common HW resources.\ -Below the application architecture: - -![LLM chatbot schema]LLM chatbot schema - -We use RAG (Retrieval Augmented Generation [arxiv.org](https://arxiv.org/abs/2312.10997)) for question answering use case. That technique aims to improve LLM answers by incorporating knowledge from external database (e.g. vector database). - -The image depicts two workflow: - -1. The data ingestion workflow -2. The chat workflow - -During the ingestion phase, the system loads context documents and creates a vector database. For example, the document sources can be: - -- An online software guide (readthedocs template) -- The GitHub issues and pull requests - -In our case, they are the readthedocs guide and a wiki page.\ -After the first phase, the system is ready to reply to user questions. - -Currently, we use the open source [HuggingFace Zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta), and in the future we want to investigate other open source models.\ -The user can query the system using HTTP requests, but we want to supply UI samples, as external module. - -## Open Source Version - -The software is under Apache 2.0 License (please check **LICENSE** and **NOTICE** files included). We use some 3rd party libraries: here is the [ASF 3rd Party License Policy](https://www.apache.org/legal/resolved.html) and here is the information for ([Assembling LICENSE and NOTICE files](https://infra.apache.org/licensing-howto.html#mod-notice)). - -## Installation - -**This document does not contain commercial advertisement: all the tools/products/books/materials are generic and you have to consider those as examples!**\ -This software needs GPU for the execution: if you do not have a local GPU you could use a Cloud GPU. There are several solutions to use Cloud GPU: - -1. Cloud Provider (AWS, GCP, ...) -2. On-Demand GPU Cloud (vast.ai, RunPod, ...) -3. Cloud GPU IDE - -Currently, I use a Cloud GPU IDE ([Lightning Studio](https://lightning.ai/studios)), after signup/login, create new Studio (project): - -![New Studio Button](/images/new_studio.png) - -select the left solution: - -![Select Studio Code](/images/studio_code.png) - -click on the **Start** button, and rename the new Studio: - -![Rename Studio](/images/rename_studio.png) - -Then, and copy-paste the github api repo code: - -![Copy Paste Code](/images/copy_paste_code.png) - - -That version works with Hyperledger fabric documents (Wiki and ReadTheDocs). - -You can add your wiki links and ReadTheDocs link in the config.yaml file like this - -![alt text](image.png) - -## Usage - -Open a new terminal: - -![Open Terminal](/images/open_terminal.png) - -and download the documentation executing the command below: -1. Clone the Repository -2. Now use these commands to go to the core directory -```bash -cd aifaq/src/core -``` -3. Now run this file -```console -python fetch_and_organize_data.py -``` - -### Install requirements - -Move to the parent folder and execute the command below: - -```console -pip install -r requirements.txt -``` - -### Activate GPU - -After the requirements installation we can switch to GPU before to execute the ingestion script: - -![Activate GPU](/images/activate_gpu.png) - -then select the L4 solution: - -![Select L4](/images/select_L4.png) - -and confirm (it takes some minutes). - -### Ingest step - -Run the ingest.py script: - -```console -python ingest.py -``` - -it will create content in chromadb folder. - -### Run API - -Now, we can run the API and test it. So, run api.py script: - -![Run API](/images/run_api.png) - -and test it: - -```console -curl --header "Content-Type: application/json" --request POST --data '{"text": "How to install Hyperledger fabric?"}' http://127.0.0.1:8080/query -``` - -below the result: - -![Show results](/images/curl_results.png) - -## Current version notes - -That is a proof-of-concept: a list of future improvement below: - -1. This is the first version of the prototype and it will be installed on a GPU Cloud Server -2. At the same time, we'd like to pass to the next step: the Hyperledger Incubation Stage -3. We will investigate other open source models -4. Evaluation of the system using standard metrics -5. We would like to improve the system, some ideas are: fine-tuning, Advanced RAG, Decomposed LoRA -6. Add "guardrails" which are a specific ways of controlling the output of a LLM, such as talking avoid specific topics, responding in a particular way to specific user requests, etc. diff --git a/src/core/api.py b/src/core/api.py deleted file mode 100644 index cda967e..0000000 --- a/src/core/api.py +++ /dev/null @@ -1,32 +0,0 @@ -import os -import uvicorn -from utils import load_yaml_file -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware - -from routes.main import router as main_router -from routes.test import router as test_router - -config_data = load_yaml_file("config.yaml") - - -def create_app() -> FastAPI: - # Create the FastAPI application - app = FastAPI() - - # Enable CORS - app.add_middleware( - CORSMiddleware, - allow_origins=["*"], # Allows all origins - allow_credentials=True, - allow_methods=["GET", "POST", "OPTIONS"], - allow_headers=["*"], - ) - - app.include_router(main_router) - app.include_router(test_router) - - return app - - -uvicorn.run(create_app, host=config_data["host"], port=config_data["port"]) diff --git a/src/core/config.yaml b/src/core/config.yaml deleted file mode 100644 index 0cdfb65..0000000 --- a/src/core/config.yaml +++ /dev/null @@ -1,10 +0,0 @@ -model_name: "HuggingFaceH4/zephyr-7b-beta" -embedding_model_name: "sentence-transformers/all-mpnet-base-v2" -folder_path: "rtdocs" -url: "https://wiki.hyperledger.org/display/fabric/" -persist_directory: "chromadb" -host: "0.0.0.0" -port: 8080 -doclinks: - - "https://hyperledger-fabric.readthedocs.io/en/release-2.5/" - - "https://gtts.readthedocs.io/en/latest/" \ No newline at end of file diff --git a/src/core/conversation.py b/src/core/conversation.py deleted file mode 100644 index d0767de..0000000 --- a/src/core/conversation.py +++ /dev/null @@ -1,78 +0,0 @@ -import torch -from transformers import AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer -from threading import Thread -from langchain.vectorstores import Chroma -from langchain.embeddings import HuggingFaceEmbeddings -from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder -from model import load_quantized_model -from utils import load_yaml_file -from session_history import get_session_history - - -def initialize_models(): - config_data = load_yaml_file("config.yaml") - tokenizer = AutoTokenizer.from_pretrained(config_data["model_name"]) - model = load_quantized_model(config_data["model_name"]) - if tokenizer.pad_token_id is None: - tokenizer.pad_token_id = tokenizer.eos_token_id - embeddings = HuggingFaceEmbeddings(model_name=config_data["embedding_model_name"]) - vectordb = Chroma( - embedding_function=embeddings, - persist_directory=config_data["persist_directory"], - ) - return model, tokenizer, vectordb - - -def retrieve_relevant_context(query, vectordb, top_k=3): - results = vectordb.similarity_search(query, k=top_k) - return "\n".join([doc.page_content for doc in results]) - - -# def contextualize_question(query, conversation_history): - -# contextualize_q_prompt = ChatPromptTemplate.from_messages( -# [ -# MessagesPlaceholder("chat_history"), -# ("human", "{input}"), -# ] -# ) -# contextualized_query = contextualize_q_prompt.format( -# chat_history=conversation_history, input=query -# ) -# return contextualized_query - - -def generate_response(session_id, model, tokenizer, query, vectordb): - conversation_history = get_session_history(session_id) - contextualized_query = query - - context = retrieve_relevant_context(contextualized_query, vectordb) - - qa_system_prompt = """You are a concise assistant for question-answering tasks. \ - Use the following pieces of retrieved context to answer the question. \ - If you don't know the answer, just say that you don't know. \ - Provide a very concise answer in no more than three short sentences.""" - - full_prompt = f"{qa_system_prompt}\n\nContext: {context}\n\nQuestion: {contextualized_query}\n\nAnswer:" - - inputs = tokenizer(full_prompt, return_tensors="pt", padding=True).to(model.device) - streamer = TextIteratorStreamer( - tokenizer, skip_prompt=True, skip_special_tokens=True - ) - - generation_kwargs = dict( - inputs, streamer=streamer, max_new_tokens=1000, do_sample=True, temperature=0.7 - ) - - thread = Thread(target=model.generate, kwargs=generation_kwargs) - thread.start() - - response = "" - for token in streamer: - # yield token - response += token - print(token) - print(response) - conversation_history.add_user_message(query) - conversation_history.add_ai_message(response) - return response diff --git a/src/core/embeddings.py b/src/core/embeddings.py deleted file mode 100644 index c03cb8e..0000000 --- a/src/core/embeddings.py +++ /dev/null @@ -1,19 +0,0 @@ -import torch -from utils import load_yaml_file -from langchain_huggingface import HuggingFaceEmbeddings - - -def embedding_function(): - config_data = load_yaml_file("config.yaml") - - # check if GPU is available, else use CPU - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - - model_name = config_data["embedding_model_name"] - model_kwargs = {"device": device} - encode_kwargs = {"normalize_embeddings": False} - embeddings = HuggingFaceEmbeddings( - model_name=model_name, model_kwargs=model_kwargs, encode_kwargs=encode_kwargs - ) - - return embeddings diff --git a/src/core/fetch_and_organize_data.py b/src/core/fetch_and_organize_data.py deleted file mode 100644 index bb4b2b4..0000000 --- a/src/core/fetch_and_organize_data.py +++ /dev/null @@ -1,113 +0,0 @@ -import os -import subprocess -import shutil -from urllib.parse import urlparse -from utils import load_yaml_file - - -def download_content(urls, folder_path): - """Downloads content from a list of URLs using wget.""" - for url in urls: - parsed_url = urlparse(url) - base_path = parsed_url.path.strip("/").replace("/", "_") - download_path = os.path.join(folder_path, base_path) - wget_command = [ - "wget", - "-r", - "-np", - "-k", - "-p", - "--no-check-certificate", - "--recursive", - "--level=inf", - "--accept=html", - "-P", - download_path, - url, - ] - print(f"Downloading content from {url}...") - try: - result = subprocess.run( - wget_command, check=False, capture_output=True, text=True - ) - print(result.stdout) - print(result.stderr) - except Exception as e: - print(f"An error occurred while running wget for {url}: {e}") - - -def count_downloaded_files(base_path): - """Counts the number of files downloaded in the base path.""" - try: - count = sum([len(files) for r, d, files in os.walk(base_path)]) - print(f"Number of files downloaded: {count}") - except Exception as e: - print(f"An error occurred while counting files in {base_path}: {e}") - - -def reorganize_files(src_path, dst_path): - """Moves files from the source directory to the destination directory and removes empty directories.""" - print(f"Checking source path: {src_path}") - if not os.path.exists(src_path): - print(f"Error: The source directory {src_path} does not exist.") - return False - print("Moving files...") - try: - for root, _, files in os.walk(src_path): - for file in files: - s = os.path.join(root, file) - base, ext = os.path.splitext(file) - counter = 1 - d = os.path.join(dst_path, file) - while os.path.exists(d): - d = os.path.join(dst_path, f"{base}_{counter}{ext}") - counter += 1 - - print(f"Moving {s} to {d}") - shutil.move(s, d) - print("Removing empty directory structure...") - shutil.rmtree(src_path) - return True - except Exception as e: - print(f"An error occurred while moving files: {e}") - return False - - -def count_total_files(folder_path): - """Counts the total number of files in the specified folder.""" - try: - count = sum([len(files) for r, d, files in os.walk(folder_path)]) - print(f"Total number of files in {folder_path}: {count}") - except Exception as e: - print(f"An error occurred while counting total files in {folder_path}: {e}") - - -def main(): - config = load_yaml_file("config.yaml") - urls = config.get("doclinks", []) - folder_path = config.get("folder_path", "rtdocs") - if urls: - for url in urls: - try: - parsed_url = urlparse(url) - base_path = parsed_url.path.strip("/").replace("/", "_") - download_path = os.path.join(folder_path, base_path) - download_content([url], folder_path) - count_downloaded_files(download_path) - if reorganize_files(download_path, folder_path): - print( - f"Success: Content from {url} downloaded and reorganized successfully." - ) - else: - print( - f"Download completed for {url}, but file reorganization failed." - ) - except Exception as e: - print(f"An error occurred while processing {url}: {e}") - count_total_files(folder_path) - else: - print("No URLs found in config.yaml.") - - -if __name__ == "__main__": - main() diff --git a/src/core/image.png b/src/core/image.png deleted file mode 100644 index 2f9eb52..0000000 Binary files a/src/core/image.png and /dev/null differ diff --git a/src/core/ingest.py b/src/core/ingest.py deleted file mode 100644 index 8b74865..0000000 --- a/src/core/ingest.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -import torch -from utils import load_yaml_file -from langchain_community.document_loaders.recursive_url_loader import RecursiveUrlLoader -from langchain_community.document_loaders import ReadTheDocsLoader -from langchain_community.document_loaders.merge import MergedDataLoader -from langchain.text_splitter import RecursiveCharacterTextSplitter -from langchain.vectorstores import Chroma -from embeddings import embedding_function -from langchain_community.vectorstores.utils import filter_complex_metadata - -config_data = load_yaml_file("config.yaml") - -persist_directory = config_data["persist_directory"] -if not os.path.exists(persist_directory): - os.makedirs(persist_directory) -loader_web = RecursiveUrlLoader(url=config_data["url"]) - -loader_rtdocs = ReadTheDocsLoader(config_data["folder_path"], encoding="utf-8") - -loader = MergedDataLoader(loaders=[loader_web, loader_rtdocs]) - -embeddings = embedding_function() - -docs = loader.load() - -text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) -splits = text_splitter.split_documents(docs) - -print(f"Number of chunks created: {len(splits)}") -vectorstore = Chroma.from_documents( - filter_complex_metadata(splits), embeddings, persist_directory=persist_directory -) -# vectorstore = Chroma.from_documents( -# documents=splits, embedding=embeddings, persist_directory=persist_directory -# ) -vectorstore.persist() - -print("Vectorstore creation and persistence completed.") diff --git a/src/core/model.py b/src/core/model.py deleted file mode 100644 index 70713eb..0000000 --- a/src/core/model.py +++ /dev/null @@ -1,21 +0,0 @@ -import torch -from transformers import BitsAndBytesConfig, AutoModelForCausalLM - - -# function for loading 4-bit quantized model -def load_quantized_model(model_name: str): - """ - :param model_name: Name or path of the model to be loaded. - :return: Loaded quantized model. - """ - bnb_config = BitsAndBytesConfig( - load_in_4bit=True, - bnb_4bit_use_double_quant=True, - bnb_4bit_quant_type="nf4", - bnb_4bit_compute_dtype=torch.bfloat16, - ) - - model = AutoModelForCausalLM.from_pretrained( - model_name, torch_dtype=torch.bfloat16, quantization_config=bnb_config - ) - return model diff --git a/src/core/requirements.txt b/src/core/requirements.txt deleted file mode 100644 index 76a41e5..0000000 --- a/src/core/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -langchain -langchain-community -langchain-huggingface -sentence-transformers -chromadb -bitsandbytes -accelerate -uvicorn -black -sse-starlette -langchain -uuid \ No newline at end of file diff --git a/src/core/routes/main.py b/src/core/routes/main.py deleted file mode 100644 index 25e51da..0000000 --- a/src/core/routes/main.py +++ /dev/null @@ -1,40 +0,0 @@ -from fastapi import APIRouter, HTTPException -from pydantic import BaseModel -import uuid -from conversation import initialize_models, generate_response - -model, tokenizer, vectordb = initialize_models() - -router = APIRouter() - - -class ResponseMessage(BaseModel): - content: str - type: int - id: str - - -class RequestQuery(BaseModel): - id: str - content: str - - -class ResponseQuery(BaseModel): - id: str - message: ResponseMessage - - -@router.post("/query", response_model=ResponseQuery) -async def answer_query(item: RequestQuery) -> ResponseQuery: - try: - response = generate_response("1", model, tokenizer, item.content, vectordb) - return ResponseQuery( - id=item.id, - message=ResponseMessage( - content=response, - type=1, - id=str(uuid.uuid4()), - ), - ) - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) diff --git a/src/core/routes/test.py b/src/core/routes/test.py deleted file mode 100644 index de5cd01..0000000 --- a/src/core/routes/test.py +++ /dev/null @@ -1,62 +0,0 @@ -from typing import List -from fastapi import APIRouter, HTTPException -from pydantic import BaseModel -import uuid - -router = APIRouter(prefix="/api/test") - - -class ResponseMessage(BaseModel): - id: str - content: str - type: int - - -class ResponseConversation(BaseModel): - id: str - message: ResponseMessage - - -class RequestConversation(BaseModel): - id: str - content: str - type: int - - -responses = { - "What is Hyperledger Fabric?": "Hyperledger Fabric is an open-source blockchain framework designed for enterprise solutions. It allows for a modular architecture where different components like consensus mechanisms, membership services, and ledger storage can be tailored to specific needs.", - "How to install Hyperledger Fabric?": "To install Hyperledger Fabric, follow these steps:\n1. Install Docker and Docker Compose.\n2. Download the Hyperledger Fabric binaries and docker images using the Fabric CA and Fabric binaries script.\n3. Set up the environment variables for Fabric binaries.\n4. Verify the installation by running Fabric sample network scripts.", - "How to deploy a Hyperledger Fabric network?": "To deploy a Hyperledger Fabric network:\n1. Define the network topology and configuration files (e.g., 'configtx.yaml').\n2. Use the 'fabric-cli' or scripts to create channel artifacts.\n3. Launch the network by starting the necessary Docker containers and services using 'docker-compose' or Kubernetes.\n4. Instantiate and upgrade chaincode as needed.", - "How to run a Hyperledger Fabric network?": "To run a Hyperledger Fabric network:\n1. Start the network by running 'docker-compose up' or the appropriate command for your setup.\n2. Use the Fabric CLI tools or SDKs to interact with the network, including creating and joining channels, and submitting transactions.\n3. Monitor the network's health and performance using Fabric's built-in tools or external monitoring solutions.", - "How to ensure data privacy in Hyperledger Fabric?": "To ensure data privacy in Hyperledger Fabric:\n1. Use private data collections to restrict access to sensitive data.\n2. Implement access control policies and endorsement policies.\n3. Utilize encryption for data at rest and in transit.\n4. Regularly review and update security configurations and practices.", -} - - -def get_hyperledger_fabric_answer(question): - return responses.get(question, "Question not found in the database.") - - -# TODO: Get all chats for a user in a paginated format -@router.post("/conversations") -def get_conversations( - offset: int = 0, limit: int = 30, order: str = "updated" -) -> ResponseConversation: - pass - - -# TODO: Get a single chat for a user -@router.post("/conversation/{id}") -def post_conversation(id: str): - pass - - -@router.post("/conversation", response_model=ResponseConversation) -def post_conversation(item: RequestConversation) -> ResponseConversation: - return ResponseConversation( - id=item.id, - message=ResponseMessage( - content=get_hyperledger_fabric_answer(item.content), - type=1, - id=str(uuid.uuid4()), - ), - ) diff --git a/src/core/scripts/format.sh b/src/core/scripts/format.sh deleted file mode 100644 index aa4ad2b..0000000 --- a/src/core/scripts/format.sh +++ /dev/null @@ -1 +0,0 @@ -black . --exclude \".venv/|/venv/\" \ No newline at end of file diff --git a/src/core/session_history.py b/src/core/session_history.py deleted file mode 100644 index bf5429e..0000000 --- a/src/core/session_history.py +++ /dev/null @@ -1,10 +0,0 @@ -from langchain_community.chat_message_histories import ChatMessageHistory -from langchain_core.chat_history import BaseChatMessageHistory - -store = {} - - -def get_session_history(session_id: str) -> BaseChatMessageHistory: - if session_id not in store: - store[session_id] = ChatMessageHistory() - return store[session_id] diff --git a/src/core/tokenizer.py b/src/core/tokenizer.py deleted file mode 100644 index 3d7cb59..0000000 --- a/src/core/tokenizer.py +++ /dev/null @@ -1,14 +0,0 @@ -from transformers import AutoTokenizer - - -# function for initializing tokenizer -def initialize_tokenizer(model_name: str): - """ - Initialize the tokenizer with the specified model_name. - - :param model_name: Name or path of the model for tokenizer initialization. - :return: Initialized tokenizer. - """ - tokenizer = AutoTokenizer.from_pretrained(model_name) - tokenizer.bos_token_id = 1 # Set beginning of sentence token id - return tokenizer diff --git a/src/core/utils.py b/src/core/utils.py deleted file mode 100644 index 230d12a..0000000 --- a/src/core/utils.py +++ /dev/null @@ -1,10 +0,0 @@ -import os -import yaml - - -def load_yaml_file(file_name): - base_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(base_path, file_name) - - with open(file_path, "r") as f: - return yaml.safe_load(f) diff --git a/src/entrypoint.sh b/src/entrypoint.sh deleted file mode 100644 index 390a127..0000000 --- a/src/entrypoint.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -cd /app/core -python3 fetch_and_organize_data.py -python3 api.py & - -cd /app/frontend -yarn dev \ No newline at end of file diff --git a/src/frontend/.dockerignore b/src/frontend/.dockerignore deleted file mode 100644 index 0749103..0000000 --- a/src/frontend/.dockerignore +++ /dev/null @@ -1,10 +0,0 @@ -node_modules -.git -.gitignore -.env.example -.env -Dockerfile -.dockerignore -npm-debug.log -README.md -.next \ No newline at end of file diff --git a/src/frontend/.eslintignore b/src/frontend/.eslintignore deleted file mode 100644 index 1f2e200..0000000 --- a/src/frontend/.eslintignore +++ /dev/null @@ -1,12 +0,0 @@ -.DS_Store -node_modules -/build -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock \ No newline at end of file diff --git a/src/frontend/.eslintrc.json b/src/frontend/.eslintrc.json deleted file mode 100644 index bffb357..0000000 --- a/src/frontend/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/src/frontend/.gitignore b/src/frontend/.gitignore deleted file mode 100644 index fd3dbb5..0000000 --- a/src/frontend/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/src/frontend/.prettierignore b/src/frontend/.prettierignore deleted file mode 100644 index a3eb5c2..0000000 --- a/src/frontend/.prettierignore +++ /dev/null @@ -1,40 +0,0 @@ -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock - -# copy of .gitnore -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/src/frontend/.prettierrc b/src/frontend/.prettierrc deleted file mode 100644 index 445aef6..0000000 --- a/src/frontend/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 50 -} \ No newline at end of file diff --git a/src/frontend/Dockerfile b/src/frontend/Dockerfile deleted file mode 100644 index b769448..0000000 --- a/src/frontend/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM node:20-alpine - -WORKDIR /app - -COPY package.json yarn.lock ./ - -COPY tsconfig*.json ./ - -RUN yarn install - -COPY . . - -EXPOSE 3000 - -ENTRYPOINT ["sh", "-c", "yarn build && yarn start"] \ No newline at end of file diff --git a/src/frontend/README.md b/src/frontend/README.md deleted file mode 100644 index 705abcf..0000000 --- a/src/frontend/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Hyperledger AIFAQ - -## Getting Started - -First, run the development server: - -```bash -yarn dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - - - ## Docker Installation Guide - - This guide provides instructions for setting up and running a Next.js application using Docker. There are two Docker configurations provided: one for development (Dockerfile.dev) and one for production (Dockerfile). - -### Prerequisites - -Before you begin, ensure you have the following installed on your system: - -- Docker -- Docker Compose (optional but recommended) - -**Production Setup** - -To set up and run the Next.js application in a production environment, follow these steps: - -1. Build the Docker Image - -Run the following command to build the Docker image for production: -``` -docker build -t aifaq-next:prod . -``` -2. Run the Docker Container -Run the following command to start the Docker container in production mode: - -``` -docker run -p 3000:3000 --rm aifaq-next:prod -``` -You should now be able to access your Next.js application in production mode at http://localhost:3000. diff --git a/src/frontend/app/favicon.ico b/src/frontend/app/favicon.ico deleted file mode 100644 index f27b970..0000000 Binary files a/src/frontend/app/favicon.ico and /dev/null differ diff --git a/src/frontend/app/globals.css b/src/frontend/app/globals.css deleted file mode 100644 index 00f62bf..0000000 --- a/src/frontend/app/globals.css +++ /dev/null @@ -1,77 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --background: 0 0% 100%; - --foreground: 222.2 84% 4.9%; - - --card: 0 0% 100%; - --card-foreground: 222.2 84% 4.9%; - - --popover: 0 0% 100%; - --popover-foreground: 222.2 84% 4.9%; - - --primary: 222.2 47.4% 11.2%; - --primary-foreground: 210 40% 98%; - - --secondary: 210 40% 96.1%; - --secondary-foreground: 222.2 47.4% 11.2%; - - --muted: 210 40% 96.1%; - --muted-foreground: 215.4 16.3% 46.9%; - - --accent: 210 40% 96.1%; - --accent-foreground: 222.2 47.4% 11.2%; - - --destructive: 0 84.2% 60.2%; - --destructive-foreground: 210 40% 98%; - - --border: 214.3 31.8% 91.4%; - --input: 214.3 31.8% 91.4%; - --ring: 222.2 84% 4.9%; - - --radius: 0.5rem; - } - - .dark { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - - --primary: 210 40% 98%; - --primary-foreground: 222.2 47.4% 11.2%; - - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - - --accent: 217.2 32.6% 17.5%; - --accent-foreground: 210 40% 98%; - - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 212.7 26.8% 83.9%; - } -} - -@layer base { - * { - @apply border-border; - } - - body { - @apply bg-background text-foreground; - } -} \ No newline at end of file diff --git a/src/frontend/app/layout.tsx b/src/frontend/app/layout.tsx deleted file mode 100644 index 70223e0..0000000 --- a/src/frontend/app/layout.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import type { Metadata } from 'next'; -import { - Inter, - Space_Grotesk -} from 'next/font/google'; -import './globals.css'; -import { cn } from '@/lib/utils'; -import Providers from '@/components/providers'; - -const fontPrimary = Space_Grotesk({ - subsets: ['latin'], - variable: '--font-primary' -}); - -const fontSecondary = Inter({ - subsets: ['latin'], - variable: '--font-secondary' -}); - -export const metadata: Metadata = { - title: 'AIFAQ', - description: '' -}; - -export default function RootLayout({ - children -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - -
- {children} -
- - - ); -} diff --git a/src/frontend/app/page.tsx b/src/frontend/app/page.tsx deleted file mode 100644 index 7808eed..0000000 --- a/src/frontend/app/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import Sidebar from '@/components/sidebar'; -import ChatPage from '@/components/chat-page'; - -export default function Home() { - return ( -
- - -
- ); -} diff --git a/src/frontend/components.json b/src/frontend/components.json deleted file mode 100644 index 15f2b02..0000000 --- a/src/frontend/components.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://ui.shadcn.com/schema.json", - "style": "default", - "rsc": true, - "tsx": true, - "tailwind": { - "config": "tailwind.config.ts", - "css": "app/globals.css", - "baseColor": "slate", - "cssVariables": true, - "prefix": "" - }, - "aliases": { - "components": "@/components", - "utils": "@/lib/utils" - } -} \ No newline at end of file diff --git a/src/frontend/components/attach-dropdown.tsx b/src/frontend/components/attach-dropdown.tsx deleted file mode 100644 index f46dbb6..0000000 --- a/src/frontend/components/attach-dropdown.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; - -type Props = {}; - -const AttachDropdown = (props: Props) => { - return
AttachDropdown
; -}; - -export default AttachDropdown; diff --git a/src/frontend/components/chat-bottom-bar.tsx b/src/frontend/components/chat-bottom-bar.tsx deleted file mode 100644 index d944fd5..0000000 --- a/src/frontend/components/chat-bottom-bar.tsx +++ /dev/null @@ -1,143 +0,0 @@ -'use client'; - -import React, { - useEffect, - useState -} from 'react'; -import { Button } from './ui/button'; -import { ArrowUp, Paperclip } from 'lucide-react'; -import TextareaAutosize from 'react-textarea-autosize'; -import { useWindowSize } from '@/hooks/useWindowSize'; -import { Message } from '@/lib/types'; -import { v4 as uuidv4 } from 'uuid'; -import { handleSend } from '@/lib/apis/fetcher'; - -interface Props { - onSend: (newMessage: Message) => void; -} - -const ChatBottomBar = ({ onSend }: Props) => { - const [isMounted, setIsMounted] = - useState(false); - const [message, setMessage] = useState( - { - content: '', - type: 0, - id: '-1' - } - ); - const [buttonClass, setButtonClass] = useState( - 'rounded-full flex-shrink-0 transition-opacity duration-200 opacity-50' - ); - const { isMobile } = useWindowSize(); - - useEffect(() => { - setIsMounted(true); - }, [isMounted]); - - useEffect(() => { - setButtonClass( - `rounded-full flex-shrink-0 transition-opacity duration-200 ${ - message.content.trim() - ? 'opacity-100' - : 'opacity-50' - }` - ); - }, [message.content]); - - if (!isMounted) { - return null; - } - - const handleChange = ( - e: React.ChangeEvent - ) => { - setMessage({ - ...message, - content: e.target.value - }); - }; - - const handleSubmit = ( - e?: React.FormEvent | React.KeyboardEvent - ) => { - if (e) { - e.preventDefault(); - if ('key' in e && e.key !== 'Enter') { - return; - } - } - - if (message.content.trim()) { - const updatedMessage = { - ...message, - id: uuidv4() - }; - - handleSend(updatedMessage) - .then((value) => { - if (value !== undefined) { - onSend(updatedMessage); - onSend(value.message); - } - }) - .catch() - .finally(() => - setMessage({ - ...message, - content: '' - }) - ); - } - }; - - return ( -
-
- - { - if ( - e.key === 'Enter' && - !e.shiftKey - ) { - handleSubmit(e); - } - }} - /> - - -
- AIFAQ can make mistakes. Check important - information. -
-
- ); -}; - -export default ChatBottomBar; diff --git a/src/frontend/components/chat-header.tsx b/src/frontend/components/chat-header.tsx deleted file mode 100644 index 4e9126e..0000000 --- a/src/frontend/components/chat-header.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from 'react'; -import UserDropdown from './user-dropdown'; - -type Props = {}; - -const ChatHeader = (props: Props) => { - return ( -
- - AIFAQ - - -
- ); -}; - -export default ChatHeader; diff --git a/src/frontend/components/chat-page.tsx b/src/frontend/components/chat-page.tsx deleted file mode 100644 index bdbfe7b..0000000 --- a/src/frontend/components/chat-page.tsx +++ /dev/null @@ -1,36 +0,0 @@ -'use client'; - -import React, { useState } from 'react'; -import ChatHeader from './chat-header'; -import { Message } from '@/lib/types'; -import ChatBottomBar from './chat-bottom-bar'; -import ChatSection from './chat-section'; - -type Props = {}; - -const ChatPage = (props: Props) => { - const [messages, setMessages] = useState< - Message[] - >([]); - - const updateMessages = ( - newMessage: Message - ) => { - setMessages((prevMessages) => [ - ...prevMessages, - newMessage - ]); - }; - - return ( -
- -
- -
- -
- ); -}; - -export default ChatPage; diff --git a/src/frontend/components/chat-request.tsx b/src/frontend/components/chat-request.tsx deleted file mode 100644 index bdb8c98..0000000 --- a/src/frontend/components/chat-request.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react'; - -interface Props { - request: string; -} - -const ChatRequest = ({ request }: Props) => { - return ( -
-
-
-

{request}

-
-
-
- ); -}; - -export default ChatRequest; diff --git a/src/frontend/components/chat-response-options.tsx b/src/frontend/components/chat-response-options.tsx deleted file mode 100644 index 1cdd31e..0000000 --- a/src/frontend/components/chat-response-options.tsx +++ /dev/null @@ -1,86 +0,0 @@ -'use client'; -import React from 'react'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger -} from './ui/dropdown-menu'; -import { - ThumbsUp, - ThumbsDown, - Share2, - EllipsisVertical, - Copy, - Flag -} from 'lucide-react'; -import { Button } from './ui/button'; -import { ResponsiveDialog } from './responsive-dialog'; - -type Props = { - text: string; -}; - -const ChatResponseOptions = ({ text }: Props) => { - return ( -
- - - - - - } - > -
Share this post
-
- - - - - - - navigator.clipboard.writeText(text) - } - > - - Copy - - - - Report - - - -
- ); -}; - -export default ChatResponseOptions; diff --git a/src/frontend/components/chat-response.tsx b/src/frontend/components/chat-response.tsx deleted file mode 100644 index 9ea902d..0000000 --- a/src/frontend/components/chat-response.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; -import { IconHyperledger } from './icons/IconHyperledger'; -import ChatResponseOptions from './chat-response-options'; - -interface Props { - response: string; -} - -const ChatResponse = ({ response }: Props) => ( -
-
- -
- -
-
-

{response}

-
-
- -
-
-
-); - -export default ChatResponse; diff --git a/src/frontend/components/chat-section.tsx b/src/frontend/components/chat-section.tsx deleted file mode 100644 index 14f142f..0000000 --- a/src/frontend/components/chat-section.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React, { useRef, useEffect } from 'react'; -import { Message } from '@/lib/types'; -import ChatRequest from './chat-request'; -import ChatResponse from './chat-response'; - -interface ChatSectionProps { - messages: Message[]; -} - -const ChatSection: React.FC = ({ - messages -}) => { - const chatContainerRef = - useRef(null); - - useEffect(() => { - if (chatContainerRef.current) { - chatContainerRef.current.scrollTop = - chatContainerRef.current.scrollHeight; - } - }, [messages]); - - return ( -
-
- {messages.map((message, index) => ( -
- {message.type === 0 ? ( - - ) : ( - - )} -
- ))} -
-
- ); -}; - -export default ChatSection; diff --git a/src/frontend/components/history-data.ts b/src/frontend/components/history-data.ts deleted file mode 100644 index 8b0850a..0000000 --- a/src/frontend/components/history-data.ts +++ /dev/null @@ -1,22 +0,0 @@ -export const historyData = [ - { - id: 1, - title: 'What is hyperledger fabric' - }, - { - id: 2, - title: 'How to install hyperledger fabric' - }, - { - id: 3, - title: 'How to deploy hyperledger fabric' - }, - { - id: 4, - title: 'How to run hyperledger fabric' - }, - { - id: 5, - title: 'How to ensure data privacy' - } -]; diff --git a/src/frontend/components/icons/IconHyperledger.tsx b/src/frontend/components/icons/IconHyperledger.tsx deleted file mode 100644 index 40b4415..0000000 --- a/src/frontend/components/icons/IconHyperledger.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { cn } from '@/lib/utils'; -import { SVGProps } from 'react'; - -export const IconHyperledger = ( - props: SVGProps -) => { - return ( - - - - - - ); -}; diff --git a/src/frontend/components/menu-options.tsx b/src/frontend/components/menu-options.tsx deleted file mode 100644 index af4cf81..0000000 --- a/src/frontend/components/menu-options.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React from 'react'; -import { Button } from './ui/button'; -import { - FilePlus, - PanelLeft -} from 'lucide-react'; - -type Props = { - isOpen: boolean; - toggleSidebar: () => void; -}; - -const MenuOptions = (props: Props) => { - return ( -
- - -
- ); -}; - -export default MenuOptions; diff --git a/src/frontend/components/providers.tsx b/src/frontend/components/providers.tsx deleted file mode 100644 index 992cce8..0000000 --- a/src/frontend/components/providers.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ReactNode } from 'react'; -import { ThemeProvider as NextThemesProvider } from 'next-themes'; - -type Props = { - children: ReactNode; -}; - -const Providers = ({ children }: Props) => { - return ( - - {children} - - ); -}; - -export default Providers; diff --git a/src/frontend/components/responsive-dialog.tsx b/src/frontend/components/responsive-dialog.tsx deleted file mode 100644 index 4af6f13..0000000 --- a/src/frontend/components/responsive-dialog.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import * as React from 'react'; - -import { Button } from '@/components/ui/button'; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger -} from '@/components/ui/dialog'; -import { - Drawer, - DrawerClose, - DrawerContent, - DrawerDescription, - DrawerFooter, - DrawerHeader, - DrawerTitle, - DrawerTrigger -} from '@/components/ui/drawer'; -import { useWindowSize } from '@/hooks/useWindowSize'; - -export function ResponsiveDialog({ - children, - description, - trigger, - title -}: { - trigger: React.ReactNode; - title: string; - children: React.ReactNode; - description: string; -}) { - const [open, setOpen] = React.useState(false); - const { isDesktop } = useWindowSize(); - - if (isDesktop) { - return ( - - - {trigger} - - - - - {title} - - - {description} - - - {children} - - - ); - } - - return ( - - - {trigger} - - - - - {title} - - - {description} - - - {children} - - - - - - - - ); -} diff --git a/src/frontend/components/sidebar-history.tsx b/src/frontend/components/sidebar-history.tsx deleted file mode 100644 index 3604066..0000000 --- a/src/frontend/components/sidebar-history.tsx +++ /dev/null @@ -1,105 +0,0 @@ -'use client'; -import React, { - useEffect, - useState -} from 'react'; -import { - DropdownMenuCheckboxItemProps, - DropdownMenuItem -} from '@radix-ui/react-dropdown-menu'; -import { Button } from '@/components/ui/button'; -import { - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuSeparator, - DropdownMenuTrigger -} from '@/components/ui/dropdown-menu'; -import { - EllipsisVertical, - Pencil, - Pin, - Trash2 -} from 'lucide-react'; - -// Import the mock data -import { historyData as mockHistoryData } from './history-data'; - -type Props = {}; -type Checked = - DropdownMenuCheckboxItemProps['checked']; - -const SidebarHistory = (props: Props) => { - const [checkedItems, setCheckedItems] = - useState>({}); - const [historyData, setHistoryData] = useState< - { id: number; title: string }[] - >([]); - - useEffect(() => { - setHistoryData(mockHistoryData); - }, []); - - const handleCheckedChange = (id: number) => { - setCheckedItems((prevCheckedItems) => ({ - ...prevCheckedItems, - [id]: !prevCheckedItems[id] - })); - }; - - return ( -
- {historyData.map((item) => ( -
- - {item.title} - - - - - - - - handleCheckedChange(item.id) - } - > - Pin - - - - - - - -
- ))} -
- ); -}; - -export default SidebarHistory; diff --git a/src/frontend/components/sidebar.tsx b/src/frontend/components/sidebar.tsx deleted file mode 100644 index 1cf75ea..0000000 --- a/src/frontend/components/sidebar.tsx +++ /dev/null @@ -1,131 +0,0 @@ -'use client'; -import React, { - useEffect, - useState -} from 'react'; -import MenuOptions from './menu-options'; -import { useWindowSize } from '../hooks/useWindowSize'; -import { FilePlus, Menu } from 'lucide-react'; -import { - Sheet, - SheetClose, - SheetContent, - SheetDescription, - SheetFooter, - SheetHeader, - SheetTitle, - SheetTrigger -} from '@/components/ui/sheet'; -import SidebarHistory from './sidebar-history'; - -type Props = {}; - -const SHEET_SIDES = ['left'] as const; -type SheetSide = (typeof SHEET_SIDES)[number]; - -const Sidebar = (props: Props) => { - const [sidebarOpen, setSideBarOpen] = - useState(true); - const [showMenuIcon, setShowMenuIcon] = - useState(false); - const [isMounted, setIsMounted] = - useState(false); - const { isMobile } = useWindowSize({ - initializeWithValue: true - }); - - const handleViewSidebar = () => { - setSideBarOpen(!sidebarOpen); - }; - - useEffect(() => { - setIsMounted(true); - }, [isMounted]); - - useEffect(() => { - setSideBarOpen(!isMobile); - }, [isMobile]); - - useEffect(() => { - if (!sidebarOpen) { - const timer = setTimeout(() => { - setShowMenuIcon(true); - }, 300); - - return () => clearTimeout(timer); - } else { - setShowMenuIcon(false); - } - }, [sidebarOpen]); - - if (!isMounted) { - return null; - } - - return ( -
- {!sidebarOpen && showMenuIcon && ( - <> - - - )} - - {isMobile ? ( -
- {SHEET_SIDES.map((side) => ( - - - - - - -
- -
- -
-
-
- ))} -
- ) : ( - <> - - - )} -
- ); -}; - -export default Sidebar; diff --git a/src/frontend/components/ui/avatar.tsx b/src/frontend/components/ui/avatar.tsx deleted file mode 100644 index 76ce610..0000000 --- a/src/frontend/components/ui/avatar.tsx +++ /dev/null @@ -1,64 +0,0 @@ -'use client'; - -import * as React from 'react'; -import * as AvatarPrimitive from '@radix-ui/react-avatar'; - -import { cn } from '@/lib/utils'; - -const Avatar = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef< - typeof AvatarPrimitive.Root - > ->(({ className, ...props }, ref) => ( - -)); -Avatar.displayName = - AvatarPrimitive.Root.displayName; - -const AvatarImage = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef< - typeof AvatarPrimitive.Image - > ->(({ className, ...props }, ref) => ( - -)); -AvatarImage.displayName = - AvatarPrimitive.Image.displayName; - -const AvatarFallback = React.forwardRef< - React.ElementRef< - typeof AvatarPrimitive.Fallback - >, - React.ComponentPropsWithoutRef< - typeof AvatarPrimitive.Fallback - > ->(({ className, ...props }, ref) => ( - -)); -AvatarFallback.displayName = - AvatarPrimitive.Fallback.displayName; - -export { Avatar, AvatarImage, AvatarFallback }; diff --git a/src/frontend/components/ui/button.tsx b/src/frontend/components/ui/button.tsx deleted file mode 100644 index 50e9cb0..0000000 --- a/src/frontend/components/ui/button.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import * as React from 'react'; -import { Slot } from '@radix-ui/react-slot'; -import { - cva, - type VariantProps -} from 'class-variance-authority'; - -import { cn } from '@/lib/utils'; - -const buttonVariants = cva( - 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50', - { - variants: { - variant: { - default: - 'bg-primary text-primary-foreground hover:bg-primary/90', - destructive: - 'bg-destructive text-destructive-foreground hover:bg-destructive/90', - outline: - 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', - secondary: - 'bg-secondary text-secondary-foreground hover:bg-secondary/80', - ghost: - 'hover:bg-accent hover:text-accent-foreground', - link: 'text-primary underline-offset-4 hover:underline', - highlight: - 'text-muted-foreground hover:text-primary' - }, - size: { - default: 'h-9 px-4 py-2', - sm: 'h-8 rounded-md px-3', - lg: 'h-10 rounded-md px-8', - icon: 'h-8 w-8 p-1' - } - }, - defaultVariants: { - variant: 'default', - size: 'default' - } - } -); - -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; -} - -const Button = React.forwardRef< - HTMLButtonElement, - ButtonProps ->( - ( - { - className, - variant, - size, - asChild = false, - ...props - }, - ref - ) => { - const Comp = asChild ? Slot : 'button'; - return ( - - ); - } -); -Button.displayName = 'Button'; - -export { Button, buttonVariants }; diff --git a/src/frontend/components/ui/dialog.tsx b/src/frontend/components/ui/dialog.tsx deleted file mode 100644 index 9ebe024..0000000 --- a/src/frontend/components/ui/dialog.tsx +++ /dev/null @@ -1,143 +0,0 @@ -'use client'; - -import * as React from 'react'; -import * as DialogPrimitive from '@radix-ui/react-dialog'; -import { X } from 'lucide-react'; - -import { cn } from '@/lib/utils'; - -const Dialog = DialogPrimitive.Root; - -const DialogTrigger = DialogPrimitive.Trigger; - -const DialogPortal = DialogPrimitive.Portal; - -const DialogClose = DialogPrimitive.Close; - -const DialogOverlay = React.forwardRef< - React.ElementRef< - typeof DialogPrimitive.Overlay - >, - React.ComponentPropsWithoutRef< - typeof DialogPrimitive.Overlay - > ->(({ className, ...props }, ref) => ( - -)); -DialogOverlay.displayName = - DialogPrimitive.Overlay.displayName; - -const DialogContent = React.forwardRef< - React.ElementRef< - typeof DialogPrimitive.Content - >, - React.ComponentPropsWithoutRef< - typeof DialogPrimitive.Content - > ->(({ className, children, ...props }, ref) => ( - - - - {children} - - - Close - - - -)); -DialogContent.displayName = - DialogPrimitive.Content.displayName; - -const DialogHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-); -DialogHeader.displayName = 'DialogHeader'; - -const DialogFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-); -DialogFooter.displayName = 'DialogFooter'; - -const DialogTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef< - typeof DialogPrimitive.Title - > ->(({ className, ...props }, ref) => ( - -)); -DialogTitle.displayName = - DialogPrimitive.Title.displayName; - -const DialogDescription = React.forwardRef< - React.ElementRef< - typeof DialogPrimitive.Description - >, - React.ComponentPropsWithoutRef< - typeof DialogPrimitive.Description - > ->(({ className, ...props }, ref) => ( - -)); -DialogDescription.displayName = - DialogPrimitive.Description.displayName; - -export { - Dialog, - DialogPortal, - DialogOverlay, - DialogClose, - DialogTrigger, - DialogContent, - DialogHeader, - DialogFooter, - DialogTitle, - DialogDescription -}; diff --git a/src/frontend/components/ui/drawer.tsx b/src/frontend/components/ui/drawer.tsx deleted file mode 100644 index 1e7f6f3..0000000 --- a/src/frontend/components/ui/drawer.tsx +++ /dev/null @@ -1,149 +0,0 @@ -'use client'; - -import * as React from 'react'; -import { Drawer as DrawerPrimitive } from 'vaul'; - -import { cn } from '@/lib/utils'; - -const Drawer = ({ - shouldScaleBackground = true, - ...props -}: React.ComponentProps< - typeof DrawerPrimitive.Root ->) => ( - -); -Drawer.displayName = 'Drawer'; - -const DrawerTrigger = DrawerPrimitive.Trigger; - -const DrawerPortal = DrawerPrimitive.Portal; - -const DrawerClose = DrawerPrimitive.Close; - -const DrawerOverlay = React.forwardRef< - React.ElementRef< - typeof DrawerPrimitive.Overlay - >, - React.ComponentPropsWithoutRef< - typeof DrawerPrimitive.Overlay - > ->(({ className, ...props }, ref) => ( - -)); -DrawerOverlay.displayName = - DrawerPrimitive.Overlay.displayName; - -const DrawerContent = React.forwardRef< - React.ElementRef< - typeof DrawerPrimitive.Content - >, - React.ComponentPropsWithoutRef< - typeof DrawerPrimitive.Content - > ->(({ className, children, ...props }, ref) => ( - - - -
- {children} - - -)); -DrawerContent.displayName = 'DrawerContent'; - -const DrawerHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-); -DrawerHeader.displayName = 'DrawerHeader'; - -const DrawerFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-); -DrawerFooter.displayName = 'DrawerFooter'; - -const DrawerTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef< - typeof DrawerPrimitive.Title - > ->(({ className, ...props }, ref) => ( - -)); -DrawerTitle.displayName = - DrawerPrimitive.Title.displayName; - -const DrawerDescription = React.forwardRef< - React.ElementRef< - typeof DrawerPrimitive.Description - >, - React.ComponentPropsWithoutRef< - typeof DrawerPrimitive.Description - > ->(({ className, ...props }, ref) => ( - -)); -DrawerDescription.displayName = - DrawerPrimitive.Description.displayName; - -export { - Drawer, - DrawerPortal, - DrawerOverlay, - DrawerTrigger, - DrawerClose, - DrawerContent, - DrawerHeader, - DrawerFooter, - DrawerTitle, - DrawerDescription -}; diff --git a/src/frontend/components/ui/dropdown-menu.tsx b/src/frontend/components/ui/dropdown-menu.tsx deleted file mode 100644 index 63fbc67..0000000 --- a/src/frontend/components/ui/dropdown-menu.tsx +++ /dev/null @@ -1,267 +0,0 @@ -'use client'; - -import * as React from 'react'; -import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'; -import { - Check, - ChevronRight, - Circle -} from 'lucide-react'; - -import { cn } from '@/lib/utils'; - -const DropdownMenu = DropdownMenuPrimitive.Root; - -const DropdownMenuTrigger = - DropdownMenuPrimitive.Trigger; - -const DropdownMenuGroup = - DropdownMenuPrimitive.Group; - -const DropdownMenuPortal = - DropdownMenuPrimitive.Portal; - -const DropdownMenuSub = DropdownMenuPrimitive.Sub; - -const DropdownMenuRadioGroup = - DropdownMenuPrimitive.RadioGroup; - -const DropdownMenuSubTrigger = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.SubTrigger - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.SubTrigger - > & { - inset?: boolean; - } ->( - ( - { className, inset, children, ...props }, - ref - ) => ( - - {children} - - - ) -); -DropdownMenuSubTrigger.displayName = - DropdownMenuPrimitive.SubTrigger.displayName; - -const DropdownMenuSubContent = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.SubContent - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.SubContent - > ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSubContent.displayName = - DropdownMenuPrimitive.SubContent.displayName; - -const DropdownMenuContent = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.Content - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.Content - > ->( - ( - { className, sideOffset = 4, ...props }, - ref - ) => ( - - - - ) -); -DropdownMenuContent.displayName = - DropdownMenuPrimitive.Content.displayName; - -const DropdownMenuItem = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.Item - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.Item - > & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - -)); -DropdownMenuItem.displayName = - DropdownMenuPrimitive.Item.displayName; - -const DropdownMenuCheckboxItem = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.CheckboxItem - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.CheckboxItem - > ->( - ( - { className, children, checked, ...props }, - ref - ) => ( - - - - - - - {children} - - ) -); -DropdownMenuCheckboxItem.displayName = - DropdownMenuPrimitive.CheckboxItem.displayName; - -const DropdownMenuRadioItem = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.RadioItem - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.RadioItem - > ->(({ className, children, ...props }, ref) => ( - - - - - - - {children} - -)); -DropdownMenuRadioItem.displayName = - DropdownMenuPrimitive.RadioItem.displayName; - -const DropdownMenuLabel = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.Label - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.Label - > & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - -)); -DropdownMenuLabel.displayName = - DropdownMenuPrimitive.Label.displayName; - -const DropdownMenuSeparator = React.forwardRef< - React.ElementRef< - typeof DropdownMenuPrimitive.Separator - >, - React.ComponentPropsWithoutRef< - typeof DropdownMenuPrimitive.Separator - > ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSeparator.displayName = - DropdownMenuPrimitive.Separator.displayName; - -const DropdownMenuShortcut = ({ - className, - ...props -}: React.HTMLAttributes) => { - return ( - - ); -}; -DropdownMenuShortcut.displayName = - 'DropdownMenuShortcut'; - -export { - DropdownMenu, - DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuCheckboxItem, - DropdownMenuRadioItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuShortcut, - DropdownMenuGroup, - DropdownMenuPortal, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, - DropdownMenuRadioGroup -}; diff --git a/src/frontend/components/ui/sheet.tsx b/src/frontend/components/ui/sheet.tsx deleted file mode 100644 index 61f2a99..0000000 --- a/src/frontend/components/ui/sheet.tsx +++ /dev/null @@ -1,175 +0,0 @@ -'use client'; - -import * as React from 'react'; -import * as SheetPrimitive from '@radix-ui/react-dialog'; -import { - cva, - type VariantProps -} from 'class-variance-authority'; -import { X } from 'lucide-react'; - -import { cn } from '@/lib/utils'; - -const Sheet = SheetPrimitive.Root; - -const SheetTrigger = SheetPrimitive.Trigger; - -const SheetClose = SheetPrimitive.Close; - -const SheetPortal = SheetPrimitive.Portal; - -const SheetOverlay = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef< - typeof SheetPrimitive.Overlay - > ->(({ className, ...props }, ref) => ( - -)); -SheetOverlay.displayName = - SheetPrimitive.Overlay.displayName; - -const sheetVariants = cva( - 'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500', - { - variants: { - side: { - top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top', - bottom: - 'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom', - left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm', - right: - 'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm' - } - }, - defaultVariants: { - side: 'right' - } - } -); - -interface SheetContentProps - extends React.ComponentPropsWithoutRef< - typeof SheetPrimitive.Content - >, - VariantProps {} - -const SheetContent = React.forwardRef< - React.ElementRef, - SheetContentProps ->( - ( - { - side = 'right', - className, - children, - ...props - }, - ref - ) => ( - - - - {children} - - - - - - ) -); -SheetContent.displayName = - SheetPrimitive.Content.displayName; - -const SheetHeader = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-); -SheetHeader.displayName = 'SheetHeader'; - -const SheetFooter = ({ - className, - ...props -}: React.HTMLAttributes) => ( -
-); -SheetFooter.displayName = 'SheetFooter'; - -const SheetTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef< - typeof SheetPrimitive.Title - > ->(({ className, ...props }, ref) => ( - -)); -SheetTitle.displayName = - SheetPrimitive.Title.displayName; - -const SheetDescription = React.forwardRef< - React.ElementRef< - typeof SheetPrimitive.Description - >, - React.ComponentPropsWithoutRef< - typeof SheetPrimitive.Description - > ->(({ className, ...props }, ref) => ( - -)); -SheetDescription.displayName = - SheetPrimitive.Description.displayName; - -export { - Sheet, - SheetPortal, - SheetOverlay, - SheetTrigger, - SheetClose, - SheetContent, - SheetHeader, - SheetFooter, - SheetTitle, - SheetDescription -}; diff --git a/src/frontend/components/user-dropdown.tsx b/src/frontend/components/user-dropdown.tsx deleted file mode 100644 index ed7ffc4..0000000 --- a/src/frontend/components/user-dropdown.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from 'react'; -import { - Avatar, - AvatarFallback, - AvatarImage -} from '@/components/ui/avatar'; -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuSeparator, - DropdownMenuTrigger -} from '@/components/ui/dropdown-menu'; -import { UserRound } from 'lucide-react'; - -type Props = {}; - -const UserDropdown = (props: Props) => { - return ( - - - - - - - - - - - - - John Doe - - - user@email.com - - - - - Profile - - - Settings - - - Logout - - - - ); -}; - -export default UserDropdown; diff --git a/src/frontend/components/util/content-width-wrapper.tsx b/src/frontend/components/util/content-width-wrapper.tsx deleted file mode 100644 index a27e5d8..0000000 --- a/src/frontend/components/util/content-width-wrapper.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { cn } from '@/lib/utils'; -import React from 'react'; - -type Props = { - children: React.ReactNode; - className?: string; -}; - -const ContentWidthWrapper = ({ - children, - className -}: Props) => { - return ( -
- {children} -
- ); -}; - -export default ContentWidthWrapper; diff --git a/src/frontend/components/welcome-section.tsx b/src/frontend/components/welcome-section.tsx deleted file mode 100644 index 07be1c2..0000000 --- a/src/frontend/components/welcome-section.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react'; -import { IconHyperledger } from './icons/IconHyperledger'; - -type Props = {}; - -const WelcomeSection = (props: Props) => { - return ( -
- -
- ); -}; - -export default WelcomeSection; diff --git a/src/frontend/hooks/useDebounceCallback.ts b/src/frontend/hooks/useDebounceCallback.ts deleted file mode 100644 index f7663f2..0000000 --- a/src/frontend/hooks/useDebounceCallback.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { - useEffect, - useMemo, - useRef -} from 'react'; - -import debounce from 'lodash.debounce'; -import { useUnmount } from './useUnmount'; - -type DebounceOptions = { - leading?: boolean; - trailing?: boolean; - maxWait?: number; -}; - -type ControlFunctions = { - cancel: () => void; - flush: () => void; - isPending: () => boolean; -}; - -export type DebouncedState< - T extends (...args: any) => ReturnType -> = (( - ...args: Parameters -) => ReturnType | undefined) & - ControlFunctions; - -export function useDebounceCallback< - T extends (...args: any) => ReturnType ->( - func: T, - delay = 500, - options?: DebounceOptions -): DebouncedState { - const debouncedFunc = - useRef>(); - - useUnmount(() => { - if (debouncedFunc.current) { - debouncedFunc.current.cancel(); - } - }); - - const debounced = useMemo(() => { - const debouncedFuncInstance = debounce( - func, - delay, - options - ); - - const wrappedFunc: DebouncedState = ( - ...args: Parameters - ) => { - return debouncedFuncInstance(...args); - }; - - wrappedFunc.cancel = () => { - debouncedFuncInstance.cancel(); - }; - - wrappedFunc.isPending = () => { - return !!debouncedFunc.current; - }; - - wrappedFunc.flush = () => { - return debouncedFuncInstance.flush(); - }; - - return wrappedFunc; - }, [func, delay, options]); - - // Update the debounced function ref whenever func, wait, or options change - useEffect(() => { - debouncedFunc.current = debounce( - func, - delay, - options - ); - }, [func, delay, options]); - - return debounced; -} diff --git a/src/frontend/hooks/useEventListener.ts b/src/frontend/hooks/useEventListener.ts deleted file mode 100644 index 7cd3b03..0000000 --- a/src/frontend/hooks/useEventListener.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { - useEffect, - useRef, - type RefObject -} from 'react'; -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; - -function useEventListener< - K extends keyof MediaQueryListEventMap ->( - eventName: K, - handler: ( - event: MediaQueryListEventMap[K] - ) => void, - element: RefObject, - options?: boolean | AddEventListenerOptions -): void; - -function useEventListener< - K extends keyof WindowEventMap ->( - eventName: K, - handler: (event: WindowEventMap[K]) => void, - element?: undefined, - options?: boolean | AddEventListenerOptions -): void; - -function useEventListener< - K extends keyof HTMLElementEventMap & - keyof SVGElementEventMap, - T extends - Element = K extends keyof HTMLElementEventMap - ? HTMLDivElement - : SVGElement ->( - eventName: K, - handler: - | ((event: HTMLElementEventMap[K]) => void) - | ((event: SVGElementEventMap[K]) => void), - element: RefObject, - options?: boolean | AddEventListenerOptions -): void; - -function useEventListener< - K extends keyof DocumentEventMap ->( - eventName: K, - handler: (event: DocumentEventMap[K]) => void, - element: RefObject, - options?: boolean | AddEventListenerOptions -): void; - -function useEventListener< - KW extends keyof WindowEventMap, - KH extends keyof HTMLElementEventMap & - keyof SVGElementEventMap, - KM extends keyof MediaQueryListEventMap, - T extends - | HTMLElement - | SVGAElement - | MediaQueryList = HTMLElement ->( - eventName: KW | KH | KM, - handler: ( - event: - | WindowEventMap[KW] - | HTMLElementEventMap[KH] - | SVGElementEventMap[KH] - | MediaQueryListEventMap[KM] - | Event - ) => void, - element?: RefObject, - options?: boolean | AddEventListenerOptions -) { - const savedHandler = useRef(handler); - - useIsomorphicLayoutEffect(() => { - savedHandler.current = handler; - }, [handler]); - - useEffect(() => { - const targetElement: T | Window = - element?.current ?? window; - - if ( - !( - targetElement && - targetElement.addEventListener - ) - ) - return; - - const listener: typeof handler = (event) => { - savedHandler.current(event); - }; - - targetElement.addEventListener( - eventName, - listener, - options - ); - - return () => { - targetElement.removeEventListener( - eventName, - listener, - options - ); - }; - }, [eventName, element, options]); -} - -export { useEventListener }; diff --git a/src/frontend/hooks/useIsomorphicLayoutEffect.ts b/src/frontend/hooks/useIsomorphicLayoutEffect.ts deleted file mode 100644 index 54fbad4..0000000 --- a/src/frontend/hooks/useIsomorphicLayoutEffect.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { - useEffect, - useLayoutEffect -} from 'react'; - -export const useIsomorphicLayoutEffect = - typeof window !== 'undefined' - ? useLayoutEffect - : useEffect; diff --git a/src/frontend/hooks/useUnmount.ts b/src/frontend/hooks/useUnmount.ts deleted file mode 100644 index 09ca204..0000000 --- a/src/frontend/hooks/useUnmount.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { useEffect, useRef } from 'react'; - -export function useUnmount(func: () => void) { - const funcRef = useRef(func); - - funcRef.current = func; - - useEffect( - () => () => { - funcRef.current(); - }, - [] - ); -} diff --git a/src/frontend/hooks/useWindowSize.ts b/src/frontend/hooks/useWindowSize.ts deleted file mode 100644 index 662b015..0000000 --- a/src/frontend/hooks/useWindowSize.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { useState } from 'react'; -import { useDebounceCallback } from './useDebounceCallback'; -import { useEventListener } from './useEventListener'; -import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; - -type WindowSize< - T extends number | undefined = - | number - | undefined -> = { - width: T; - height: T; -}; - -type UseWindowSizeOptions< - InitializeWithValue extends boolean | undefined -> = { - initializeWithValue: InitializeWithValue; - debounceDelay?: number; -}; - -const IS_SERVER = typeof window === 'undefined'; - -export function useWindowSize( - options: UseWindowSizeOptions -): { - windowSize: WindowSize; - isMobile: boolean; - isDesktop: boolean; -}; -export function useWindowSize( - options?: Partial> -): { - windowSize: WindowSize; - isMobile: boolean; - isDesktop: boolean; -}; -export function useWindowSize( - options: Partial< - UseWindowSizeOptions - > = {} -): { - windowSize: WindowSize | WindowSize; - isMobile: boolean; - isDesktop: boolean; -} { - let { initializeWithValue = true } = options; - if (IS_SERVER) { - initializeWithValue = false; - } - - const [windowSize, setWindowSize] = - useState(() => { - if (initializeWithValue) { - return { - width: window.innerWidth, - height: window.innerHeight - }; - } - return { - width: undefined, - height: undefined - }; - }); - - const debouncedSetWindowSize = - useDebounceCallback( - setWindowSize, - options.debounceDelay - ); - - function handleSize() { - const setSize = options.debounceDelay - ? debouncedSetWindowSize - : setWindowSize; - - setSize({ - width: window.innerWidth, - height: window.innerHeight - }); - } - - useEventListener('resize', handleSize); - - useIsomorphicLayoutEffect(() => { - handleSize(); - }, []); - - return { - windowSize, - isMobile: - typeof windowSize.width === 'number' && - windowSize.width < 768, - isDesktop: - typeof windowSize.width === 'number' && - windowSize.width >= 768 - }; -} diff --git a/src/frontend/lib/apis/fetcher.ts b/src/frontend/lib/apis/fetcher.ts deleted file mode 100644 index cb89168..0000000 --- a/src/frontend/lib/apis/fetcher.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { SERVER_BASE_URL } from '../const'; -import { Message } from '@/lib/types'; - -export async function handleSend( - message: Message -) { - return fetch(SERVER_BASE_URL + '/query', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify(message) - }) - .then((response) => { - return response.json(); - }) - .catch((err) => { - console.log(err); - }); -} diff --git a/src/frontend/lib/const.ts b/src/frontend/lib/const.ts deleted file mode 100644 index da92f82..0000000 --- a/src/frontend/lib/const.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const SERVER_BASE_URL = - process.env.NODE_ENV === 'development' - ? process.env.NEXT_PUBLIC_SERVER_URL - : process.env.NEXT_PUBLIC_SERVER_URL || ''; diff --git a/src/frontend/lib/types.ts b/src/frontend/lib/types.ts deleted file mode 100644 index 009480a..0000000 --- a/src/frontend/lib/types.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface Message { - /// 0: user | 1: agent - type: 0 | 1; - id: string; - content: string; -} diff --git a/src/frontend/lib/utils.ts b/src/frontend/lib/utils.ts deleted file mode 100644 index 256f86f..0000000 --- a/src/frontend/lib/utils.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type ClassValue, clsx } from 'clsx'; -import { twMerge } from 'tailwind-merge'; - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)); -} diff --git a/src/frontend/next.config.mjs b/src/frontend/next.config.mjs deleted file mode 100644 index 2d7ff8a..0000000 --- a/src/frontend/next.config.mjs +++ /dev/null @@ -1,17 +0,0 @@ -/** @type {import('next').NextConfig} */ -const nextConfig = { - output: "standalone", - rewrites: async () => { - return [ - { - source: "/api/:path*", - destination: - process.env.NODE_ENV === "development" - ? "http://127.0.0.1:8080/api/:path*" - : "/api/", - } - ]; - }, -}; - -export default nextConfig; diff --git a/src/frontend/package.json b/src/frontend/package.json deleted file mode 100644 index 8b32a74..0000000 --- a/src/frontend/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "aifaq", - "version": "0.1.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "format": "prettier --write \"**/*.{ts,tsx}\"", - "format:check": "prettier --check \"**/*.{ts,tsx}\"" - }, - "dependencies": { - "@radix-ui/react-avatar": "^1.1.0", - "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-slot": "^1.1.0", - "@reduxjs/toolkit": "^2.2.6", - "class-variance-authority": "^0.7.0", - "clsx": "^2.1.1", - "lucide-react": "^0.400.0", - "next": "14.2.4", - "next-themes": "^0.3.0", - "react": "^18", - "react-dom": "^18", - "react-redux": "^9.1.2", - "react-textarea-autosize": "^8.5.3", - "sharp": "^0.33.4", - "tailwind-merge": "^2.3.0", - "tailwindcss-animate": "^1.0.7", - "uuid": "^10.0.0", - "vaul": "^0.9.1" - }, - "devDependencies": { - "@types/lodash.debounce": "^4.0.9", - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "@types/uuid": "^10.0.0", - "eslint": "^8", - "eslint-config-next": "14.2.4", - "lodash.debounce": "^4.0.8", - "postcss": "^8", - "prettier": "^3.3.3", - "tailwindcss": "^3.4.1", - "typescript": "^5" - } -} diff --git a/src/frontend/postcss.config.mjs b/src/frontend/postcss.config.mjs deleted file mode 100644 index 1a69fd2..0000000 --- a/src/frontend/postcss.config.mjs +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('postcss-load-config').Config} */ -const config = { - plugins: { - tailwindcss: {}, - }, -}; - -export default config; diff --git a/src/frontend/tailwind.config.ts b/src/frontend/tailwind.config.ts deleted file mode 100644 index 56fafcf..0000000 --- a/src/frontend/tailwind.config.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { Config } from 'tailwindcss'; - -const config = { - darkMode: ['class'], - content: [ - './pages/**/*.{ts,tsx}', - './components/**/*.{ts,tsx}', - './app/**/*.{ts,tsx}', - './src/**/*.{ts,tsx}' - ], - prefix: '', - theme: { - container: { - center: true, - padding: '2rem', - screens: { - '2xl': '1400px' - } - }, - fontFamily: { - primary: ['var(--font-primary)'], - secondary: ['var(--font-secondary)'] - }, - extend: { - colors: { - border: 'hsl(var(--border))', - 'hover-blue': '#f1f5f9', - input: 'hsl(var(--input))', - ring: 'hsl(var(--ring))', - background: 'hsl(var(--background))', - foreground: 'hsl(var(--foreground))', - primary: { - DEFAULT: 'hsl(var(--primary))', - foreground: - 'hsl(var(--primary-foreground))' - }, - secondary: { - DEFAULT: 'hsl(var(--secondary))', - foreground: - 'hsl(var(--secondary-foreground))' - }, - destructive: { - DEFAULT: 'hsl(var(--destructive))', - foreground: - 'hsl(var(--destructive-foreground))' - }, - muted: { - DEFAULT: 'hsl(var(--muted))', - foreground: - 'hsl(var(--muted-foreground))' - }, - accent: { - DEFAULT: 'hsl(var(--accent))', - foreground: - 'hsl(var(--accent-foreground))' - }, - popover: { - DEFAULT: 'hsl(var(--popover))', - foreground: - 'hsl(var(--popover-foreground))' - }, - card: { - DEFAULT: 'hsl(var(--card))', - foreground: - 'hsl(var(--card-foreground))' - } - }, - borderRadius: { - lg: 'var(--radius)', - md: 'calc(var(--radius) - 2px)', - sm: 'calc(var(--radius) - 4px)' - }, - keyframes: { - 'accordion-down': { - from: { - height: '0' - }, - to: { - height: - 'var(--radix-accordion-content-height)' - } - }, - 'accordion-up': { - from: { - height: - 'var(--radix-accordion-content-height)' - }, - to: { - height: '0' - } - } - }, - fontSize: { - xxs: ['10px', '14px'] - }, - animation: { - 'accordion-down': - 'accordion-down 0.2s ease-out', - 'accordion-up': - 'accordion-up 0.2s ease-out' - } - } - }, - plugins: [require('tailwindcss-animate')] -} satisfies Config; - -export default config; diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json deleted file mode 100644 index e7ff90f..0000000 --- a/src/frontend/tsconfig.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/src/frontend/yarn.lock b/src/frontend/yarn.lock deleted file mode 100644 index d29dcb0..0000000 --- a/src/frontend/yarn.lock +++ /dev/null @@ -1,3452 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@babel/runtime@^7.20.13", "@babel/runtime@^7.24.1": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== - dependencies: - regenerator-runtime "^0.14.0" - -"@emnapi/runtime@^1.1.1": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.2.0.tgz#71d018546c3a91f3b51106530edbc056b9f2f2e3" - integrity sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== - dependencies: - tslib "^2.4.0" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.6.1": - version "4.11.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" - integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@floating-ui/core@^1.6.0": - version "1.6.4" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.4.tgz#0140cf5091c8dee602bff9da5ab330840ff91df6" - integrity sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA== - dependencies: - "@floating-ui/utils" "^0.2.4" - -"@floating-ui/dom@^1.0.0": - version "1.6.7" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.7.tgz#85d22f731fcc5b209db504478fb1df5116a83015" - integrity sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng== - dependencies: - "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.4" - -"@floating-ui/react-dom@^2.0.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz#cca58b6b04fc92b4c39288252e285e0422291fb0" - integrity sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== - dependencies: - "@floating-ui/dom" "^1.0.0" - -"@floating-ui/utils@^0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.4.tgz#1d459cee5031893a08a0e064c406ad2130cced7c" - integrity sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA== - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@img/sharp-darwin-arm64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.4.tgz#a1cf4a7febece334f16e0328b9689f05797d7aec" - integrity sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA== - optionalDependencies: - "@img/sharp-libvips-darwin-arm64" "1.0.2" - -"@img/sharp-darwin-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.4.tgz#f77be2d7c3609d3e77cd337b199a772e07b87bd2" - integrity sha512-0l7yRObwtTi82Z6ebVI2PnHT8EB2NxBgpK2MiKJZJ7cz32R4lxd001ecMhzzsZig3Yv9oclvqqdV93jo9hy+Dw== - optionalDependencies: - "@img/sharp-libvips-darwin-x64" "1.0.2" - -"@img/sharp-libvips-darwin-arm64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.2.tgz#b69f49fecbe9572378675769b189410721b0fa53" - integrity sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA== - -"@img/sharp-libvips-darwin-x64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.2.tgz#5665da7360d8e5ed7bee314491c8fe736b6a3c39" - integrity sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw== - -"@img/sharp-libvips-linux-arm64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.2.tgz#8a05e5e9e9b760ff46561e32f19bd5e035fa881c" - integrity sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw== - -"@img/sharp-libvips-linux-arm@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.2.tgz#0fd33b9bf3221948ce0ca7a5a725942626577a03" - integrity sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw== - -"@img/sharp-libvips-linux-s390x@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.2.tgz#4b89150ec91b256ee2cbb5bb125321bf029a4770" - integrity sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog== - -"@img/sharp-libvips-linux-x64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.2.tgz#947ccc22ca5bc8c8cfe921b39a5fdaebc5e39f3f" - integrity sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ== - -"@img/sharp-libvips-linuxmusl-arm64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.2.tgz#821d58ce774f0f8bed065b69913a62f65d512f2f" - integrity sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ== - -"@img/sharp-libvips-linuxmusl-x64@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.2.tgz#4309474bd8b728a61af0b3b4fad0c476b5f3ccbe" - integrity sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw== - -"@img/sharp-linux-arm64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.4.tgz#bd390113e256487041411b988ded13a26cfc5f95" - integrity sha512-2800clwVg1ZQtxwSoTlHvtm9ObgAax7V6MTAB/hDT945Tfyy3hVkmiHpeLPCKYqYR1Gcmv1uDZ3a4OFwkdBL7Q== - optionalDependencies: - "@img/sharp-libvips-linux-arm64" "1.0.2" - -"@img/sharp-linux-arm@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.4.tgz#14ecc81f38f75fb4cd7571bc83311746d6745fca" - integrity sha512-RUgBD1c0+gCYZGCCe6mMdTiOFS0Zc/XrN0fYd6hISIKcDUbAW5NtSQW9g/powkrXYm6Vzwd6y+fqmExDuCdHNQ== - optionalDependencies: - "@img/sharp-libvips-linux-arm" "1.0.2" - -"@img/sharp-linux-s390x@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.4.tgz#119e8081e2c6741b5ac908fe02244e4c559e525f" - integrity sha512-h3RAL3siQoyzSoH36tUeS0PDmb5wINKGYzcLB5C6DIiAn2F3udeFAum+gj8IbA/82+8RGCTn7XW8WTFnqag4tQ== - optionalDependencies: - "@img/sharp-libvips-linux-s390x" "1.0.2" - -"@img/sharp-linux-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.4.tgz#21d4c137b8da9a313b069ff5c920ded709f853d7" - integrity sha512-GoR++s0XW9DGVi8SUGQ/U4AeIzLdNjHka6jidVwapQ/JebGVQIpi52OdyxCNVRE++n1FCLzjDovJNozif7w/Aw== - optionalDependencies: - "@img/sharp-libvips-linux-x64" "1.0.2" - -"@img/sharp-linuxmusl-arm64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.4.tgz#f3fde68fd67b85a32da6f1155818c3b58b8e7ae0" - integrity sha512-nhr1yC3BlVrKDTl6cO12gTpXMl4ITBUZieehFvMntlCXFzH2bvKG76tBL2Y/OqhupZt81pR7R+Q5YhJxW0rGgQ== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" - -"@img/sharp-linuxmusl-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.4.tgz#44373724aecd7b69900e0578228144e181db7892" - integrity sha512-uCPTku0zwqDmZEOi4ILyGdmW76tH7dm8kKlOIV1XC5cLyJ71ENAAqarOHQh0RLfpIpbV5KOpXzdU6XkJtS0daw== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64" "1.0.2" - -"@img/sharp-wasm32@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.4.tgz#88e3f18d7e7cd8cfe1af98e9963db4d7b6491435" - integrity sha512-Bmmauh4sXUsUqkleQahpdNXKvo+wa1V9KhT2pDA4VJGKwnKMJXiSTGphn0gnJrlooda0QxCtXc6RX1XAU6hMnQ== - dependencies: - "@emnapi/runtime" "^1.1.1" - -"@img/sharp-win32-ia32@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.4.tgz#b1c772dd2952e983980b1eb85808fa8129484d46" - integrity sha512-99SJ91XzUhYHbx7uhK3+9Lf7+LjwMGQZMDlO/E/YVJ7Nc3lyDFZPGhjwiYdctoH2BOzW9+TnfqcaMKt0jHLdqw== - -"@img/sharp-win32-x64@0.33.4": - version "0.33.4" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.4.tgz#106f911134035b4157ec92a0c154a6b6f88fa4c1" - integrity sha512-3QLocdTRVIrFNye5YocZl+KKpYKP+fksi1QhmOArgx7GyhIbQp/WrJRu176jm8IxromS7RIkzMiMINVdBtC8Aw== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@next/env@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.4.tgz#5546813dc4f809884a37d257b254a5ce1b0248d7" - integrity sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg== - -"@next/eslint-plugin-next@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.4.tgz#c7f965cb76f0b454e726ef0f69157c4fb4e28f53" - integrity sha512-svSFxW9f3xDaZA3idQmlFw7SusOuWTpDTAeBlO3AEPDltrraV+lqs7mAc6A27YdnpQVVIA3sODqUAAHdWhVWsA== - dependencies: - glob "10.3.10" - -"@next/swc-darwin-arm64@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.4.tgz#da9f04c34a3d5f0b8401ed745768420e4a604036" - integrity sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg== - -"@next/swc-darwin-x64@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.4.tgz#46dedb29ec5503bf171a72a3ecb8aac6e738e9d6" - integrity sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg== - -"@next/swc-linux-arm64-gnu@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.4.tgz#c9697ab9eb422bd1d7ffd0eb0779cc2aefa9d4a1" - integrity sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ== - -"@next/swc-linux-arm64-musl@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.4.tgz#cbbceb2008571c743b5a310a488d2e166d200a75" - integrity sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A== - -"@next/swc-linux-x64-gnu@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.4.tgz#d79184223f857bacffb92f643cb2943a43632568" - integrity sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q== - -"@next/swc-linux-x64-musl@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.4.tgz#6b6c3e5ac02ca5e63394d280ec8ee607491902df" - integrity sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ== - -"@next/swc-win32-arm64-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.4.tgz#dbad3906e870dba84c5883d9d4c4838472e0697f" - integrity sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A== - -"@next/swc-win32-ia32-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.4.tgz#6074529b91ba49132922ce89a2e16d25d2ec235d" - integrity sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag== - -"@next/swc-win32-x64-msvc@14.2.4": - version "14.2.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.4.tgz#e65a1c6539a671f97bb86d5183d6e3a1733c29c7" - integrity sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@radix-ui/primitive@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" - integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== - -"@radix-ui/react-arrow@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" - integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/react-avatar@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz#457c81334c93f4608df15f081e7baa286558d6a2" - integrity sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA== - dependencies: - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-collection@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" - integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - -"@radix-ui/react-compose-refs@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" - integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== - -"@radix-ui/react-context@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" - integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== - -"@radix-ui/react-dialog@^1.0.4", "@radix-ui/react-dialog@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz#4906507f7b4ad31e22d7dad69d9330c87c431d44" - integrity sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - -"@radix-ui/react-direction@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" - integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== - -"@radix-ui/react-dismissable-layer@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz#2cd0a49a732372513733754e6032d3fb7988834e" - integrity sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-escape-keydown" "1.1.0" - -"@radix-ui/react-dropdown-menu@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz#3dc578488688250dbbe109d9ff2ca28a9bca27ec" - integrity sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-menu" "2.1.1" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - -"@radix-ui/react-focus-guards@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz#8e9abb472a9a394f59a1b45f3dd26cfe3fc6da13" - integrity sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw== - -"@radix-ui/react-focus-scope@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" - integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - -"@radix-ui/react-id@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" - integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-menu@2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-menu/-/react-menu-2.1.1.tgz#bd623ace0e1ae1ac78023a505fec0541d59fb346" - integrity sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-collection" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-dismissable-layer" "1.1.0" - "@radix-ui/react-focus-guards" "1.1.0" - "@radix-ui/react-focus-scope" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.1" - "@radix-ui/react-presence" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-roving-focus" "1.1.0" - "@radix-ui/react-slot" "1.1.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - aria-hidden "^1.1.1" - react-remove-scroll "2.5.7" - -"@radix-ui/react-popper@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" - integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== - dependencies: - "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - "@radix-ui/react-use-rect" "1.1.0" - "@radix-ui/react-use-size" "1.1.0" - "@radix-ui/rect" "1.1.0" - -"@radix-ui/react-portal@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.1.tgz#1957f1eb2e1aedfb4a5475bd6867d67b50b1d15f" - integrity sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g== - dependencies: - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-presence@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.0.tgz#227d84d20ca6bfe7da97104b1a8b48a833bfb478" - integrity sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/react-primitive@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" - integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== - dependencies: - "@radix-ui/react-slot" "1.1.0" - -"@radix-ui/react-roving-focus@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz#b30c59daf7e714c748805bfe11c76f96caaac35e" - integrity sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA== - dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-collection" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-direction" "1.1.0" - "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-use-callback-ref" "1.1.0" - "@radix-ui/react-use-controllable-state" "1.1.0" - -"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== - dependencies: - "@radix-ui/react-compose-refs" "1.1.0" - -"@radix-ui/react-use-callback-ref@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" - integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== - -"@radix-ui/react-use-controllable-state@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" - integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== - dependencies: - "@radix-ui/react-use-callback-ref" "1.1.0" - -"@radix-ui/react-use-escape-keydown@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" - integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== - dependencies: - "@radix-ui/react-use-callback-ref" "1.1.0" - -"@radix-ui/react-use-layout-effect@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" - integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== - -"@radix-ui/react-use-rect@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" - integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== - dependencies: - "@radix-ui/rect" "1.1.0" - -"@radix-ui/react-use-size@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" - integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== - dependencies: - "@radix-ui/react-use-layout-effect" "1.1.0" - -"@radix-ui/rect@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" - integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== - -"@reduxjs/toolkit@^2.2.6": - version "2.2.6" - resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.2.6.tgz#4a8356dad9d0c1ab255607a555d492168e0e3bc1" - integrity sha512-kH0r495c5z1t0g796eDQAkYbEQ3a1OLYN9o8jQQVZyKyw367pfRGS+qZLkHYvFHiUUdafpoSlQ2QYObIApjPWA== - dependencies: - immer "^10.0.3" - redux "^5.0.1" - redux-thunk "^3.1.0" - reselect "^5.1.0" - -"@rushstack/eslint-patch@^1.3.3": - version "1.10.3" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" - integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== - -"@swc/counter@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/helpers@0.5.5": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0" - integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== - dependencies: - "@swc/counter" "^0.1.3" - tslib "^2.4.0" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash.debounce@^4.0.9": - version "4.0.9" - resolved "https://registry.yarnpkg.com/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz#0f5f21c507bce7521b5e30e7a24440975ac860a5" - integrity sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.17.6" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.6.tgz#193ced6a40c8006cfc1ca3f4553444fb38f0e543" - integrity sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA== - -"@types/node@^20": - version "20.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" - integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== - dependencies: - undici-types "~5.26.4" - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/react-dom@^18": - version "18.3.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.0.tgz#0cbc818755d87066ab6ca74fbedb2547d74a82b0" - integrity sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18": - version "18.3.3" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f" - integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/use-sync-external-store@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" - integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== - -"@types/uuid@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" - integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" - integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== - dependencies: - "@typescript-eslint/scope-manager" "7.2.0" - "@typescript-eslint/types" "7.2.0" - "@typescript-eslint/typescript-estree" "7.2.0" - "@typescript-eslint/visitor-keys" "7.2.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" - integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== - dependencies: - "@typescript-eslint/types" "7.2.0" - "@typescript-eslint/visitor-keys" "7.2.0" - -"@typescript-eslint/types@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" - integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== - -"@typescript-eslint/typescript-estree@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" - integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== - dependencies: - "@typescript-eslint/types" "7.2.0" - "@typescript-eslint/visitor-keys" "7.2.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/visitor-keys@7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" - integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== - dependencies: - "@typescript-eslint/types" "7.2.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.12.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" - integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-hidden@^1.1.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" - integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== - dependencies: - tslib "^2.0.0" - -aria-query@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" - integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== - dependencies: - deep-equal "^2.0.5" - -array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlast@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" - integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" - integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== - -axobject-query@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" - integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== - dependencies: - deep-equal "^2.0.5" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001579: - version "1.0.30001640" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f" - integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -class-variance-authority@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" - integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== - dependencies: - clsx "2.0.0" - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -clsx@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - -clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - -deep-equal@^2.0.5: - version "2.2.3" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" - integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.5" - es-get-iterator "^1.1.3" - get-intrinsic "^1.2.2" - is-arguments "^1.1.1" - is-array-buffer "^3.0.2" - is-date-object "^1.0.5" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - isarray "^2.0.5" - object-is "^1.1.5" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - side-channel "^1.0.4" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.13" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -detect-libc@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -detect-node-es@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" - integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enhanced-resolve@^5.12.0: - version "5.17.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" - integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-get-iterator@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" - integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - has-symbols "^1.0.3" - is-arguments "^1.1.1" - is-map "^2.0.2" - is-set "^2.0.2" - is-string "^1.0.7" - isarray "^2.0.5" - stop-iteration-iterator "^1.0.0" - -es-iterator-helpers@^1.0.19: - version "1.0.19" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" - integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.3" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@14.2.4: - version "14.2.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.2.4.tgz#eb0bedfe4a894bc2aea918214bb5243ee4fa7d4b" - integrity sha512-Qr0wMgG9m6m4uYy2jrYJmyuNlYZzPRQq5Kvb9IDlYwn+7yq6W6sfMNFgb+9guM1KYwuIo6TIaiFhZJ6SnQ/Efw== - dependencies: - "@next/eslint-plugin-next" "14.2.4" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.28.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" - integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== - dependencies: - aria-query "~5.1.3" - array-includes "^3.1.8" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "^4.9.1" - axobject-query "~3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.19" - hasown "^2.0.2" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - safe-regex-test "^1.0.3" - string.prototype.includes "^2.0.0" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" - integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== - -eslint-plugin-react@^7.33.2: - version "7.34.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" - integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== - dependencies: - array-includes "^3.1.8" - array.prototype.findlast "^1.2.5" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.4" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.19" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.8" - object.fromentries "^2.0.8" - object.hasown "^1.1.4" - object.values "^1.2.0" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.11" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" - integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-nonce@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" - integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^10.3.10: - version "10.4.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.3.tgz#e0ba2253dd21b3d0acdfb5d507c59a29f513fc7a" - integrity sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg== - 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" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.2.11, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -immer@^10.0.3: - version "10.1.1" - resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" - integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.4, internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.2, is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.2, is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jackspeak@^3.1.2: - version "3.4.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.1.tgz#145422416740568e9fc357bf60c844b3c1585f09" - integrity sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.21.0: - version "1.21.6" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" - integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -language-subtag-registry@^0.3.20: - version "0.3.23" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" - integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" - integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.0: - version "10.3.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.1.tgz#a37050586f84ccfdb570148a253bf1632a29ef44" - integrity sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g== - -lucide-react@^0.400.0: - version "0.400.0" - resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.400.0.tgz#8dc044bc1ace05fde5bdd4a8a7ad35c9e69ca575" - integrity sha512-rpp7pFHh3Xd93KHixNgB0SqThMHpYNzsGUu69UaQbSZ75Q/J3m5t6EhKyMT3m4w2WOxmJ2mY0tD3vebnXqQryQ== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.7" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" - integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.1, minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.6, nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next-themes@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" - integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== - -next@14.2.4: - version "14.2.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.4.tgz#ef66c39c71e2d8ad0a3caa0383c8933f4663e4d1" - integrity sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ== - dependencies: - "@next/env" "14.2.4" - "@swc/helpers" "0.5.5" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" - postcss "8.4.31" - styled-jsx "5.1.1" - optionalDependencies: - "@next/swc-darwin-arm64" "14.2.4" - "@next/swc-darwin-x64" "14.2.4" - "@next/swc-linux-arm64-gnu" "14.2.4" - "@next/swc-linux-arm64-musl" "14.2.4" - "@next/swc-linux-x64-gnu" "14.2.4" - "@next/swc-linux-x64-musl" "14.2.4" - "@next/swc-win32-arm64-msvc" "14.2.4" - "@next/swc-win32-ia32-msvc" "14.2.4" - "@next/swc-win32-x64-msvc" "14.2.4" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" - integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.7, object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.hasown@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -package-json-from-dist@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" - integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1, path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@^6.0.11: - version "6.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" - integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8, postcss@^8.4.23: - version "8.4.39" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3" - integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@^18: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-redux@^9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" - integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== - dependencies: - "@types/use-sync-external-store" "^0.0.3" - use-sync-external-store "^1.0.0" - -react-remove-scroll-bar@^2.3.4: - version "2.3.6" - resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" - integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== - dependencies: - react-style-singleton "^2.2.1" - tslib "^2.0.0" - -react-remove-scroll@2.5.7: - version "2.5.7" - resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz#15a1fd038e8497f65a695bf26a4a57970cac1ccb" - integrity sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA== - dependencies: - react-remove-scroll-bar "^2.3.4" - react-style-singleton "^2.2.1" - tslib "^2.1.0" - use-callback-ref "^1.3.0" - use-sidecar "^1.1.2" - -react-style-singleton@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4" - integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== - dependencies: - get-nonce "^1.0.0" - invariant "^2.2.4" - tslib "^2.0.0" - -react-textarea-autosize@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" - integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^18: - version "18.3.1" - resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" - integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -redux-thunk@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" - integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== - -redux@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" - integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== - -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -reselect@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" - integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.4: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== - -semver@^7.6.0: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -sharp@^0.33.4: - version "0.33.4" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.4.tgz#b88e6e843e095c6ab5e1a0c59c4885e580cd8405" - integrity sha512-7i/dt5kGl7qR4gwPRD2biwD2/SvBn3O04J77XKFgL2OnZtQw+AG9wnuS/csmu80nPRHLYE9E41fyEiG8nhH6/Q== - dependencies: - color "^4.2.3" - detect-libc "^2.0.3" - semver "^7.6.0" - optionalDependencies: - "@img/sharp-darwin-arm64" "0.33.4" - "@img/sharp-darwin-x64" "0.33.4" - "@img/sharp-libvips-darwin-arm64" "1.0.2" - "@img/sharp-libvips-darwin-x64" "1.0.2" - "@img/sharp-libvips-linux-arm" "1.0.2" - "@img/sharp-libvips-linux-arm64" "1.0.2" - "@img/sharp-libvips-linux-s390x" "1.0.2" - "@img/sharp-libvips-linux-x64" "1.0.2" - "@img/sharp-libvips-linuxmusl-arm64" "1.0.2" - "@img/sharp-libvips-linuxmusl-x64" "1.0.2" - "@img/sharp-linux-arm" "0.33.4" - "@img/sharp-linux-arm64" "0.33.4" - "@img/sharp-linux-s390x" "0.33.4" - "@img/sharp-linux-x64" "0.33.4" - "@img/sharp-linuxmusl-arm64" "0.33.4" - "@img/sharp-linuxmusl-x64" "0.33.4" - "@img/sharp-wasm32" "0.33.4" - "@img/sharp-win32-ia32" "0.33.4" - "@img/sharp-win32-x64" "0.33.4" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.0.2, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== - dependencies: - internal-slot "^1.0.4" - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.includes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" - integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.5" - -string.prototype.matchall@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -sucrase@^3.32.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - 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" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tailwind-merge@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.3.0.tgz#27d2134fd00a1f77eca22bcaafdd67055917d286" - integrity sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA== - dependencies: - "@babel/runtime" "^7.24.1" - -tailwindcss-animate@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/tailwindcss-animate/-/tailwindcss-animate-1.0.7.tgz#318b692c4c42676cc9e67b19b78775742388bef4" - integrity sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA== - -tailwindcss@^3.4.1: - version "3.4.4" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.4.tgz#351d932273e6abfa75ce7d226b5bf3a6cb257c05" - integrity sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typescript@^5: - version "5.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" - integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -use-callback-ref@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693" - integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA== - dependencies: - tslib "^2.0.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -use-sidecar@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2" - integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== - dependencies: - detect-node-es "^1.1.0" - tslib "^2.0.0" - -use-sync-external-store@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" - integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== - -vaul@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/vaul/-/vaul-0.9.1.tgz#3640198e04636b209b1f907fcf3079bec6ecc66b" - integrity sha512-fAhd7i4RNMinx+WEm6pF3nOl78DFkAazcN04ElLPFF9BMCNGbY/kou8UMhIcicm0rJCNePJP0Yyza60gGOD0Jw== - dependencies: - "@radix-ui/react-dialog" "^1.0.4" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yaml@^2.3.4: - version "2.4.5" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" - integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/src/image-1.png b/src/image-1.png deleted file mode 100644 index f6d879a..0000000 Binary files a/src/image-1.png and /dev/null differ diff --git a/src/image-2.png b/src/image-2.png deleted file mode 100644 index 06756c7..0000000 Binary files a/src/image-2.png and /dev/null differ diff --git a/src/image-3.png b/src/image-3.png deleted file mode 100644 index ce3e695..0000000 Binary files a/src/image-3.png and /dev/null differ diff --git a/src/image.png b/src/image.png deleted file mode 100644 index e0b600c..0000000 Binary files a/src/image.png and /dev/null differ diff --git a/version_1/app.py b/version_1/app.py new file mode 100644 index 0000000..d327b5a --- /dev/null +++ b/version_1/app.py @@ -0,0 +1,1139 @@ +import streamlit as st +from snowflake.snowpark.context import get_active_session +import uuid, re, datetime as dt +import pandas as pd +import io +import time + +# ------------- PAGE CONFIG & STYLING ------------- +st.set_page_config( + page_title="AI Document Assistant", + page_icon="πŸ’¬", + layout="wide", + initial_sidebar_state="expanded", +) + +# Dark theme configuration (only theme) +theme = { + "primary": "#8b5cf6", # Purple + "secondary": "#a78bfa", + "gradient_start": "#8b5cf6", + "gradient_end": "#7c3aed", + "bg_main": "#0f172a", # Slate dark + "bg_secondary": "#1e293b", + "bg_sidebar": "#1a1f2e", + "text_primary": "#f1f5f9", + "text_secondary": "#94a3b8", + "border": "#334155", + "input_bg": "#1e293b", + "input_border": "#334155", + "input_focus": "#8b5cf6", + "message_user_bg": "linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%)", + "message_user_text": "#ffffff", + "message_ai_bg": "#1e293b", + "message_ai_text": "#f1f5f9", + "message_ai_border": "#334155", + "button_hover_shadow": "rgba(139, 92, 246, 0.4)", + "welcome_text": "#94a3b8", + "file_upload_bg": "#1e293b", + "file_upload_border": "#334155", + "expander_bg": "#1e293b", + "accent_highlight": "#a78bfa", # Light purple accent + "success_color": "#10b981", # Green + "card_shadow": "0 4px 6px -1px rgba(139, 92, 246, 0.2), 0 2px 4px -1px rgba(139, 92, 246, 0.1)", +} + +# Global styling +st.markdown( + f""" + +""", + unsafe_allow_html=True, +) + +# ------------- SAFE SESSION ------------- +try: + session = get_active_session() +except Exception as e: + st.error(f"Cannot obtain Snowflake session: {e}") + st.stop() + +# ------------- CONSTANTS ------------- +LLM_OPTIONS = ["mistral-7b", "snowflake-arctic", "mixtral-8x7b"] +DOCS_TBL = "DOCUMENTS" +CHUNKS_TBL = "CHUNKS" +EMB_TBL = "EMBEDDINGS" +CHAT_TBL = "CHAT_HISTORY" + +# Supported file extensions - TXT ADDED +SUPPORTED_EXTENSIONS = { + "pdf": "PDF", + "pptx": "PowerPoint", + "csv": "CSV", + "xlsx": "Excel", + "xls": "Excel", + "txt": "TEXT", +} + +# Performance tuning +MAX_CHUNK_SIZE = 1000 # Safer size for 512 token limit +CHUNK_OVERLAP = 200 # Adjusted overlap + + +# ------------- UTILS ------------- +def sanitize(txt: str) -> str: + return txt.replace("'", "''") if txt else "" + + +# ------------- SESSION INIT ------------- +for k in ("sessions", "current", "llm", "last_upload_time", "kb_refresh"): + st.session_state.setdefault( + k, + ( + {} + if k == "sessions" + else ( + LLM_OPTIONS[0] + if k == "llm" + else ( + 0 + if k == "last_upload_time" + else False if k == "kb_refresh" else None + ) + ) + ), + ) + +# Validate and reset LLM if it's no longer available +if st.session_state.llm not in LLM_OPTIONS: + st.session_state.llm = LLM_OPTIONS[0] + +# Initialize current session if needed +if not st.session_state.current: + st.session_state.current = str(uuid.uuid4()) + st.session_state.sessions[st.session_state.current] = { + "title": "New chat", + "messages": [], + } + + +# ------------- FULL EXTRACTION ------------- +def extract_pdf_full(f): + """Full PDF extraction""" + try: + from PyPDF2 import PdfReader + + reader = PdfReader(f) + text_parts = [] + # Read ALL pages + for page in reader.pages: + text = page.extract_text() + if text: + text_parts.append(text) + return "".join(text_parts) + except Exception as e: + st.error(f"PDF extraction error: {e}") + return "" + + +def extract_pptx_full(f): + """Full PowerPoint extraction""" + try: + from pptx import Presentation + + prs = Presentation(f) + text_parts = [] + for slide in prs.slides: + slide_text = " ".join( + shape.text + for shape in slide.shapes + if hasattr(shape, "text") and shape.text.strip() + ) + if slide_text: + text_parts.append(slide_text) + return "\n\n".join(text_parts) + except Exception as e: + st.error(f"PowerPoint extraction error: {e}") + return "" + + +def extract_csv_full(f): + """Full CSV extraction (reads as raw text)""" + try: + # Reset file pointer and read as raw text + f.seek(0) + return f.read().decode("utf-8") + except Exception as e: + st.error(f"CSV extraction error: {e}") + return "" + + +def extract_excel_full(f): + """Full Excel extraction (all sheets, all rows)""" + try: + excel_file = pd.ExcelFile(f) + parts = [] + + # Process ALL sheets + for sheet_name in excel_file.sheet_names: + parts.append(f"=== Sheet: {sheet_name} ===") + # Read ALL rows + df = pd.read_excel(excel_file, sheet_name=sheet_name) + + # Convert the entire DataFrame to string *without* truncation + # This ensures every character from the Excel file is read + with pd.option_context( + "display.max_rows", + None, + "display.max_columns", + None, + "display.width", + None, + ): + parts.append(df.to_string()) + + parts.append("=" * 50) + + return "\n".join(parts) + except Exception as e: + st.error(f"Excel extraction error: {e}") + return "" + + +def extract_txt_full(f): + """Full TXT file extraction""" + try: + # Reset file pointer and read as text + f.seek(0) + # Try UTF-8 first, fall back to latin-1 if that fails + try: + content = f.read().decode("utf-8") + except UnicodeDecodeError: + f.seek(0) + content = f.read().decode("latin-1") + return content + except Exception as e: + st.error(f"TXT extraction error: {e}") + return "" + + +def extract_file_content(file, file_type): + """Extract content based on file type - FULL versions""" + if file_type.upper() == "PDF": + return extract_pdf_full(file) + elif file_type.upper() == "POWERPOINT": + return extract_pptx_full(file) + elif file_type.upper() == "CSV": + return extract_csv_full(file) + elif file_type.upper() == "EXCEL": + return extract_excel_full(file) + elif file_type.upper() == "TEXT": + return extract_txt_full(file) + else: + return "" + + +def chunk_text( + txt: str, size: int = MAX_CHUNK_SIZE, overlap: int = CHUNK_OVERLAP +) -> list[str]: + """Split text into overlapping chunks - optimized""" + if not txt: + return [] + chunks = [] + start = 0 + txt_len = len(txt) + + while start < txt_len: + end = min(start + size, txt_len) + chunks.append(txt[start:end]) + if end == txt_len: + break + start += size - overlap + + return chunks + + +def store_document_fast( + filename: str, src_type: str, content: str, public: bool = False +) -> bool: + """ + OPTIMIZED: Store document, chunks, and embeddings using server-side processing. + NOW WITH IMMEDIATE COMMIT for instant knowledge base update. + """ + doc_id = str(uuid.uuid4()) + try: + # 1. Insert document (single operation) with immediate commit + session.sql( + f"INSERT INTO {DOCS_TBL} (DOC_ID,FILENAME,FILE_TYPE,FILE_SIZE,IS_PUBLIC,UPLOADED_AT) " + f"VALUES ('{sanitize(doc_id)}','{sanitize(filename)}','{src_type}',{len(content)}," + f"{public},CURRENT_TIMESTAMP())" + ).collect() + + # FORCE COMMIT - Critical for immediate visibility + session.sql("COMMIT").collect() + + # 2. Create and batch insert chunks + chunks = chunk_text(content) + if not chunks: + st.warning(f"⚠️ {filename}: Document stored but no content to chunk") + return True # Document stored, but no content to chunk + + # Prepare chunk data + chunk_data = [] + for idx, chunk in enumerate(chunks): + if not chunk.strip(): + continue + chunk_data.append( + { + "CHUNK_ID": f"{doc_id}_{idx}", + "DOC_ID": doc_id, + "CHUNK_INDEX": idx, + "CHUNK_TEXT": chunk.strip(), + } + ) + + # Batch insert chunks + if chunk_data: + chunks_df = pd.DataFrame(chunk_data) + session.write_pandas( + chunks_df, + table_name=CHUNKS_TBL, + auto_create_table=False, + overwrite=False, + quote_identifiers=False, + ) + + # FORCE COMMIT after chunks + session.sql("COMMIT").collect() + + # 3. Generate and store embeddings + session.sql( + f""" + INSERT INTO {EMB_TBL} (CHUNK_ID, EMBEDDING) + SELECT + c.CHUNK_ID, + SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', LEFT(c.CHUNK_TEXT, 10000)) + FROM + {CHUNKS_TBL} c + WHERE + c.DOC_ID = '{sanitize(doc_id)}' + """ + ).collect() + + # FORCE COMMIT after embeddings + session.sql("COMMIT").collect() + + # Verify the document was stored + verify = session.sql( + f"SELECT COUNT(*) as cnt FROM {DOCS_TBL} WHERE DOC_ID='{sanitize(doc_id)}'" + ).collect() + if verify and verify[0][0] > 0: + return True + else: + st.error( + f"❌ {filename}: Verification failed - document not found in database" + ) + return False + + return True + + except Exception as e: + st.error(f"❌ Storage error for {filename}: {str(e)}") + # Best-effort cleanup on failure + try: + session.sql( + f"DELETE FROM {EMB_TBL} WHERE CHUNK_ID IN (SELECT CHUNK_ID FROM {CHUNKS_TBL} WHERE DOC_ID='{sanitize(doc_id)}')" + ).collect() + session.sql( + f"DELETE FROM {CHUNKS_TBL} WHERE DOC_ID='{sanitize(doc_id)}'" + ).collect() + session.sql( + f"DELETE FROM {DOCS_TBL} WHERE DOC_ID='{sanitize(doc_id)}'" + ).collect() + session.sql("COMMIT").collect() # Commit cleanup + except Exception as cleanup_e: + st.error(f"❌ Cleanup failed for {filename}: {str(cleanup_e)}") + return False + + +def delete_document(doc_id: str) -> bool: + """Delete document and related data""" + try: + session.sql( + f"DELETE FROM {EMB_TBL} WHERE CHUNK_ID IN (SELECT CHUNK_ID FROM {CHUNKS_TBL} WHERE DOC_ID='{sanitize(doc_id)}')" + ).collect() + session.sql( + f"DELETE FROM {CHUNKS_TBL} WHERE DOC_ID='{sanitize(doc_id)}'" + ).collect() + session.sql( + f"DELETE FROM {DOCS_TBL} WHERE DOC_ID='{sanitize(doc_id)}'" + ).collect() + return True + except Exception as e: + st.error(f"Delete error: {e}") + return False + + +def get_user_docs() -> pd.DataFrame: + """Get user documents""" + try: + return session.sql( + f"SELECT DOC_ID, FILENAME, FILE_TYPE, FILE_SIZE, UPLOADED_AT FROM {DOCS_TBL} ORDER BY UPLOADED_AT DESC" + ).to_pandas() + except: + return pd.DataFrame() + + +def load_chat_history(session_id: str): + """Load chat history from database""" + try: + rows = session.sql( + f"SELECT QUERY_TEXT, RESPONSE_TEXT FROM {CHAT_TBL} " + f"WHERE SESSION_ID='{sanitize(session_id)}' ORDER BY QUERY_TIMESTAMP" + ).to_pandas() + + messages = [] + for _, r in rows.iterrows(): + messages.append({"role": "user", "content": r["QUERY_TEXT"]}) + messages.append({"role": "assistant", "content": r["RESPONSE_TEXT"]}) + return messages + except: + return [] + + +# ------------- SIDEBAR ------------- +with st.sidebar: + # Enhanced header + st.markdown( + f""" +
+
+
+ πŸ’¬ +
+

+ AIFAQ Pro +

+
+
+ """, + unsafe_allow_html=True, + ) + + st.markdown("---") + + # Enhanced Knowledge Base Management header + st.markdown( + f""" +
+ πŸ“š +

+ Knowledge Base Management +

+
+ """, + unsafe_allow_html=True, + ) + + st.markdown("### πŸ“€ Upload Documents") + + # File uploader outside the processing logic + files = st.file_uploader( + "Choose files", + type=list(SUPPORTED_EXTENSIONS.keys()), + accept_multiple_files=True, + key="file_uploader", + ) + + # Upload button and processing + if files and st.button( + "⚑ Upload & Process", use_container_width=True, type="primary" + ): + progress_bar = st.progress(0) + status_container = st.container() + + success_count = 0 + failed_files = [] + + for idx, file in enumerate(files): + with status_container: + st.info(f"⏳ Processing {file.name}...") + + ext = file.name.split(".")[-1].lower() + file_type = SUPPORTED_EXTENSIONS.get(ext, "TEXT") + + # Extract content - this now reads 100% of all file types including TXT + content = extract_file_content(file, file_type) + + if content: + # All documents are now private by default + if store_document_fast(file.name, file_type, content, public=False): + with status_container: + st.success(f"βœ… {file.name} uploaded successfully!") + success_count += 1 + + # CRITICAL: Force immediate rerun after each successful upload + st.session_state.kb_refresh = True + st.session_state.last_upload_time = time.time() + progress_bar.progress((idx + 1) / len(files)) + time.sleep(0.3) # Brief pause to show success message + st.rerun() # Immediate refresh to update knowledge base + else: + with status_container: + st.error(f"❌ {file.name} failed to upload") + failed_files.append(file.name) + else: + with status_container: + st.warning(f"⚠️ {file.name} - no content extracted") + failed_files.append(file.name) + + progress_bar.progress((idx + 1) / len(files)) + + # This code only runs if all files processed without triggering rerun + progress_bar.empty() + + if success_count > 0: + st.success(f"✨ All done! Successfully uploaded {success_count} file(s)!") + if failed_files: + st.warning(f"⚠️ Failed: {', '.join(failed_files)}") + else: + st.error("❌ No files were successfully processed.") + if failed_files: + st.error(f"Failed files: {', '.join(failed_files)}") + + st.markdown("---") + st.markdown("### πŸ“„ Knowledge Base") + + # Create placeholder for knowledge base that can be updated + kb_container = st.container() + + with kb_container: + # Show upload success indicator + if st.session_state.kb_refresh: + st.success("βœ… Knowledge base updated!") + st.session_state.kb_refresh = False + + # Force fresh database query - this ensures latest data + df = get_user_docs() + + if df.empty: + st.info("Your knowledge base is empty. Upload some files to get started!") + else: + st.caption(f"✨ Total documents: **{len(df)}**") + + # Display most recent uploads first + for _, r in df.iterrows(): + type_icons = { + "PDF": "πŸ“„", + "PowerPoint": "πŸ“Š", + "CSV": "πŸ“ˆ", + "Excel": "πŸ“Š", + "TEXT": "πŸ“", + } + icon = type_icons.get(r["FILE_TYPE"], "πŸ“„") + + with st.expander(f"{icon} {r['FILENAME']}", expanded=False): + st.caption(f"**Type:** {r['FILE_TYPE']}") + st.caption(f"**Size:** {r['FILE_SIZE']:,} characters") + st.caption( + f"**Uploaded:** {r['UPLOADED_AT'].strftime('%Y-%m-%d %H:%M')}" + ) + + if st.button( + "πŸ—‘οΈ Delete", key=f"del_{r['DOC_ID']}", use_container_width=True + ): + if delete_document(r["DOC_ID"]): + st.success("Document deleted!") + time.sleep(0.5) + st.rerun() + else: + st.error("Failed to delete document") + + st.markdown("---") + st.markdown("### πŸ’¬ Chat Sessions") + if st.button("βž• New chat", use_container_width=True): + st.session_state.current = str(uuid.uuid4()) + st.session_state.sessions[st.session_state.current] = { + "title": "New chat", + "messages": [], + } + st.rerun() + + try: + chats = session.sql( + f"SELECT DISTINCT SESSION_ID, LEFT(QUERY_TEXT,40) TITLE, MAX(QUERY_TIMESTAMP) TS " + f"FROM {CHAT_TBL} " + f"GROUP BY SESSION_ID, QUERY_TEXT ORDER BY TS DESC" + ).to_pandas() + + if not chats.empty: + for _, c in chats.iterrows(): + btn_label = c["TITLE"] + "..." if len(c["TITLE"]) >= 40 else c["TITLE"] + if st.button( + f"πŸ’¬ {btn_label}", + key=f"chat_{c['SESSION_ID']}", + use_container_width=True, + ): + st.session_state.current = c["SESSION_ID"] + # Load chat history from database + loaded_messages = load_chat_history(c["SESSION_ID"]) + st.session_state.sessions[c["SESSION_ID"]] = { + "title": btn_label, + "messages": loaded_messages, + } + st.rerun() + except Exception: + pass + + if st.button("πŸ—‘οΈ Clear current chat", use_container_width=True): + try: + session.sql( + f"DELETE FROM {CHAT_TBL} WHERE SESSION_ID='{sanitize(st.session_state.current)}'" + ).collect() + st.session_state.sessions[st.session_state.current]["messages"].clear() + st.success("Chat history cleared!") + st.rerun() + except Exception as e: + st.error(f"Error clearing chat: {e}") + +# ------------- MAIN CHAT INTERFACE ------------- +st.markdown( + f""" +
+
+
+ πŸ’¬ +
+

+ Chat with AIFAQ Pro +

+
+

+ Private and secure AI-powered conversations with your enterprise data +

+
+""", + unsafe_allow_html=True, +) + +llm_selected = st.selectbox( + "🧠 Choose Language Model", + LLM_OPTIONS, + index=LLM_OPTIONS.index(st.session_state.llm), + key="llm_selector", +) +st.session_state.llm = llm_selected + +st.markdown("---") + +# Ensure current session exists +if st.session_state.current not in st.session_state.sessions: + st.session_state.sessions[st.session_state.current] = { + "title": "New chat", + "messages": [], + } + +messages = st.session_state.sessions[st.session_state.current]["messages"] + +# Display messages - Beautiful modern design with enhanced styling +chat_container = st.container() +with chat_container: + if not messages: + st.markdown( + f""" +
+
+

+ πŸ‘‹ Welcome to AIFAQ Pro AI Assistant +

+

+ Upload to your knowledge base and start asking questions to unlock insights
+ + Powered by advanced AI β€’ Fast β€’ Secure + +

+
+
+ """, + unsafe_allow_html=True, + ) + else: + for idx, msg in enumerate(messages): + if msg["role"] == "user": + st.markdown( + f'
' + f'
' + f'{msg["content"]}
', + unsafe_allow_html=True, + ) + else: + st.markdown( + f'
' + f'
' + f'
' + f'{msg["content"]}
', + unsafe_allow_html=True, + ) + + # Add CSS animation + st.markdown( + """ + + """, + unsafe_allow_html=True, + ) + +# Input form - Beautiful modern design with enhanced styling +with st.form("chat_form", clear_on_submit=True): + # Enhanced input styling + st.markdown( + f""" + + """, + unsafe_allow_html=True, + ) + + prompt = st.text_area( + "message", + placeholder="πŸ” Type your question or search your knowledge base...", + height=90, + label_visibility="collapsed", + key="chat_input", + ) + + # Action buttons with enhanced design + col1, col2, col3 = st.columns([6, 1.5, 1]) + with col1: + st.markdown( + f""" +
+ + πŸ’‘ Tip: Be specific and detailed for best results + +
+ """, + unsafe_allow_html=True, + ) + with col2: + send = st.form_submit_button( + "✨ Send", use_container_width=True, type="primary" + ) + with col3: + clear = st.form_submit_button("Clear", use_container_width=True) + + if clear: + st.session_state.sessions[st.session_state.current]["messages"].clear() + st.rerun() + + if send and prompt.strip(): + messages.append({"role": "user", "content": prompt.strip()}) + + with st.spinner("🧠 Thinking..."): + try: + # Search for relevant document chunks + rows = session.sql( + f""" + WITH qv AS ( + SELECT SNOWFLAKE.CORTEX.EMBED_TEXT_768('snowflake-arctic-embed-m', + LEFT('{sanitize(prompt.strip())}', 10000)) q_vec + ), + sim AS ( + SELECT c.CHUNK_TEXT, d.FILENAME, d.FILE_TYPE, + VECTOR_COSINE_SIMILARITY(e.EMBEDDING, qv.q_vec) AS SIMILARITY_SCORE + FROM {CHUNKS_TBL} c + JOIN {EMB_TBL} e ON c.CHUNK_ID = e.CHUNK_ID + JOIN {DOCS_TBL} d ON c.DOC_ID = d.DOC_ID + CROSS JOIN qv + WHERE VECTOR_COSINE_SIMILARITY(e.EMBEDDING, qv.q_vec) > 0.3 + ORDER BY SIMILARITY_SCORE DESC + LIMIT 10 + ) + SELECT CHUNK_TEXT, FILENAME, FILE_TYPE, SIMILARITY_SCORE FROM sim + """ + ).to_pandas() + + if rows.empty: + answer = "I couldn't find any relevant information in your knowledge base to answer your question. Please upload some files first or try rephrasing your question." + else: + # Create context from relevant chunks + context_parts = [] + for _, row in rows.iterrows(): + context_parts.append( + f"[From {row['FILENAME']} ({row['FILE_TYPE']})]\n{row['CHUNK_TEXT']}" + ) + context = "\n\n---\n\n".join(context_parts) + + # Generate response using LLM with source tracking + prompt_llm = ( + f"You are a helpful assistant that answers questions based on the provided knowledge base context. " + f"Answer the user's question using only the information from the provided knowledge base. " + f"If the context contains numerical data, tables, or statistics, include them in your answer. " + f"Be concise but comprehensive.\n\n" + f"Context:\n{context}\n\n" + f"Question: {prompt.strip()}\n\n" + f"Answer:" + ) + + ans_rows = session.sql( + f"SELECT SNOWFLAKE.CORTEX.COMPLETE('{sanitize(st.session_state.llm)}', " + f"'{sanitize(prompt_llm)}') as ans" + ).collect() + answer = ( + str(ans_rows[0][0]) + if ans_rows + else "The LLM service didn't return a response." + ) + + # Cite only the PRIMARY source (highest similarity score) + # Group by filename and get the highest similarity for each document + source_scores = ( + rows.groupby("FILENAME")["SIMILARITY_SCORE"] + .max() + .sort_values(ascending=False) + ) + + # Get top source(s) - only cite documents with similarity > 0.5 (strong match) + top_sources = [] + for filename, score in source_scores.items(): + if score > 0.5: # Strong relevance threshold + top_sources.append(filename) + if len(top_sources) >= 2: # Max 2 sources + break + + # If no strong matches, just use the top result + if not top_sources: + top_sources = [source_scores.index[0]] + + # Add source attribution - only the primary source(s) used + if len(top_sources) == 1: + sources_md = f"\n\n---\n**Source:** {top_sources[0]}" + else: + sources_list_md = "\n- ".join(top_sources) + sources_md = ( + f"\n\n---\n" f"**Sources:**\n" f"- {sources_list_md}" + ) + answer += sources_md + + except Exception as e: + answer = f"❌ Error processing your request: {str(e)}" + + messages.append({"role": "assistant", "content": answer}) + + # Persist chat history + try: + session.write_pandas( + pd.DataFrame( + [ + { + "CHAT_ID": str(uuid.uuid4()), + "SESSION_ID": st.session_state.current, + "QUERY_TEXT": prompt.strip(), + "RESPONSE_TEXT": answer, + "QUERY_TIMESTAMP": dt.datetime.utcnow().strftime( + "%Y-%m-%d %H:%M:%S" + ), + } + ] + ), + table_name=CHAT_TBL, + auto_create_table=False, + overwrite=False, + ) + except Exception: + pass # Chat history persistence is optional + + st.rerun() diff --git a/version_1/readme.md b/version_1/readme.md new file mode 100644 index 0000000..8d7d420 --- /dev/null +++ b/version_1/readme.md @@ -0,0 +1,171 @@ +# Version 1 (Step-by-Step Guide) + +This repository provides a **minimal, end-to-end guide** to deploy and test the **AIFAQ chatbot version 1** on **Snowflake Cloud** using **Snowflake Cortex** and **Streamlit** ( This test project folder is designed to be beginner-friendly and introduces users to Cortex AI on the Snowflake cloud ). + +The goal is to help you quickly validate the system using Snowflake’s free trial credits and run a **document-aware, context-based chatbot** with minimal setup. + +--- + +## Overview + +This implementation consists of **two core files**: + +- **`setup.sql`** - Provisions all required Snowflake infrastructure (warehouse, database, schemas, tables, roles, etc.) +- **`app.py`** - Streamlit application that runs entirely inside Snowflake and uses Cortex LLMs for answering questions from uploaded documents + +--- + +## Prerequisites + +### 1. Create a Snowflake Account + +- Create a Snowflake account from the official website. +- Snowflake typically provides **free trial credits** (commonly **$300–$400**, depending on region and time). +- These credits are sufficient to fully test this repository. + +### 2. Select the Cloud Provider + +When creating the account, select one of the following: + +- βœ… **AWS** +- βœ… **Azure** +- ❌ **GCP** (Snowflake Cortex AI is **not supported on GCP at the time of writing**) + +Choosing AWS or Azure avoids unnecessary complexity in later steps. + +--- + +## Step 1: Log in to Snowflake (Snowsight UI) + +1. Log in to your Snowflake account. +2. You will land on the **Snowsight Dashboard**. +3. From the left sidebar, open **Worksheets**. + +--- + +## Step 2: Verify Snowflake Cortex Availability + +Before running anything in the worksheets, confirm that **Cortex AI functions** are available in your account region. + +### Check Cortex LLM availability: +- https://docs.snowflake.com/en/user-guide/snowflake-cortex/aisql#label-cortex-llm-availability + +This page shows: +- Which regions support Cortex +- Which LLMs are available in each region + +### If Cortex is NOT available in your region + +If your account was created in a region without Cortex support: + +1. Follow the **Cross-Region Inference** guide: + - https://docs.snowflake.com/en/user-guide/snowflake-cortex/cross-region-inference +2. Use `ALTER ACCOUNT` to enable inference in a supported region. +3. This step is **mandatory** for the app to work. + +--- + +## Step 3: Run `setup.sql` (Infrastructure Setup) + +1. In **Snowsight**, click **+ Worksheet** β†’ **SQL Worksheet** +2. A new SQL file is created automatically. +3. Copy the **entire contents** of `setup.sql` from this repository. +4. Paste it into the worksheet. +5. **Run all statements**. + +This script will: +- Create the required **warehouse** +- Create the **database and schemas** +- Create all necessary **tables** +- Configure permissions needed for the Streamlit app + +Once this completes successfully, the Snowflake-side infrastructure is ready. + +--- + +## Step 4: Create the Streamlit App in Snowflake + +1. In **Snowsight**, go to: + - **Projects** β†’ **Streamlit** +2. Click **Create Streamlit App** +3. When prompted, select: + - **Warehouse** β†’ the one created in `setup.sql` + - **Database** β†’ the one created in `setup.sql` + - **Schema** β†’ as defined in `setup.sql` + +Snowflake will create a default file called: **streamlit_app.py** + + +--- + +## Step 5: Add the Application Code (`app.py`) + +1. Open the newly created **`streamlit_app.py`** file in Snowsight. +2. Delete the default contents. +3. Copy the full contents of **`app.py`** from this repository. +4. Paste it into `streamlit_app.py`. +5. Save the file. + +--- + +## Step 6: Install Python Dependencies + +Snowflake Streamlit apps require **manual dependency installation**. + +1. In the Streamlit app UI, locate the **Python Packages / Environment** section. +2. Under the selected **Python version**, manually add all required libraries. +3. Add them **one by one**, exactly as required by `app.py`. + +(There is no automatic `requirements.txt` resolution in Snowflake Streamlit.) + +Once all dependencies are installed, Snowflake will reinitialize the app. + +--- + +## Step 7: Run and Test the Chatbot + +You are now ready to test the system. + +### What you can do in the UI: +- Upload documents in formats such as: + - PDF + - TXT + - CSV + - DOCX +- Ask natural-language questions about the uploaded documents +- Receive **context-aware answers** powered by **Snowflake Cortex LLMs** + +The chatbot: +- Retrieves relevant document context +- Uses Cortex AI functions for reasoning +- Responds conversationally through Streamlit + +--- + +## What This Setup Demonstrates + +- End-to-end AIFAQ deployment inside Snowflake +- Snowflake-native Streamlit application +- Secure document ingestion and querying +- LLM-powered question answering using Cortex +- Zero external infrastructure required + +--- + +## Notes & Limitations + +- Cortex availability is **region-dependent** +- GCP is not supported for Cortex at the time of writing +- Dependency management in Snowflake Streamlit is manual by design +- Trial credits are limited; monitor usage + +--- + +## Next Steps + +- Extend authentication and user isolation +- Add vector search optimizations +- Integrate additional LLMs available in Cortex +- Productionize with role-based access controls + +--- diff --git a/version_1/setup.sql b/version_1/setup.sql new file mode 100644 index 0000000..9eeb521 --- /dev/null +++ b/version_1/setup.sql @@ -0,0 +1,53 @@ +-- Create database +CREATE OR REPLACE DATABASE AI_FAQ_DB; + +-- Create warehouse +CREATE OR REPLACE WAREHOUSE AI_FAQ_WH + WAREHOUSE_SIZE = 'XSMALL' + WAREHOUSE_TYPE = 'STANDARD' + AUTO_SUSPEND = 300 + AUTO_RESUME = TRUE; + +-- Use the new database and warehouse +USE DATABASE AI_FAQ_DB; +USE WAREHOUSE AI_FAQ_WH; + +-- Create DOCUMENTS table +CREATE OR REPLACE TABLE DOCUMENTS ( + DOC_ID VARCHAR(36) PRIMARY KEY, + FILENAME VARCHAR(255) NOT NULL, + FILE_TYPE VARCHAR(50), + FILE_SIZE NUMBER, + IS_PUBLIC BOOLEAN DEFAULT FALSE, + UPLOADED_AT TIMESTAMP_LTZ(9) DEFAULT CURRENT_TIMESTAMP() +); + +-- Create CHUNKS table +CREATE OR REPLACE TABLE CHUNKS ( + CHUNK_ID VARCHAR(50) PRIMARY KEY, + DOC_ID VARCHAR(36) NOT NULL, + CHUNK_INDEX NUMBER NOT NULL, + CHUNK_TEXT VARCHAR(10000) NOT NULL, + FOREIGN KEY (DOC_ID) REFERENCES DOCUMENTS(DOC_ID) +); + +-- Create EMBEDDINGS table +CREATE OR REPLACE TABLE EMBEDDINGS ( + CHUNK_ID VARCHAR(50) PRIMARY KEY, + EMBEDDING ARRAY, + FOREIGN KEY (CHUNK_ID) REFERENCES CHUNKS(CHUNK_ID) +); + +-- Create CHAT_HISTORY table +CREATE OR REPLACE TABLE CHAT_HISTORY ( + CHAT_ID VARCHAR(36) PRIMARY KEY, + SESSION_ID VARCHAR(36) NOT NULL, + QUERY_TEXT VARCHAR(10000) NOT NULL, + RESPONSE_TEXT VARCHAR(10000), + QUERY_TIMESTAMP TIMESTAMP_LTZ(9) DEFAULT CURRENT_TIMESTAMP() +); + +-- Grant privileges to SYSADMIN role +GRANT ALL ON DATABASE AI_FAQ_DB TO ROLE SYSADMIN; +GRANT ALL ON WAREHOUSE AI_FAQ_WH TO ROLE SYSADMIN; +GRANT ALL ON ALL TABLES IN SCHEMA AI_FAQ_DB.PUBLIC TO ROLE SYSADMIN; \ No newline at end of file diff --git a/src/core/routes/__init__.py b/version_2/app_version2.py similarity index 100% rename from src/core/routes/__init__.py rename to version_2/app_version2.py diff --git a/version_2/environment.yml b/version_2/environment.yml new file mode 100644 index 0000000..0a51a4a --- /dev/null +++ b/version_2/environment.yml @@ -0,0 +1,29 @@ +name: aifaq_pro_env +channels: + - snowflake + - conda-forge + - defaults + +dependencies: + # Python version (use what's supported by Snowflake) + - python=3.10 + + # Snowflake libraries + - snowflake-snowpark-python=1.11.0 + - snowflake-ml-python=1.4.0 + + # Streamlit (Snowflake's managed version) + - streamlit=1.28.2 + - snowflake-streamlit=0.1.0 + + # Data processing + - pandas=2.0.3 + - numpy=1.24.3 + + # Utilities + - pip + + - pip: + # Additional packages via pip if needed + - python-dateutil>=2.8.0 + - pytz>=2023.3 \ No newline at end of file diff --git a/version_2/manifest.yml b/version_2/manifest.yml new file mode 100644 index 0000000..089a08f --- /dev/null +++ b/version_2/manifest.yml @@ -0,0 +1,64 @@ +# Snowflake Native App Manifest +manifest_version: 1 + +# Application metadata +version: "1.0.0" +label: "AIFAQ Pro" +description: "AI-powered FAQ assistant with document ingestion and team-based access control" +author: "AIFAQ Pro Team" +icon: "🏒" + +# Main entry point +main_file: "app.py" +streamlit: + page_title: "AIFAQ Pro" + page_icon: "🏒" + layout: "wide" + initial_sidebar_state: "expanded" + +# Required Snowflake privileges +privileges: + cortex: + - COMPLETE + - PARSE_DOCUMENT + - EMBED_TEXT_768 + storage: + - PUT_FILE + - GET_FILE + - LIST + database: + - CREATE_SCHEMA + - CREATE_TABLE + - CREATE_STAGE + +# Application configuration +configuration: + database: + name: AIFAQ_BETA_DB + schema: APP_SCHEMA + stage: + name: DOC_STAGE + type: USER + +# Default environment variables +environment: + SNOWFLAKE_DEFAULT_CONNECTION_NAME: ${SNOWFLAKE_CONNECTION_NAME} + STREAMLIT_BROWSER_GATHER_USAGE_STATS: false + +# Resources +resources: + - name: chat_sessions + type: table + label: "Chat Sessions" + - name: documents + type: table + label: "Uploaded Documents" + - name: chunks + type: table + label: "Document Chunks (Vector Embeddings)" + +# Required for marketplace +marketplace: + category: "AI/ML" + license: "LICENSE" + documentation: "README.md" \ No newline at end of file diff --git a/version_2/readme.md b/version_2/readme.md new file mode 100644 index 0000000..1536a63 --- /dev/null +++ b/version_2/readme.md @@ -0,0 +1,470 @@ +# AIFAQ Pro version 2 - Complete Deployment & User Guide + +This README provides comprehensive instructions for deploying AIFAQ Pro to Snowflake Marketplace and using it effectively. + +--- + +## πŸ“‚ File Structure Overview + +Your deployment package contains 5 essential files: + +``` +aifaq-pro-app/version_2/ +β”œβ”€β”€ app_version2.py # Main Streamlit application (our provided code) +β”œβ”€β”€ manifest.yml # App configuration & metadata +β”œβ”€β”€ setup.sql # Database objects & schema setup +β”œβ”€β”€ environment.yml # Python environment & dependencies +└── snowflake.yml # SnowCLI deployment configuration +``` + +--- + +## πŸš€ Deployment Methods + +### **Method 1: SnowCLI (Recommended for Developers)** + +#### Step 1: Install SnowCLI +```bash +# Install via pip +pip install snowflake-cli-labs + +# Verify installation +snow --version +``` + +#### Step 2: Configure Connection +```bash +# Interactive setup +snow connection add + +# Or create config manually at ~/.snowflake/config.toml +[connections.marketplace_deploy] +account = "your-account" +user = "your_username" +warehouse = "COMPUTE_WH" +role = "ACCOUNTADMIN" +authenticator = "snowflake" +``` + +#### Step 3: Deploy Application +```bash +# Navigate to project folder +cd project folder + +# Deploy (creates package and app) +snow app run + +# Check status +snow app list +``` + +#### Step 4: Create Marketplace Package +```bash +# Add a version +snow app version create 1.0.0 + +# Upload to stage +snow app version upload 1.0.0 + +# Create release directive for marketplace +snow app version get-release-directive 1.0.0 +``` + +--- + +### **Method 2: Snowflake UI (Classic Console)** + +#### Step 1: Create Application Package +```sql +-- Run as ACCOUNTADMIN +CREATE APPLICATION PACKAGE AIFAQ_PRO_PKG + DISTRIBUTION = PUBLIC + COMMENT = 'AI-powered FAQ assistant for enterprises'; +``` + +#### Step 2: Upload Files to Stage + +In Snowsight or Classic UI: +1. Navigate to **Data > Databases > AIFAQ_PRO_PKG > Stages** +2. Click on the automatically created stage +3. Upload all 7 files using the **+ Files** button + +Or use SQL: +```sql +-- Stage each file +PUT file:///path/to/aifaq_app.py @AIFAQ_PRO_PKG.stage/1.0.0/ OVERWRITE=TRUE; +PUT file:///path/to/manifest.yml @AIFAQ_PRO_PKG.stage/1.0.0/ OVERWRITE=TRUE; +PUT file:///path/to/setup.sql @AIFAQ_PRO_PKG.stage/1.0.0/ OVERWRITE=TRUE; +PUT file:///path/to/environment.yml @AIFAQ_PRO_PKG.stage/1.0.0/ OVERWRITE=TRUE; +PUT file:///path/to/snowflake.yml @AIFAQ_PRO_PKG.stage/1.0.0/ OVERWRITE=TRUE; +PUT file:///path/to/requirements.txt @AIFAQ_PRO_PKG.stage/1.0.0/ OVERWRITE=TRUE; +PUT file:///path/to/LICENSE @AIFAQ_PRO_PKG.stage/1.0.0/ OVERWRITE=TRUE; +``` + +#### Step 3: Add Version to Package +```sql +-- Create version from staged files +ALTER APPLICATION PACKAGE AIFAQ_PRO_PKG + ADD VERSION 1.0.0 + USING '@AIFAQ_PRO_PKG.stage/1.0.0'; +``` + +#### Step 4: Create Test Application (Optional) +```sql +-- Test before publishing +CREATE APPLICATION AIFAQ_PRO_TEST + FROM APPLICATION PACKAGE AIFAQ_PRO_PKG + USING VERSION 1.0.0; +``` + +--- + +### **Method 3: Snowflake UI (Snowsight)** + +#### Step 1: Enable Partner Connect +1. Go to **Admin > Partner Connect** +2. Enable **Snowflake Native Apps Development** + +#### Step 2: Create Package +1. Navigate to **Data Products > Native Apps** +2. Click **Create Application Package** +3. Fill in: + - Name: `AIFAQ_PRO_PKG` + - Distribution: `Public` + - Comment: Description + +#### Step 3: Upload & Release +1. In your package, go to **Versions** +2. Click **Create Version** +3. Drag-and-drop all 7 files +4. Set version number to `1.0.0` +5. Click **Create Release Directive** + +--- + +## 🎯 Post-Installation Setup + +After deploying, complete these **mandatory** steps: + +### **1. Grant Cortex Privileges** +```sql +-- Run as ACCOUNTADMIN in consumer account +GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO APPLICATION AIFAQ_PRO_APP; + +-- Grant warehouse access +GRANT USAGE ON WAREHOUSE COMPUTE_WH TO APPLICATION AIFAQ_PRO_APP; +``` + +### **2. Verify Installation** +```sql +-- Check if app is running +SHOW APPLICATIONS; + +-- Should see: AIFAQ_PRO_APP | RUNNING +``` + +### **3. Launch Streamlit App** +1. Go to **Data Products > Native Apps** +2. Click on **AIFAQ Pro** +3. Click **Open Streamlit App** + +--- + +## πŸ‘€ User Guide + +### **For First-Time Admin Users** + +#### Step 1: Initial Login +- The user who installed the app is automatically the first admin +- **Username**: Your Snowflake username +- **Password**: Your Snowflake password (single sign-on via Streamlit) + +#### Step 2: Create Teams +1. In sidebar, click **🏷️ Teams** +2. Click **βž• Create Team** +3. Enter team name (e.g., "Finance", "Engineering") +4. Click **Create Team** + +#### Step 3: Create Categories +1. Go to **πŸ” Access Control** +2. Expand **🏷️ Manage Categories** +3. Click **βž• Add New Category** +4. Enter category name (e.g., "Financial Docs", "HR Policies") +5. Click **Create** + +#### Step 4: Grant Access +1. Still in **Access Control** +2. Under **βž• Grant Team Access**: + - Select Team (e.g., "Finance") + - Select Categories (e.g., "Financial Docs", "General") + - Click **Grant** + +#### Step 5: Add Users +1. Go to **πŸ‘₯ User Management** +2. Under **βž• Create User**: + - Username: `JOHN_DOE` + - Password: Min 6 characters + - Team: Select from dropdown + - Click **Create User** +3. Repeat for all users + +#### Step 6: Upload Documents +1. Go to **πŸ“‚ Document Management** +2. Under **πŸ“€ Upload Document**: + - Choose file (PDF, TXT, DOCX) + - Select Category + - Click **Index Document** +3. Wait for confirmation: *"Document indexed with X chunks"* + +--- + +### **For End Users (Non-Admin)** + +#### Step 1: Login +- Your admin will provide credentials +- **Note**: First-time users in "GUEST" team have no access until assigned + +#### Step 2: Start Chatting +1. Click **✨ New Chat** in sidebar +2. Type question in chat input +3. Toggle mode: + - **⚑ Quick**: Fast answers + - **🧠 Deep**: Detailed analysis +4. View sources below each answer + +#### Step 3: View History +- All previous chats appear in sidebar +- Click any chat to resume +- Use **Γ—** to delete old chats + +--- + +## πŸ”§ Configuration & Customization + +### **Modifying RAG Settings** +Edit these values in `aifaq_app.py` under **ENHANCED CONSTANTS & CONFIGS**: + +```python +RAG_CONFIG = { + "max_chunks": 6, # Reduce for faster responses + "similarity_threshold": 0.15, # Increase for stricter matching + "rerank_candidates": 25, # Increase for better recall + "max_chunk_text": 700, # Reduce for faster embedding +} +``` + +### **Changing AI Models** +In `aifaq_app.py`, update: + +```python +MODEL_SMALL = "mistral-7b" # For Quick mode +MODEL_LARGE = "mixtral-8x7b" # For Deep mode +EMBED_MODEL = "snowflake-arctic-embed-m" # Keep this fixed +``` + +**Supported Models by Region**: Check [Snowflake Cortex Docs](https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions) + +### **Adding New File Types** +In `setup.sql`, modify stage: +```sql +CREATE STAGE DOC_STAGE + FILE_FORMAT = (TYPE = 'CSV') -- Supports BINARY for any file type +``` + +--- + +## πŸ› Troubleshooting + +### **App Won't Start** +**Error**: `"Failed to start application"` +- **Solution**: Grant Cortex privileges (see Post-Installation Setup #1) +- **Solution**: Check warehouse exists and is running + +### **"No document access" Error** +**Cause**: User not assigned to team or team lacks category access +- **Solution**: + 1. Admin: Go to User Management + 2. Assign user to a team + 3. In Access Control, grant team β†’ category mapping + +### **Document Upload Fails** +**Error**: `"Failed to parse document"` +- **Solution**: Verify file type (PDF, TXT, DOCX only) +- **Solution**: Check file size (< 50MB recommended) +- **Solution**: Grant stage WRITE privileges: +```sql +GRANT WRITE ON STAGE AIFAQ_PRO_APP.APP_SCHEMA.DOC_STAGE TO APPLICATION ROLE AIFAQ_PRO_APP.PUBLIC; +``` + +### **Slow Chat Responses** +- **Solution**: Use **⚑ Quick Mode** instead of 🧠 Deep +- **Solution**: Reduce `RAG_CONFIG["max_chunks"]` to 3-4 +- **Solution**: Upgrade warehouse size (Medium β†’ Large) +- **Solution**: Check for unoptimized queries in `search()` function + +### **Embedding Errors** +**Error**: `"SQL compilation error: cortex function not available"` +- **Solution**: Confirm `snowflake-arctic-embed-m` is available in your region +- **Solution**: Run: `GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO APPLICATION AIFAQ_PRO_APP;` + +### **User Creation Fails** +**Error**: `"Invalid username or password < 6 chars"` +- **Solution**: Username must be alphanumeric + underscores only +- **Solution**: Password must be β‰₯ 6 characters +- **Solution**: User must not already exist in Snowflake account + +--- + +## πŸ“Š Monitoring & Maintenance + +### **View App Usage** +```sql +-- Run as ACCOUNTADMIN +SELECT * FROM TABLE(AIFAQ_PRO_APP.APP_SCHEMA.CHAT_SESSIONS()); +SELECT COUNT(*) FROM AIFAQ_PRO_APP.APP_SCHEMA.DOCUMENTS; +``` + +### **Clean Up Old Data** +```sql +-- Delete chats older than 30 days +DELETE FROM AIFAQ_PRO_APP.APP_SCHEMA.CHAT_SESSIONS +WHERE CREATED_AT < DATEADD(DAY, -30, CURRENT_TIMESTAMP()); + +-- Delete orphaned chunks +DELETE FROM AIFAQ_PRO_APP.APP_SCHEMA.CHUNKS +WHERE DOC_ID NOT IN (SELECT DOC_ID FROM AIFAQ_PRO_APP.APP_SCHEMA.DOCUMENTS); +``` + +### **Backup Configuration** +Export important tables: +```sql +COPY INTO @my_backup_stage/ +FROM AIFAQ_PRO_APP.APP_SCHEMA.TEAMS +FILE_FORMAT = (TYPE = CSV); +``` + +--- + +## πŸͺ Publishing to Snowflake Marketplace + +### **Step 1: Prepare Listing** + +1. **Screenshots**: Capture 3-5 key screens (Chat, Admin Dashboard, Document Upload) +2. **Icon**: Create 200x200px PNG icon (the 🏒 emoji works as placeholder) +3. **Description**: Write compelling app description (max 2000 chars) +4. **Pricing**: Decide: + - **Free**: No charges + - **Paid**: Set monthly/annual price + - **BYOL**: Customers bring their own license + +### **Step 2: Submit via Provider Portal** + +1. Go to [Snowflake Marketplace Provider Portal](https://providers.snowflake.com) +2. Click **Create Listing** +3. Fill in: + - **Listing Name**: AIFAQ Pro + - **Category**: AI/ML + - **Package**: `AIFAQ_PRO_PKG` + - **Version**: `1.0.0` + - **Regions**: Select all available regions +4. Upload: + - README.md + - Screenshots + - Icon + - Support contact +5. Submit for Review + +### **Step 3: Certification Process** +- Snowflake reviews security, performance, and compliance +- Typical timeline: 5-10 business days +- Address any feedback promptly + +### **Step 4: Go Live** +- Once approved, click **Publish** +- App becomes visible in Snowflake Marketplace +- Monitor analytics in Provider Portal + +--- + +## πŸ“ž Support & Resources + +### **Documentation** +- [Snowflake Native Apps Docs](https://docs.snowflake.com/en/developer-guide/native-apps/overview) +- [Cortex LLM Functions](https://docs.snowflake.com/en/user-guide/snowflake-cortex/llm-functions) +- [Streamlit in Snowflake](https://docs.snowflake.com/en/developer-guide/streamlit/about-streamlit) + +### **Community** +- [Snowflake Community](https://community.snowflake.com) +- [Stack Overflow: snowflake-native-apps](https://stackoverflow.com/questions/tagged/snowflake-native-apps) + +### **Contact** +- **Technical Issues**: Open issue in your repository +- **Feature Requests**: Use GitHub Issues with `enhancement` label +- **Emergency Support**: Email info@aifaq.pro ( might take 1 to 2 days for reply) + +--- + +## πŸ”„ Updating the App + +### **Minor Updates (Bug Fixes)** + +```bash +# Update code +# Bump version in manifest.yml (e.g., 1.0.0 β†’ 1.0.1) +snow app version create 1.0.1 +snow app version upload 1.0.1 +``` + +In UI: +```sql +ALTER APPLICATION PACKAGE AIFAQ_PRO_PKG + ADD VERSION 1.0.1 USING '@AIFAQ_PRO_PKG.stage/1.0.1'; +``` + +### **Major Updates (New Features)** + +1. Update version in: + - `manifest.yml` (version) + - `snowflake.yml` (version) +2. Add to `setup.sql`: +```sql +-- Migration script for v2.0 +ALTER TABLE APP_USER_TEAMS ADD COLUMN IF NOT EXISTS EMAIL VARCHAR; +``` +3. Deploy new version +4. Test thoroughly before releasing +5. Update marketplace listing + +--- + +## πŸ“‹ Pre-Deployment Checklist + +Before deploying to production, verify: + +- [ ] All 7 files are present and validated +- [ ] `manifest.yml` has correct author/contact info +- [ ] `setup.sql` has no syntax errors (test in worksheet) +- [ ] `environment.yml` uses supported Python version (3.10) +- [ ] Cortex models are available in target regions +- [ ] Default warehouse exists (`COMPUTE_WH`) +- [ ] Created at least 3 test users and 2 teams +- [ ] Uploaded sample documents in each category +- [ ] Tested both Quick and Deep modes +- [ ] Verified admin functions (grant/revoke access) +- [ ] Added company branding (logo, colors) +- [ ] Created demo video (2-3 minutes) +- [ ] Set up support email/portal +- [ ] Prepared pricing strategy +- [ ] Added telemetry for usage analytics + +--- + +## Quick Start Summary + +**For Admins**: +1. Deploy β†’ Grant Cortex β†’ Launch App +2. Create Teams β†’ Create Categories β†’ Grant Access +3. Add Users β†’ Upload Documents β†’ Done! + +**For Users**: +1. Login β†’ New Chat β†’ Ask Questions β†’ View Sources diff --git a/version_2/setup.sql b/version_2/setup.sql new file mode 100644 index 0000000..af81524 --- /dev/null +++ b/version_2/setup.sql @@ -0,0 +1,168 @@ +-- ========================================== +-- AIFAQ PRO - SNOWFLAKE NATIVE APP SETUP +-- ========================================== + +-- Create the application database and schema +CREATE DATABASE IF NOT EXISTS {{ application_name }}; +CREATE SCHEMA IF NOT EXISTS {{ application_name }}.APP_SCHEMA; + +-- Use the application context +USE SCHEMA {{ application_name }}.APP_SCHEMA; + +-- ========================================== +-- STAGE FOR DOCUMENT STORAGE +-- ========================================== +CREATE STAGE IF NOT EXISTS DOC_STAGE + FILE_FORMAT = ( + TYPE = 'CSV' -- Default, will be overridden by PUT + FIELD_DELIMITER = NONE + RECORD_DELIMITER = NONE + ) + DIRECTORY = ENABLE; + +-- Grant privileges on stage to application role +GRANT READ ON STAGE DOC_STAGE TO APPLICATION ROLE {{ app_role }}; +GRANT WRITE ON STAGE DOC_SCHEMA TO APPLICATION ROLE {{ app_role }}; + +-- ========================================== +-- TABLES +-- ========================================== + +-- User Teams Mapping +CREATE TABLE IF NOT EXISTS APP_USER_TEAMS ( + USERNAME VARCHAR(255) NOT NULL, + TEAM_NAME VARCHAR(100) NOT NULL, + UPDATED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- Role Access Mapping (Team -> Category) +CREATE TABLE IF NOT EXISTS ROLE_ACCESS_MAPPING ( + ROLE_NAME VARCHAR(100) NOT NULL, + ALLOWED_CATEGORY VARCHAR(100) NOT NULL, + CREATED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- Admin Users +CREATE TABLE IF NOT EXISTS ADMIN_USERS ( + USERNAME VARCHAR(255) PRIMARY KEY, + GRANTED_BY VARCHAR(255), + GRANTED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- Teams Definition +CREATE TABLE IF NOT EXISTS TEAMS ( + TEAM_NAME VARCHAR(100) PRIMARY KEY, + DESCRIPTION VARCHAR(500), + CREATED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- Chat Sessions +CREATE TABLE IF NOT EXISTS CHAT_SESSIONS ( + SESSION_ID VARCHAR(36) PRIMARY KEY, + USERNAME VARCHAR(255) NOT NULL, + TITLE VARCHAR(200), + CREATED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP(), + UPDATED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- Chat Messages +CREATE TABLE IF NOT EXISTS CHAT_MESSAGES ( + MESSAGE_ID VARCHAR(36) PRIMARY KEY, + SESSION_ID VARCHAR(36) NOT NULL, + ROLE VARCHAR(10) NOT NULL, -- 'user' or 'assistant' + CONTENT VARCHAR, -- Use VARCHAR without length for large text + SOURCES VARCHAR(1000), + CREATED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- Documents +CREATE TABLE IF NOT EXISTS DOCUMENTS ( + DOC_ID VARCHAR(36) PRIMARY KEY, + FILENAME VARCHAR(255), + CATEGORY VARCHAR(100), + UPLOADED_BY VARCHAR(255), + UPLOAD_TS TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- Document Chunks with Vector Embeddings +CREATE TABLE IF NOT EXISTS CHUNKS ( + CHUNK_ID VARCHAR(36) PRIMARY KEY, + DOC_ID VARCHAR(36) NOT NULL, + CHUNK_TEXT VARCHAR, -- Use VARCHAR without length + CHUNK_VEC VECTOR(FLOAT, 768), -- 768-dim embeddings from snowflake-arctic-embed-m + FOREIGN KEY (DOC_ID) REFERENCES DOCUMENTS(DOC_ID) +); + +-- Application Categories +CREATE TABLE IF NOT EXISTS APP_CATEGORIES ( + CATEGORY_NAME VARCHAR(100) PRIMARY KEY, + DESCRIPTION VARCHAR(500), + CREATED_AT TIMESTAMP_LTZ DEFAULT CURRENT_TIMESTAMP() +); + +-- ========================================== +-- INDEXES FOR PERFORMANCE +-- ========================================== + +-- Index on USERNAME for faster lookups +CREATE INDEX IF NOT EXISTS idx_user_teams_username ON APP_USER_TEAMS (USERNAME); +CREATE INDEX IF NOT EXISTS idx_chat_sessions_username ON CHAT_SESSIONS (USERNAME); +CREATE INDEX IF NOT EXISTS idx_chat_messages_session ON CHAT_MESSAGES (SESSION_ID); + +-- Index on CATEGORY for document filtering +CREATE INDEX IF NOT EXISTS idx_documents_category ON DOCUMENTS (CATEGORY); +CREATE INDEX IF NOT EXISTS idx_role_access_role ON ROLE_ACCESS_MAPPING (ROLE_NAME); + +-- ========================================== +-- DEFAULT DATA +-- ========================================== + +-- Insert default categories if empty +INSERT INTO APP_CATEGORIES (CATEGORY_NAME, DESCRIPTION) +SELECT 'GENERAL', 'General documentation' +WHERE NOT EXISTS (SELECT 1 FROM APP_CATEGORIES WHERE CATEGORY_NAME = 'GENERAL'); + +INSERT INTO APP_CATEGORIES (CATEGORY_NAME, DESCRIPTION) +SELECT 'FINANCIAL', 'Financial documents and statements' +WHERE NOT EXISTS (SELECT 1 FROM APP_CATEGORIES WHERE CATEGORY_NAME = 'FINANCIAL'); + +INSERT INTO APP_CATEGORIES (CATEGORY_NAME, DESCRIPTION) +SELECT 'TECHNICAL', 'Technical documentation' +WHERE NOT EXISTS (SELECT 1 FROM APP_CATEGORIES WHERE CATEGORY_NAME = 'TECHNICAL'); + +-- Insert default team if empty +INSERT INTO TEAMS (TEAM_NAME, DESCRIPTION) +SELECT 'GUEST', 'Default guest team with no access' +WHERE NOT EXISTS (SELECT 1 FROM TEAMS WHERE TEAM_NAME = 'GUEST'); + +-- Grant first user admin rights (will be current_user() during installation) +INSERT INTO ADMIN_USERS (USERNAME, GRANTED_BY) +SELECT CURRENT_USER(), 'SYSTEM_INSTALL' +WHERE NOT EXISTS (SELECT 1 FROM ADMIN_USERS); + +-- Grant access to first admin +INSERT INTO ROLE_ACCESS_MAPPING (ROLE_NAME, ALLOWED_CATEGORY) +SELECT 'SUPER_ADMIN', 'GENERAL' +WHERE NOT EXISTS (SELECT 1 FROM ROLE_ACCESS_MAPPING WHERE ROLE_NAME = 'SUPER_ADMIN'); + +-- ========================================== +-- GRANTS +-- ========================================== + +-- Grant all privileges on tables to application role +GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA {{ application_name }}.APP_SCHEMA TO APPLICATION ROLE {{ app_role }}; +GRANT SELECT, INSERT, UPDATE, DELETE ON ALL VIEWS IN SCHEMA {{ application_name }}.APP_SCHEMA TO APPLICATION ROLE {{ app_role }}; + +-- Grant usage on schema +GRANT USAGE ON SCHEMA {{ application_name }}.APP_SCHEMA TO APPLICATION ROLE {{ app_role }}; + +-- Enable Cortex functions for the app +GRANT DATABASE ROLE SNOWFLAKE.CORTEX_USER TO APPLICATION ROLE {{ app_role }}; + +-- ========================================== +-- POST-SETUP LOG +-- ========================================== + +INSERT INTO TEAMS (TEAM_NAME, DESCRIPTION) +VALUES ('SETUP_COMPLETE', 'Setup completed at ' || CURRENT_TIMESTAMP()) +ON CONFLICT (TEAM_NAME) DO NOTHING; \ No newline at end of file diff --git a/version_2/snowflake.yml b/version_2/snowflake.yml new file mode 100644 index 0000000..7e7423a --- /dev/null +++ b/version_2/snowflake.yml @@ -0,0 +1,44 @@ +definition_version: "1" +native_app: + name: AIFAQ_PRO + label: "AIFAQ Pro" + version: "1.0.0" + comment: "AI-powered FAQ assistant with document ingestion" + + # Application package + package: + name: AIFAQ_PRO_PKG + distribution: PUBLIC # For marketplace + comment: "Package for AIFAQ Pro Native App" + + # Application + application: + name: AIFAQ_PRO_APP + from: + package: AIFAQ_PRO_PKG + debug: true + comment: "AIFAQ Pro application instance" + + # Artifacts to include + artifacts: + - src: aifaq_app.py + dest: aifaq_app.py + - src: manifest.yml + dest: manifest.yml + - src: setup.sql + dest: setup.sql + - src: environment.yml + dest: environment.yml + - src: README.md + dest: README.md + - src: LICENSE + dest: LICENSE + + # Configuration + configuration: + default_connection: my_snowflake_connection + default_warehouse: compute_wh + default_role: accountadmin + +# Project structure +definition_version: "1" \ No newline at end of file