diff --git a/dynamic-sdui-app/.gitignore b/dynamic-sdui-app/.gitignore new file mode 100644 index 0000000..f2ccb42 --- /dev/null +++ b/dynamic-sdui-app/.gitignore @@ -0,0 +1,50 @@ +# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc +/bazel-out + +# Node +/node_modules +npm-debug.log +yarn-error.log + +# IDEs and editors +.idea/ +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# Visual Studio Code +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* +.editorconfig +.vscode/ + +# Miscellaneous +/.angular/cache +.sass-cache/ +/connect.lock +/coverage +/libpeerconnection.log +testem.log +/typings +__screenshots__/ +.gemini/ +.angular/ +.genkit/ +mcp-server/__pycache__/ + +# System files +.DS_Store +Thumbs.db + diff --git a/dynamic-sdui-app/.postcssrc.json b/dynamic-sdui-app/.postcssrc.json new file mode 100644 index 0000000..e092dc7 --- /dev/null +++ b/dynamic-sdui-app/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/dynamic-sdui-app/LICENSE b/dynamic-sdui-app/LICENSE new file mode 100644 index 0000000..90eb644 --- /dev/null +++ b/dynamic-sdui-app/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2025 Google LLC. https://angular.dev/license + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/dynamic-sdui-app/README.md b/dynamic-sdui-app/README.md new file mode 100644 index 0000000..c090eae --- /dev/null +++ b/dynamic-sdui-app/README.md @@ -0,0 +1,121 @@ +# Dynamic SDUI Generation Framework with Angular and AI + +This repository contains an *experimental and exploratory* framework for building and running dynamic, AI-powered, Server-Driven UI (SDUI) applications using Angular and a generative AI backend. The system uses a unique two-AI architecture: a **Generator AI** to help developers scaffold application assets and an **Executor AI** to render UIs dynamically at runtime. + +**Please note: This is an experimental project and not an official Angular solution for generating SDUI apps.** + +## Core Concepts + +The framework is built on the idea of separating the application's UI components from the logic that assembles them. An AI-powered backend takes on the role of a real-time UI/UX designer, constructing views on the fly based on user intent. + +### The Two-AI Architecture + +1. **Generator AI**: An interactive command-line tool, powered by a Python MCP (Model-Centric Programming) server. It guides a developer through a series of questions to design, define, and generate all the necessary assets for a new dynamic application. This includes creating Angular components, configuration files, and theme variables. + +2. **Executor AI**: A runtime AI, powered by [Genkit](https://genkit.dev/) flows. When a user interacts with the running application (e.g., through a chat interface), the Executor AI receives the user's prompt, analyzes the available data and UI components, and generates a JSON-based `componentSchema` that represents the entire view layout. The Angular frontend then renders this schema into a fully interactive UI. + +### The `app-context.ts` File + +Each dynamic application has a central manifest file called `app-context.ts`. This file is crucial as it provides the Executor AI with all the context it needs to build a UI. It contains: +* **App Metadata**: The application's name, theme, and welcome messages. +* **Component Map**: A registry that maps component names to their actual Angular component classes. +* **Component Context**: Detailed metadata for each component, including its purpose and input properties. +* **App Description & Layout Rules**: A detailed prompt for the Executor AI, explaining the application's domain and defining `LayoutCompositions`—rules for how to assemble components for different scenarios (e.g., a "list view" vs. a "detail view"). + +--- + +## How It Works: The Rendering Flow + +1. **User Interaction**: A user types a prompt into the chat interface of the running Angular application (e.g., "show me modern lofts in New York"). +2. **Genkit Flow**: The prompt is sent to the Genkit backend, which triggers the Executor AI flow. +3. **AI-Powered Layout Generation**: The Executor AI analyzes the user's prompt, the `app-context.ts` for the current application, and the available data (from `data-store.ts`). It then constructs a detailed JSON `componentSchema` that represents the optimal UI layout for the user's request. +4. **Dynamic Rendering**: The Angular frontend receives this JSON schema. +5. **UI Display**: The `MagicAiRendererComponent` recursively walks the JSON tree and dynamically creates and renders the corresponding Angular components, resulting in a fully interactive view generated in real-time. + +--- + +## Sample Applications + +This repository includes three sample applications to demonstrate the framework's capabilities. You can switch between these applications by updating the `APP_NAME` constant in `src/app/magic-ai/app-context.ts`. + +### 1. Haven - Vacation Rentals + +* **Description**: An application for discovering and booking vacation rentals. The AI can generate views for property listings, detailed property pages, and inspirational destination cards. +* **Directory**: `src/app/apps/vacation-rentals` + +### 2. Magic Bookstore + +* **Description**: An e-commerce application for a bookstore. The AI can create layouts for book search results, detailed product pages with author bios and reviews, and carousels of related books. +* **Directory**: `src/app/apps/magic-bookstore` + +### 3. Adev Docs - Angular Documentation + +* **Description**: A dynamic documentation site for the Angular framework. The AI can assemble complex, informative pages by combining concept explanations, API references, code snippets, and full code examples in response to a user's query. +* **Directory**: `src/app/apps/adev-docs` +* **Please note**: This is a sample application and is not intended to be used as an official source for Angular documentation. + +--- + +## Getting Started + +### Prerequisites + +* [Node.js](https://nodejs.org/) (LTS version recommended) +* [pnpm](https://pnpm.io/installation) +* [Angular CLI](https://angular.io/cli) +* [Python](https://www.python.org/downloads/) (3.x recommended) + +### Installation + +1. Clone the repository: + ```bash + git clone + cd + ``` + +2. Install the Node.js dependencies: + ```bash + pnpm install + ``` + +### Running the Application + +1. **Start the Angular Development Server**: + This will serve the frontend application. + ```bash + ng serve + ``` + The application will be available at `http://localhost:4200/`. + + + +--- + +## Creating a New Dynamic Application + +This application comes packaged with an MCP server that allows you to easily create your own SDUI application like the provided samples. For detailed instructions on how to use the Generator AI, please refer to the [MCP Server README](mcp-server/README.md). + +--- + +## Project Structure + +``` +/ +├── mcp-server/ # Python server for the Generator AI +│ └── server.py +├── src/ +│ ├── app/ +│ │ ├── apps/ # Contains the dynamic application packages +│ │ │ ├── vacation-rentals/ +│ │ │ │ ├── components/ +│ │ │ │ └── app-context.ts # The "manifest" for the Haven app +│ │ │ └── ... +│ │ ├── magic-ai/ # Core logic for rendering AI-generated schemas +│ │ │ └── magic-ai-renderer.component.ts +│ │ └── chat/ # The main chat interface component +│ └── genkit-utils/ # Genkit flows and prompts for the Executor AI +│ ├── flows.ts +│ └── prompts.ts +└── angular.json +└── package.json +``` \ No newline at end of file diff --git a/dynamic-sdui-app/angular.json b/dynamic-sdui-app/angular.json new file mode 100644 index 0000000..515de74 --- /dev/null +++ b/dynamic-sdui-app/angular.json @@ -0,0 +1,101 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "npm", + "analytics": false + }, + "newProjectRoot": "projects", + "projects": { + "dynamic-sdui-app": { + "projectType": "application", + "schematics": {}, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "allowedCommonJsDependencies": [ + "node-domexception", + "web-streams-polyfill/dist/ponyfill.es2018.js", + "@genkit-ai/core/async" + ], + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": [ + "node_modules/highlight.js/styles/atom-one-dark.css", + "node_modules/@angular/material/prebuilt-themes/indigo-pink.css", + "src/styles.css" + ], + "server": "src/main.server.ts", + "outputMode": "server", + "ssr": { + "entry": "src/server.ts" + } + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "dynamic-sdui-app:build:production" + }, + "development": { + "buildTarget": "dynamic-sdui-app:build:development" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular/build:extract-i18n" + }, + "test": { + "builder": "@angular/build:karma", + "options": { + "tsConfig": "tsconfig.spec.json", + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": [ + "src/styles.css" + ] + } + } + } + } + } +} diff --git a/dynamic-sdui-app/mcp-server/README.md b/dynamic-sdui-app/mcp-server/README.md new file mode 100644 index 0000000..e084997 --- /dev/null +++ b/dynamic-sdui-app/mcp-server/README.md @@ -0,0 +1,45 @@ +# FastMCP Server for Dynamic SDUI Generation + +This directory contains a pre-packaged MCP (Model-Centric Programming) server built with [FastMCP](https://gofastmcp.com/). This server provides the prompts and logic necessary to generate entire Server-Driven UI (SDUI) applications or individual components for existing SDUI apps within this project. + +## What is FastMCP? + +FastMCP is a Python library that simplifies the creation of MCP servers, allowing you to easily expose your own tools and prompts to compatible clients, like the Gemini CLI. + +To install FastMCP, please visit the official documentation: +[**FastMCP Installation Guide**](https://gofastmcp.com/getting-started/installation) + +## Integration with Gemini CLI + +The easiest way to interact with this server and use the generative prompts is through the [Gemini CLI](https://github.com/google/gemini-cli). + +### Get Started Today + +Want to try out the integration? It’s easy to get up and running with Gemini CLI and FastMCP. + +1. **Install Gemini CLI**: `npm install -g @google/gemini-cli@latest` +2. **Install FastMCP** (*v2.12.3* or later): `pip install fastmcp>=2.12.3` +3. **Create your `server.py`** with custom tools and prompts. ([example](https://gofastmcp.com/integrations/gemini-cli#create-a-server)) +4. **Integrate**: `fastmcp install gemini-cli server.py` +5. **Launch Gemini CLI** and use `/mcp` to verify. + +For more information on the integration between Gemini CLI and FastMCP, check out this blog post: +[**Gemini CLI & FastMCP: Simplifying MCP Server Development**](https://developers.googleblog.com/en/gemini-cli-fastmcp-simplifying-mcp-server-development/) + +--- + +## Available Prompts + +You can run the following prompts from the Gemini CLI to generate code for this project. + +### 1. Generate a New SDUI Application + +* **Command**: `/generate_dynamic_sdui_app` +* **Description**: This prompt initiates an interactive workflow to design and generate all the necessary assets for a new dynamic SDUI application. The AI will guide you through a series of questions to define the app's domain, components, and styling, and then generate all the corresponding files. +* **How to run**: Type `/generate_dynamic_sdui_app` in the Gemini CLI and follow the on-screen instructions. + +### 2. Create a New Dynamic Component + +* **Command**: `/create_dynamic_component` +* **Description**: This prompt allows you to add a new, single component to an *existing* SDUI application. The AI will ask for the application name and a description of the component, then generate the component files and integrate them into the application's context and showcase. +* **How to run**: Type `/create_dynamic_component` in the Gemini CLI and follow the on-screen instructions. diff --git a/dynamic-sdui-app/mcp-server/server.py b/dynamic-sdui-app/mcp-server/server.py new file mode 100644 index 0000000..7cac4a2 --- /dev/null +++ b/dynamic-sdui-app/mcp-server/server.py @@ -0,0 +1,618 @@ +#!/usr/bin/env python +# +# @license +# Copyright Google LLC All Rights Reserved. +# +# Use of this source code is governed by an MIT-style license that can be +# found in the LICENSE file at https://angular.dev/license + +from fastmcp import FastMCP + +mcp = FastMCP(name="DynaComp_MCP") + +@mcp.prompt +def generate_dynamic_sdui_app() -> str: + return """ +### **🤖 LLM Instructions: Dynamic Application Asset Generator** + +You are an expert AI application architect and senior Angular developer. Your mission is to interactively collaborate with a user to **design, define, and generate all the necessary assets** for a new, dynamic, server-driven UI (SDUI) application. + +#### **1. Core Objective** + +The assets you create will be used by a *separate* generative AI (the "Executor LLM") to dynamically build application views at runtime. That Executor LLM will receive a user prompt (e.g., "show me cabins in the mountains") and will use *your* generated assets to construct a valid UI. + +Your final deliverables will be: + +1. A comprehensive **`app-context.ts`** file (containing all config, metadata, and component maps). +2. A directory of **Angular Components** (the UI building blocks). +3. A new **Showcase Component** for visually reviewing the generated components. + +You will also be responsible for **updating global registry files** to integrate the new application. + +You **must** follow the interactive, step-by-step process below. + +----- + +#### **2. Style & Design Guidelines** + +You must adhere to the following design principles when generating component visuals and styles. Default to these guidelines unless the user explicitly requests a deviation. + +##### **Comprehensive Web & App Design Style Guidelines** + +Overall Design Philosophy: + +The core philosophy revolves around Cleanliness, Intuition, and Subtle Sophistication. Designs prioritize user experience (UX) through clarity and ease of navigation, while maintaining a visually appealing and professional aesthetic. Generous white space, harmonious color palettes, and legible typography are fundamental. "Depiction is not endorsement" when showing potentially problematic content; focus on the visual representation of design principles. + +----- + +**1. Layout & Structure:** + + * **Grid System:** Primarily utilizes a flexible 12-column grid for web applications and a simpler 4-column or adaptive grid for mobile. Content is aligned to this grid, ensuring visual balance and responsiveness. + * **White Space (Negative Space):** Employ liberal use of white space around and between elements. This is crucial for readability, reducing cognitive load, and creating a sense of openness and modernity. + * *Decision:* Prevents clutter, guides the eye, and elevates the perceived sophistication of the design. + * **Content Hierarchy:** Clear visual hierarchy is established through size, weight, color, and placement of text and elements. Key information is always prominent. + * *Decision:* Ensures users can quickly scan and identify important content. + * **Segmentation:** Content is logically grouped into distinct cards, sections, or panels. These segments often have subtle borders, shadows, or background tints to differentiate them. + * *Decision:* Breaks down complex information into digestible chunks, improving scannability. + +----- + +**2. Color Palette:** + + * **Primary Palette (Light Mode):** Dominated by soft, muted, and often desaturated colors. + * **Neutrals:** Abundant use of off-whites (e.g., #F8F8FA), light grays (e.g., #E0E0E0 to #CCCCCC), and charcoal blacks (e.g., #333333 for text). + * **Accents:** Subtle, calming colors like muted blues (e.g., #66B2FF, #4CAF50), soft greens (e.g., #8BC34A), or gentle teals (e.g., #4DB6AC). These are used sparingly for interactive elements, progress indicators, or highlights. + * *Decision:* Creates a calm, professional, and trustworthy environment. Muted tones are less jarring and allow content to be the star. + * **Primary Palette (Dark Mode - if applicable):** + * **Backgrounds:** Deep, desaturated grays or almost-black tones (e.g., #1A1A2E, #2C2C3E). Avoid pure black. + * **Text/Icons:** Light grays or off-whites (e.g., #E0E0E0, #F0F0F0) for readability. + * **Accents:** Brighter, more saturated versions of the light-mode accent colors (e.g., vibrant blues, teals, oranges) to provide contrast against the dark background. + * *Decision:* Reduces eye strain in low-light conditions, provides a modern and premium feel, and makes data visualizations more impactful. + * **Semantic Colors:** Consistent use of specific colors for status indicators (e.g., green for success, red for error, yellow for warning, blue for info). + * *Decision:* Provides instant visual cues to the user. + +----- + +**3. Typography:** + + * **Font Family:** Predominantly sans-serif fonts are used (e.g., Inter, Roboto, Lato, Open Sans, or a similar modern, highly legible sans-serif). + * *Decision:* Sans-serif fonts are excellent for screen readability, projecting a modern, clean, and professional image. + * **Font Weights:** Utilize a range of weights (Light, Regular, Medium, Semi-bold, Bold) to establish hierarchy. + * *Headings (H1-H6):* Often use Medium or Semi-bold weights, with larger font sizes. + * *Body Text:* Typically Regular weight, optimized for readability at smaller sizes. + * *Call-to-Action (CTA) Text:* Often Semi-bold or Bold to stand out. + * *Decision:* Creates a clear visual hierarchy, distinguishing titles from body content. + * **Font Sizes:** A scalable type system is used, with generous line heights (typically 1.5x font size for body text) to improve readability. + * *Base Font Size:* 16px for body text is a good starting point for web, 14-16px for mobile. + * *Decision:* Ensures comfortable reading on various devices and prevents cramped text. + * **Text Alignment:** Primarily left-aligned for readability in most content blocks. Centered text is reserved for headings, short taglines, or specific display elements. + * *Decision:* Consistent left alignment is easiest for the human eye to follow. + +----- + +**4. UI Elements & Components:** + + * **Buttons:** + * **Primary Buttons:** Feature a solid, slightly rounded background (using an accent color) with white or light-colored text. Subtle hover states (slight color change or lift). + * **Secondary Buttons:** Often have a transparent background with an accent-colored border and text, or a light gray background. + * **Ghost/Tertiary Buttons:** Text-only, sometimes with a subtle underline on hover. + * *Decision:* Clear visual differentiation helps users understand the primary action. Rounded corners add a softer, friendlier touch. + * **Input Fields:** Clean, minimalist design with light backgrounds and subtle borders. Focus states (e.g., a colored border or shadow) are clear but not intrusive. + * *Decision:* Ensures clarity and a professional appearance. + * **Cards:** Widely used to contain grouped content. Feature rounded corners (small radius, e.g., 8-12px), and often subtle, distant shadows for a sense of depth and separation from the background. + * *Decision:* Creates clear content boundaries, enhances scannability, and adds a modern, tactile feel. + * **Icons:** Use a consistent icon set (e.g., Line icons, Filled icons, or Duotone) that matches the overall aesthetic – typically minimalist and clean. + * *Decision:* Icons enhance understanding and add visual interest without clutter. + * **Navigation:** + * **Top Navigation:** Clean, organized, with distinct links and sometimes a user profile avatar. + * **Side Navigation (Dashboards):** Often uses icons with labels, clear active states, and sufficient padding. + * **Mobile Navigation:** Hamburger menus are common, revealing a full-screen or slide-out menu. Bottom navigation bars for primary actions are also frequently used. + * *Decision:* Ensures intuitive access to core features across devices. + +----- + +**5. Imagery & Visuals:** + + * **High-Quality Photography:** When used, images are high-resolution, professionally composed, and relevant to the content. Often feature a clean, minimalist style themselves. + * *Decision:* Enhances credibility and visual appeal. + * **Illustrations/Graphics:** Modern, often flat or semi-flat illustrations with a consistent style (e.g., rounded shapes, limited color palette, friendly characters). + * *Decision:* Adds personality, explains concepts visually, and breaks up text. + * **Data Visualization (Charts/Graphs):** Clean and legible charts with clear axis labels, minimal grid lines, and an effective use of color to differentiate data series. Animated transitions (if applicable) are subtle and smooth. + * *Decision:* Makes complex data understandable at a glance. + +----- + +**6. Interactivity & Microinteractions:** + + * **Hover States:** Subtle visual feedback (e.g., slight background color change, shadow lift, text underline) on interactive elements like buttons, links, and cards. + * **Transitions & Animations:** Minimal and purposeful. Smooth fades, slides, or subtle scaling for modals, alerts, and navigation transitions. Avoid overly flashy or distracting animations. + * *Decision:* Enhances the user experience by providing feedback and making the interface feel responsive and alive, without being overwhelming. + * **Scroll Behavior:** Smooth scrolling for anchors and content areas. + * *Decision:* Improves perceived performance and user comfort. + +----- + +**7. Accessibility Considerations (Implicit in Design Choices):** + + * **Color Contrast:** Sufficient contrast between text and background colors (especially for WCAG AA or AAA compliance). + * **Focus States:** Clearly visible focus indicators for keyboard navigation. + * **Scalable Text:** Designs accommodate larger text sizes without breaking the layout. + * *Decision:* While not explicitly shown in static mockups, these are underlying principles that inform the element design to ensure a broad user base can interact effectively. + +----- + +#### **3. Interactive Generation Workflow** + +#### **Step 1: Initialization & Context Gathering** + +Your first action is to ask the user if they have a "pre-population" file. + +> **You:** "Hello! I'm here to help you build all the assets for a new dynamic application. +> +> Before we begin, do you have a file with pre-filled answers to the setup questions (like app domain, name, style preferences, data file paths, etc.)? If so, please provide the path. I'll read it and only ask for what's missing." + +After the user responds (either providing a file or saying no), you will proceed to gather all required information. If they provided a file, read it and populate your internal context. Then, ask for any information that is still missing. + +> **You:** "Okay, let's configure your new application. I'll ask a few questions." + +**(Ask any of the following questions ONLY if the information was not in the pre-population file)** + +1. **App Domain:** "What kind of application would you like to build? (e.g., 'vacation rentals', 'e-commerce store', 'project management tool')" +2. **App Name (`kebab-case`):** "What's a simple `kebab-case` name for this project? (e.g., `my-ecom-app`)" +3. **Display Name:** "What is the human-friendly **display name** for this app? (e.g., 'Haven', 'Adev Docs')" +4. **Text Assets:** "What is the **welcome message** for the app (e.g., 'Welcome! How can I help you?')? (Optional: you can also provide a list of **loading messages**, or I will generate them)." +5. **Visuals (Optional):** "Do you have any design mock-ups, screenshots, or other images I can use as a reference? If so, please provide the directory path." +6. **Data Structure (Optional but Recommended):** "Do you have a file with the data structure or sample data (like a JSON or TS file)? This is highly recommended, as it will help me design unique and intelligent components based on your actual data." +7. **Styling:** "Do you have any preferences for the application's styling? (e.g., 'modern and dark', 'minimalist and professional', 'playful with bright colors') Or should I default to the modern, clean style guidelines?" + +**(After gathering all info, confirm the directory)** + +> **You:** "Thank you. I will use `[kebab-case-name]` as the `theme` and directory name, and `[Display-Name]` as the `appName`. +> +> I will create all new files in `src/app/apps/[kebab-case-name]`. +> +> **Is this correct, or do you have an existing directory you'd like me to write to instead?**" + +(Wait for user confirmation on the directory path before proceeding.) + +#### **Step 2: Propose Component Registry & App Description** + +Based on all the information gathered in Step 1, you will now design the component list and the app description. This is the **most critical interactive step**. + +**CRITICAL DESIGN MANDATE: BE CREATIVE & AESTHETIC** +Your primary goal here is not just to list standard components. You must act as an expert UI/UX designer and **invent new, creative components** that synthesize and consolidate information in visually appealing ways. + + * **Adhere to Style Guidelines:** All proposed visual descriptions **must** follow the **Style & Design Guidelines** (Section 2) by default. + * **Analyze the Data:** If the user provided a data structure, analyze it deeply. What unique combinations of data could be presented? For example, instead of just a "user profile," could you invent a "UserActivityHeatmap" component? + * **Be Visual:** Think beyond simple cards. Propose components that are **extremely visually appealing** (e.g., using rounded corners, subtle shadows, clean typography, and harmonious color palettes as defined in the guidelines). + * **Synthesize, Don't Just Display:** Invent components that consolidate complex information into easy-to-understand visualizations. + * **Be Exhaustive:** Try to come up with **all possible components** that could be useful for this application. + * **Full/Compact Versions:** Consider if it would be helpful to create components that have "full" and "compact" versions for different use cases (e.g., a "compact" card for a list view, and a "full" version for a "details" view). + * **Be Dynamic:** Remember these components are for a *dynamic* UI. Components like `Paginator` or `HeaderNavigation` are not relevant. Focus on components that present the *content* in novel ways. + +You must use the `appDomain`, `mockups`, and especially the `dataStructureFile` (if provided) to "think up new, and unique components." + +> **You:** "Thank you. Based on your app domain, mock-ups, and the sample data file, I have generated: +> +> 1. A proposed **list of components**. +> 2. The draft for `GENERATED_APP_DESCRIPTION`, which defines the rules for using these components. +> +> I've focused on being creative and designing components that are visually appealing and synthesize information, adhering to modern, clean design principles. +> +> **This is the most important review step.** Please review **both** items carefully. The mapping rules and the components are designed to work together. We can add, remove, or modify any part. Your approval here will determine all the assets I generate." + +**First, here is the draft for `GENERATED_APP_DESCRIPTION`:** + +> ``` +> You are building a UI for a [App Domain]... +> ``` + +> ### 1. Domain-Specific Mapping Rules: +> +> * (e.g., When you see data for 'X', you must use the 'XComponent'.) +> * ... + +> ### 2. Layout Compositions: +> +> * (e.g., If layoutHint is 'DefaultLayout', you must render a vertical stack...) +> * ... +> +> +> +> ``` +> ``` + +**Second, here is the detailed component list that matches these rules:** + +> For **each** component, you **must** present the following details: +> +> * **Component Name:** e.g., `HostProfileCardComponent` +> * **Description:** What is this component's purpose? +> * **Usage Rule:** When should the Executor LLM use this? (e.g., "Use this on a detail page when 'host' data is present.") +> * **Visual Description:** What will it look like? (e.g., "A clean, modern card with 12px rounded corners and a subtle shadow. It features a circular avatar, the host's name in a semi-bold font, and a 'Superhost' badge in the accent color.") +> * **Inputs:** An object where each key is the input name. The value **must** be an `Input` object (`{ type: string; description: string; required?: boolean; }`). +> * *Example:* +> ```json +> "inputs": { +> "host": { +> "type": "{ name: string; avatarUrl: string; isSuperhost: boolean; }", +> "description": "An object containing the host's information.", +> "required": true +> } +> } +> ``` +> +> Iterate with the user until they formally approve **both** the `GENERATED_APP_DESCRIPTION` and the complete component list. + +#### **Step 3: Execute Full Asset Generation** + +Once the component list, app description, and directory are approved, you will generate all assets and update all files. You do not need to ask for approval for each individual file change. + +> **You:** "Great! Now that the component list and app description are approved, I will generate all the required files and update the global registries." + +You will now perform the following actions: + +1. **Create Directory:** Create `[confirmed-directory-path]` (e.g., `src/app/apps/[app-name]`). +2. **Update `styles.css`:** + * **Add Variables:** In the main `:root` selector, add a new block of theme variables for `[app-name]`. This block **must** be a complete set of all variables, modeled exactly on the `haven` theme example (e.g., `primary`, `primary-light`, `primary-dark`, `text-primary`, `text-secondary`, `text-muted`, `background`, `surface`, `border`, `accent-gold`, `success`, `warning`, `error`, `font-family`, `text-xs`, `text-sm`, `text-base`, `text-lg`, `text-xl`, `text-xxl`, `font-weight-regular`, `font-weight-medium`, `font-weight-semibold`, `line-height-body`, `line-height-heading`, `spacing-1`, `spacing-2`, `spacing-3`, `spacing-4`, `spacing-5`, `spacing-6`, `border-radius-md`, `border-radius-lg`, `border-width`, `border-default`, `shadow-subtle`, `shadow-medium`, `shadow-focus`, `transition-default`). + * **Add Theme Class:** Append a new theme class, `.[app-name]-theme`, that maps all of your new variables to the generic variables, as shown in the `haven-theme` example. +3. **Generate Angular Components:** + * Create all component files in `[confirmed-directory-path]/components/`. + * **CRITICAL RULE 1 (Inputs):** All inputs in the component's .ts file **MUST be optional**. Use the shorthand signal input syntax, which is optional by default. **DO NOT** use `required: true` or the `input.required()` function. + * *Do this:* `host = input();` (This is optional and has the type `InputSignal`) + * *Do this (decorator):* `@Input() host: Host;` (This will be `undefined` until set) + * *Do NOT do this (verbose):* `host = input();` + * **CRITICAL RULE 2 (Templates):** Component templates **MUST** be defensive against `null` or `undefined` data. Use `@if` or `*ngIf` and optional chaining (`?.`). Be especially careful with nested object properties. + * *Bad (accessing child property directly):* `{{ book.publisher.name }}` + * *Good (checking parent object first):* + ```html + @if (book.publisher) { + Published by {{ book.publisher.name }} + } + ``` + * **CRITICAL RULE 3 (Styling):** Components **must** use the generic CSS variables (e.g., `var(--background)`, `var(--primary)`, `var(--border-radius-lg)`, `var(--shadow-subtle)`) so they adhere to the theme and Style Guidelines. + * **CRITICAL RULE 4 (Dependency Injection):** You **must** use the `inject` function for dependency injection. Do not inject in the constructor. Import `inject` from `@angular/core`. + * *Example:* `chatService = inject(ChatService);` + * **CRITICAL RULE 5 (Chat Service):** For any buttons or links related to search, discovery, or navigation (e.g., "View Details", "Explore"), you **must** import `ChatService` from `../../../chat/chat.service` and call `this.chatService.addUserPrompt()` with an appropriate instructional prompt. + * **CRITICAL RULE 6 (Action Buttons):** For buttons that imply a stateful action (e.g., "Add to Cart", "Add to Wishlist"), simply log a message to the console (e.g., `console.log('Add to cart clicked')`). + * **CRITICAL RULE 7 (Image Loading):** When using `` tags, you **must** show a spinner if the `src` is `undefined` or `''`. Import `MatProgressSpinnerModule` (from `@angular/material/progress-spinner`) in the standalone component and use this structure: + * *Example:* + ```html + @if (imageUrl()) { + + } @else { + + } + ``` +4. **Generate `app-context.ts`:** + * Create the file `[confirmed-directory-path]/app-context.ts`. + * This file **must** import `AppContext` and `ComponentContext` from `../../magic-ai/app-context`. + * It must contain all imports for the new components. + * It must contain `GENERATED_COMPONENT_CONTEXT_DATA` (the metadata array from Step 2), conforming to `ComponentContext[]`. The `inputs` property **must** be an object (map), not an array. + * *Example Structure:* + ```typescript + const GENERATED_COMPONENT_CONTEXT_DATA: ComponentContext[] = [ + { + "name": "HostProfileCardComponent", + "description": "...", + "type": "dynamicComponent", + "inputs": { + "host": { + "type": "{ name: string; avatarUrl: string; }", + "description": "The host object.", + "required": true + } + } + } + ]; + ``` + * It must contain `GENERATED_COMPONENT_MAP`, conforming to `{ [key: string]: Type }`. + * It must contain the `const GENERATED_APP_DESCRIPTION` string, approved in Step 2. + * It must contain `LOADING_TEXT`, which **must** be an array of at least 30 strings. + * It must export the final `GENERATED_APP_CONTEXT` object, which **must** conform to the `AppContext` interface. The `appName` field **must** be the human-friendly display name from Step 1. + * *Example export:* + ```typescript + export const GENERATED_APP_CONTEXT: AppContext = { + appName: '[Display-Name]', + theme: '[kebab-case-name]', + welcomeText: '[Welcome message from Step 1]', + placeholders: LOADING_TEXT, + appDescription: GENERATED_APP_DESCRIPTION, + componentMap: GENERATED_COMPONENT_MAP, + componentContextData: GENERATED_COMPONENT_CONTEXT_DATA + }; + ``` +5. **Generate Showcase Component:** + * Create `[confirmed-directory-path]/[app-name]-showcase.component.ts`. + * This component must be `standalone: true`, import all generated components (and `MatProgressSpinnerModule` if needed), and render an instance of **every** component with valid sample data. +6. **Update `magic-ai/app-context.ts`:** + * Add the new import: `import { GENERATED_APP_CONTEXT as [APP_NAME_UPPER]_APP_CONTEXT } from '../apps/[app-name]/app-context';` + * Add the new `[app-name]` to the `AppName` type. + * Add a new const for the app name: `const [APP_NAME_UPPER]: AppName = '[app-name]';` + * Add the new app to the `APP_CONTEXT_MAP`: `[[APP_NAME_UPPER]]: [APP_NAME_UPPER]_APP_CONTEXT,` +7. **Update `src/genkit-utils/data-store.ts`:** + * Find the file `src/genkit-utils/data-store.ts`. + * Add the new import: `import { DATA as [APP_NAME_UPPER]_DATA } from '../app/apps/[app-name]/data-store';` (e.g., `MAGIC_BOOKSTORE_DATA`). + * Add the new key-value pair to the `DATA_MAP` object: `'[kebab-case-name]': JSON.stringify([APP_NAME_UPPER]_DATA, null, 2),` +8. **Update `showcase/showcase-directory.component.ts`:** + * Add a new `
  • ` to the `
      ` in the template: `
    • [AppNameTitleCase] Showcase
    • ` +9. **Update `app.routes.ts`:** + * Find the `app.routes.ts` file. + * Add the new showcase route to the `routes` array. **Must** use lazy loading. + * *Example:* `{ path: 'showcase/[app-name]', loadComponent: () => import('./apps/[app-name]/[app-name]-showcase.component').then(c => c.[AppName]ShowcaseComponent) }` + +#### **Step 4: Completion and Final Instruction** + +Inform the user that generation is complete. + +> **You:** "All assets for the `[app-name]` application have been successfully generated. The `app-context.ts`, components, and showcase are complete. The global registries and `app.routes.ts` file have been updated. +> +> I will now run the final build to verify the new code." + +#### **Step 5: Build, Verify, and Fix** + +As the final step, you must verify the project builds without errors. + +1. **Run Build:** Execute the `ng build` command. +2. **Analyze Output:** Read the build output. +3. **Fix Errors:** + * If the build fails due to errors in the code you just generated (e.g., type mismatches, incorrect imports, template errors), fix the code in `[confirmed-directory-path]/...` and re-run the build. + * **Known Issue Workaround:** If you encounter a known issue, such as an error with the `asci-color` module, apply the fix directly within the `node_modules` directory to resolve it, as this is the fastest workaround. +4. **Loop:** Repeat this process until the `ng build` command succeeds. +5. **Confirm:** Once the build is successful, report it. + +> **You:** "Build successful! The application is fully generated and verified. I am ready for the next task." + """ + +@mcp.prompt +def create_dynamic_component() -> str: + return """ +### **🤖 LLM Instructions: Create a New Dynamic Component in an Existing Application** + +You are an expert AI application architect and senior Angular developer. Your mission is to collaborate with a user to **create a new dynamic component** and integrate it into an **existing** dynamic server-driven UI (SDUI) application. + +#### **1. Core Objective** + +Your goal is to generate a new, standalone Angular component and update all necessary application files to make it available to the Executor LLM for dynamic UI generation within an already established application. + +Your final deliverables will be: + +1. A new **Angular Component** directory and files. +2. Updates to the application's **app-context.ts** file. +3. Updates to the **Showcase Component** to include the new component. + +You **must** follow the interactive, step-by-step process below. + +--- + +#### **2. Style & Design Guidelines** + +You must adhere to the following design principles when generating component visuals and styles. Default to these guidelines unless the user explicitly requests a deviation. + +##### **Comprehensive Web & App Design Style Guidelines** + +Overall Design Philosophy: + +The core philosophy revolves around Cleanliness, Intuition, and Subtle Sophistication. Designs prioritize user experience (UX) through clarity and ease of navigation, while maintaining a visually appealing and professional aesthetic. Generous white space, harmonious color palettes, and legible typography are fundamental. "Depiction is not endorsement" when showing potentially problematic content; focus on the visual representation of design principles. + +--- + +**1. Layout & Structure:** + +* **Grid System:** Primarily utilizes a flexible 12-column grid for web applications and a simpler 4-column or adaptive grid for mobile. Content is aligned to this grid, ensuring visual balance and responsiveness. +* **White Space (Negative Space):** Employ liberal use of white space around and between elements. This is crucial for readability, reducing cognitive load, and creating a sense of openness and modernity. + * *Decision:* Prevents clutter, guides the eye, and elevates the perceived sophistication of the design. +* **Content Hierarchy:** Clear visual hierarchy is established through size, weight, color, and placement of text and elements. Key information is always prominent. + * *Decision:* Ensures users can quickly scan and identify important content. +* **Segmentation:** Content is logically grouped into distinct cards, sections, or panels. These segments often have subtle borders, shadows, or background tints to differentiate them. + * *Decision:* Breaks down complex information into digestible chunks, improving scannability. + +--- + +**2. Color Palette:** + +* **Primary Palette (Light Mode):** Dominated by soft, muted, and often desaturated colors. + * **Neutrals:** Abundant use of off-whites (e.g., #F8F8FA), light grays (e.g., #E0E0E0 to #CCCCCC), and charcoal blacks (e.g., #333333 for text). + * **Accents:** Subtle, calming colors like muted blues (e.g., #66B2FF, #4CAF50), soft greens (e.g., #8BC34A), or gentle teals (e.g., #4DB6AC). These are used sparingly for interactive elements, progress indicators, or highlights. + * *Decision:* Creates a calm, professional, and trustworthy environment. Muted tones are less jarring and allow content to be the star. +* **Primary Palette (Dark Mode - if applicable):** + * **Backgrounds:** Deep, desaturated grays or almost-black tones (e.g., #1A1A2E, #2C2C3E). Avoid pure black. + * **Text/Icons:** Light grays or off-whites (e.g., #E0E0E0, #F0F0F0) for readability. + * **Accents:** Brighter, more saturated versions of the light-mode accent colors (e.g., vibrant blues, teals, oranges) to provide contrast against the dark background. + * *Decision:* Reduces eye strain in low-light conditions, provides a modern and premium feel, and makes data visualizations more impactful. +* **Semantic Colors:** Consistent use of specific colors for status indicators (e.g., green for success, red for error, yellow for warning, blue for info). + * *Decision:* Provides instant visual cues to the user. + +--- + +**3. Typography:** + +* **Font Family:** Predominantly sans-serif fonts are used (e.g., Inter, Roboto, Lato, Open Sans, or a similar modern, highly legible sans-serif). + * *Decision:* Sans-serif fonts are excellent for screen readability, projecting a modern, clean, and professional image. +* **Font Weights:** Utilize a range of weights (Light, Regular, Medium, Semi-bold, Bold) to establish hierarchy. + * *Headings (H1-H6):* Often use Medium or Semi-bold weights, with larger font sizes. + * *Body Text:* Typically Regular weight, optimized for readability at smaller sizes. + * *Call-to-Action (CTA) Text:* Often Semi-bold or Bold to stand out. + * *Decision:* Creates a clear visual hierarchy, distinguishing titles from body content. +* **Font Sizes:** A scalable type system is used, with generous line heights (typically 1.5x font size for body text) to improve readability. + * *Base Font Size:* 16px for body text is a good starting point for web, 14-16px for mobile. + * *Decision:* Ensures comfortable reading on various devices and prevents cramped text. +* **Text Alignment:** Primarily left-aligned for readability in most content blocks. Centered text is reserved for headings, short taglines, or specific display elements. + * *Decision:* Consistent left alignment is easiest for the human eye to follow. + +--- + +**4. UI Elements & Components:** + +* **Buttons:** + * **Primary Buttons:** Feature a solid, slightly rounded background (using an accent color) with white or light-colored text. Subtle hover states (slight color change or lift). + * **Secondary Buttons:** Often have a transparent background with an accent-colored border and text, or a light gray background. + * **Ghost/Tertiary Buttons:** Text-only, sometimes with a subtle underline on hover. + * *Decision:* Clear visual differentiation helps users understand the primary action. Rounded corners add a softer, friendlier touch. +* **Input Fields:** Clean, minimalist design with light backgrounds and subtle borders. Focus states (e.g., a colored border or shadow) are clear but not intrusive. + * *Decision:* Ensures clarity and a professional appearance. +* **Cards:** Widely used to contain grouped content. Feature rounded corners (small radius, e.g., 8-12px), and often subtle, distant shadows for a sense of depth and separation from the background. + * *Decision:* Creates clear content boundaries, enhances scannability, and adds a modern, tactile feel. +* **Icons:** Use a consistent icon set (e.g., Line icons, Filled icons, or Duotone) that matches the overall aesthetic – typically minimalist and clean. + * *Decision:* Icons enhance understanding and add visual interest without clutter. +* **Navigation:** + * **Top Navigation:** Clean, organized, with distinct links and sometimes a user profile avatar. + * **Side Navigation (Dashboards):** Often uses icons with labels, clear active states, and sufficient padding. + * **Mobile Navigation:** Hamburger menus are common, revealing a full-screen or slide-out menu. Bottom navigation bars for primary actions are also frequently used. + * *Decision:* Ensures intuitive access to core features across devices. + +--- + +**5. Imagery & Visuals:** + +* **High-Quality Photography:** When used, images are high-resolution, professionally composed, and relevant to the content. Often feature a clean, minimalist style themselves. + * *Decision:* Enhances credibility and visual appeal. +* **Illustrations/Graphics:** Modern, often flat or semi-flat illustrations with a consistent style (e.g., rounded shapes, limited color palette, friendly characters). + * *Decision:* Adds personality, explains concepts visually, and breaks up text. +* **Data Visualization (Charts/Graphs):** Clean and legible charts with clear axis labels, minimal grid lines, and an effective use of color to differentiate data series. Animated transitions (if applicable) are subtle and smooth. + * *Decision:* Makes complex data understandable at a glance. + +--- + +**6. Interactivity & Microinteractions:** + +* **Hover States:** Subtle visual feedback (e.g., slight background color change, shadow lift, text underline) on interactive elements like buttons, links, and cards. +* **Transitions & Animations:** Minimal and purposeful. Smooth fades, slides, or subtle scaling for modals, alerts, and navigation transitions. Avoid overly flashy or distracting animations. + * *Decision:* Enhances the user experience by providing feedback and making the interface feel responsive and alive, without being overwhelming. +* **Scroll Behavior:** Smooth scrolling for anchors and content areas. + * *Decision:* Improves perceived performance and user comfort. + +--- + +**7. Accessibility Considerations (Implicit in Design Choices):** + +* **Color Contrast:** Sufficient contrast between text and background colors (especially for WCAG AA or AAA compliance). +* **Focus States:** Clearly visible focus indicators for keyboard navigation. +* **Scalable Text:** Designs accommodate larger text sizes without breaking the layout. + * *Decision:* While not explicitly shown in static mockups, these are underlying principles that inform the element design to ensure a broad user base can interact effectively. + +--- + +#### **3. Interactive Generation Workflow** + +#### **Step 1: Gather Initial Context** + +Your first action is to ask the user for the necessary information. + +**You:** "Hello! I'm here to help you create a new dynamic component for an existing application. + +1. What is the kebab-case name of the application you want to add this component to? (e.g., my-ecom-app) +2. Please provide a general description of the component you'd like to create." + +(Wait for user to provide both pieces of information). + +#### **Step 2: Propose Component Design** + +Based on the user's description, propose the component's design, adhering to the Style Guidelines. + +**You:** "Thank you. Based on your description, here is the component I will create. + +**This is an important review step.** Please review the proposed design. We can modify any of it before I generate the files." + +* **Component Name:** (e.g., UserProfileSummaryComponent) +* **Description:** (e.g., "A compact card to display a user's avatar, name, and role.") +* **Usage Rule:** (e.g., "Use this when a 'user' object is present in the data to be displayed.") +* **Visual Description:** (e.g., "A clean, modern card with 8px rounded corners. It will feature a circular avatar on the left, with the user's name (semi-bold) and role (muted text) stacked vertically to the right.") +* **Inputs:** An object where each key is the input name. The value **must** be an Input object ({ type: string; description: string; required?: boolean; }). + * *Example:* + * JSON + +``` + +"inputs": { + "user": { + "type": "{ name: string; avatarUrl: string; role: string; }", + "description": "The user object to display.", + "required": true + } +} + +``` + + * + +(Iterate with the user until they formally approve the component design.) + +#### **Step 3: Execute Full Asset Generation** + +Once the component design is approved, generate all assets and update all files. + +**You:** "Great! Now that the component design is approved, I will generate the new component and integrate it into the [app-name] application." + +You will now perform the following actions: + +1. **Generate Angular Component:** + * Create the new component files in src/app/apps/[app-name]/components/. + * **CRITICAL RULE 1 (Inputs):** All inputs in the component's .ts file **MUST be optional**. Use the shorthand signal input syntax, which is optional by default. **DO NOT** use required: true or the input.required() function. + * *Do this:* user = input(); (This is optional and has the type InputSignal) + * *Do this (decorator):* @Input() user: User; (This will be undefined until set) + * *Do NOT do this (verbose):* user = input(); + * **CRITICAL RULE 2 (Templates):** Component templates **MUST** be defensive against null or undefined data. Use @if or *ngIf and optional chaining (?.). Be especially careful with nested object properties. + * *Bad (accessing child property directly):* {{ user.details.role }} + * *Good (checking parent object first):* + * HTML + +``` + +@if (user.details) { + {{ user.details.role }} +} + +``` + + * + * **CRITICAL RULE 3 (Styling):** Components **must** use the generic CSS variables (e.g., var(--background), var(--primary), var(--border-radius-lg), var(--shadow-subtle)) so they adhere to the theme and Style Guidelines. + * **CRITICAL RULE 4 (Dependency Injection):** You **must** use the inject function for dependency injection. Do not inject in the constructor. Import inject from @angular/core. + * *Example:* chatService = inject(ChatService); + * **CRITICAL RULE 5 (Chat Service):** For any buttons or links related to search, discovery, or navigation (e.g., "View Details", "Explore"), you **must** import ChatService from ../../../chat/chat.service and call this.chatService.addUserPrompt() with an appropriate instructional prompt. + * **CRITICAL RULE 6 (Action Buttons):** For buttons that imply a stateful action (e.g., "Add to Cart", "Add to Wishlist"), simply log a message to the console (e.g., console.log('Add to cart clicked')). + * **CRITICAL RULE 7 (Image Loading):** When using tags, you **must** show a spinner if the src is undefined or ''. Import MatProgressSpinnerModule (from @angular/material/progress-spinner) in the standalone component and use this structure: + * *Example:* + * HTML + +``` + +@if (imageUrl()) { + +} @else { + +} + +``` + + * +2. **Update app-context.ts:** + * Open src/app/apps/[app-name]/app-context.ts. + * Import ComponentContext from ../../magic-ai/app-context (it should already be imported, but verify). + * Add the import for the new component at the top of the file. + * Add the new component's metadata (from Step 2) to the GENERATED_COMPONENT_CONTEXT_DATA array. The inputs property **must** be an object (map), not an array. + * Add the new component to the GENERATED_COMPONENT_MAP object. +3. **Update Showcase Component:** + * Open src/app/apps/[app-name]/[app-name]-showcase.component.ts. + * Import the new component (and MatProgressSpinnerModule if it's used). + * Add the new component to the showcase template, providing valid sample data so it renders correctly. + +#### **Step 4: Build, Verify, and Fix** + +As the final step, you must verify the project builds without errors. + +**You:** "I have generated the component and updated the application files. I will now run ng build to check for any errors and fix them." + +1. **Run Build:** Execute the ng build command. +2. **Analyze Output:** Read the build output. +3. **Fix Errors:** + * If the build fails due to errors in the code you just generated (e.g., type mismatches, incorrect imports, template errors), fix the code and re-run the build. + * **Known Issue Workaround:** If you encounter a known issue, such as an error with the asci-color module, apply the fix directly within the node_modules directory to resolve it, as this is the fastest workaround. +4. **Loop:** Repeat this process until the ng build command succeeds. +5. **Confirm:** Once the build is successful, report it. + +**You:** "Build successful! The new component has been added and verified. I am ready for the next task. + """ + +if __name__ == "__main__": + mcp.run() diff --git a/dynamic-sdui-app/package.json b/dynamic-sdui-app/package.json new file mode 100644 index 0000000..761221d --- /dev/null +++ b/dynamic-sdui-app/package.json @@ -0,0 +1,85 @@ +{ + "name": "dynamic-sdui-app", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "watch": "ng build --watch --configuration development", + "test": "ng test", + "serve:ssr:dynamic-sdui-app": "node dist/dynamic-sdui-app/server/server.mjs", + "postinstall": "patch-package" + }, + "prettier": { + "printWidth": 100, + "singleQuote": true, + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] + }, + "private": true, + "dependencies": { + "@angular/animations": "^21.0.0-next.0", + "@angular/cdk": "^20.2.10", + "@angular/common": "^21.0.0-next.0", + "@angular/compiler": "^21.0.0-next.0", + "@angular/core": "^21.0.0-next.0", + "@angular/forms": "^21.0.0-next.0", + "@angular/material": "^20.2.10", + "@angular/platform-browser": "^21.0.0-next.0", + "@angular/platform-browser-dynamic": "^21.0.0-next.0", + "@angular/platform-server": "^21.0.0-next.0", + "@angular/router": "^21.0.0-next.0", + "@angular/ssr": "^21.0.0-next.0", + "@genkit-ai/express": "^1.21.0", + "@genkit-ai/googleai": "^1.21.0", + "@genkit-ai/vertexai": "^1.21.0", + "@tailwindcss/postcss": "^4.1.15", + "@types/highlight.js": "^10.1.0", + "express": "^5.1.0", + "genkit": "^1.21.0", + "highlight.js": "^11.11.1", + "ngx-highlightjs": "^14.0.1", + "ngx-markdown": "^20.1.0", + "patch-package": "^8.0.1", + "postcss": "^8.5.6", + "rxjs": "~7.8.0", + "tailwindcss": "^4.1.15", + "tslib": "^2.3.0" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^18.1.0-next.1", + "@angular/build": "^21.0.0-next.5", + "@angular/cli": "^21.0.0-next.5", + "@angular/compiler-cli": "^21.0.0-next.0", + "@types/express": "^5.0.1", + "@types/jasmine": "~5.1.0", + "@types/node": "^20.17.19", + "jasmine-core": "~5.10.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.9.2" + }, + "pnpm": { + "overrides": { + "@angular/animations": "^21.0.0-next.0", + "@angular/common": "^21.0.0-next.0", + "@angular/compiler": "^21.0.0-next.0", + "@angular/core": "^21.0.0-next.0", + "@angular/forms": "^21.0.0-next.0", + "@angular/platform-browser": "^21.0.0-next.0", + "@angular/platform-browser-dynamic": "^21.0.0-next.0", + "@angular/platform-server": "^21.0.0-next.0", + "@angular/router": "^21.0.0-next.0", + "@angular/compiler-cli": "^21.0.0-next.0" + } + } +} diff --git a/dynamic-sdui-app/pnpm-lock.yaml b/dynamic-sdui-app/pnpm-lock.yaml new file mode 100644 index 0000000..8211377 --- /dev/null +++ b/dynamic-sdui-app/pnpm-lock.yaml @@ -0,0 +1,15868 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + '@angular/animations': ^21.0.0-next.0 + '@angular/common': ^21.0.0-next.0 + '@angular/compiler': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/forms': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + '@angular/platform-browser-dynamic': ^21.0.0-next.0 + '@angular/platform-server': ^21.0.0-next.0 + '@angular/router': ^21.0.0-next.0 + '@angular/compiler-cli': ^21.0.0-next.0 + +importers: + + .: + dependencies: + '@angular/animations': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/cdk': + specifier: ^20.2.10 + version: 20.2.11(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/common': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0 + '@angular/core': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/forms': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@standard-schema/spec@1.0.0)(rxjs@7.8.2) + '@angular/material': + specifier: ^20.2.10 + version: 20.2.11(da6da421bfbc1d9a2431ebc2039fbc7a) + '@angular/platform-browser': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/platform-browser-dynamic': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))) + '@angular/platform-server': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/router': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/ssr': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(538b4115bf272e3548cf40d78a3956af) + '@genkit-ai/express': + specifier: ^1.21.0 + version: 1.22.0(express@5.1.0)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) + '@genkit-ai/googleai': + specifier: ^1.21.0 + version: 1.22.0(encoding@0.1.13)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) + '@genkit-ai/vertexai': + specifier: ^1.21.0 + version: 1.22.0(encoding@0.1.13)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))(ws@8.18.3)(zod@3.25.76) + '@tailwindcss/postcss': + specifier: ^4.1.15 + version: 4.1.16 + '@types/highlight.js': + specifier: ^10.1.0 + version: 10.1.0 + express: + specifier: ^5.1.0 + version: 5.1.0 + genkit: + specifier: ^1.21.0 + version: 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)) + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + ngx-highlightjs: + specifier: ^14.0.1 + version: 14.0.1(@angular/cdk@20.2.11(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + ngx-markdown: + specifier: ^20.1.0 + version: 20.1.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(marked@16.4.1)(rxjs@7.8.2)(zone.js@0.15.1) + patch-package: + specifier: ^8.0.1 + version: 8.0.1 + postcss: + specifier: ^8.5.6 + version: 8.5.6 + rxjs: + specifier: ~7.8.0 + version: 7.8.2 + tailwindcss: + specifier: ^4.1.15 + version: 4.1.16 + tslib: + specifier: ^2.3.0 + version: 2.8.1 + devDependencies: + '@angular-devkit/build-angular': + specifier: ^18.1.0-next.1 + version: 18.2.21(@angular/compiler-cli@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3))(@angular/platform-server@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@types/node@20.19.24)(karma@6.4.4)(lightningcss@1.30.2)(tailwindcss@4.1.16)(typescript@5.9.3) + '@angular/build': + specifier: ^21.0.0-next.5 + version: 21.0.0-rc.0(0da76aceb47717093753a25a99bbabdc) + '@angular/cli': + specifier: ^21.0.0-next.5 + version: 21.0.0-rc.0(@types/node@20.19.24) + '@angular/compiler-cli': + specifier: ^21.0.0-next.0 + version: 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3) + '@types/express': + specifier: ^5.0.1 + version: 5.0.5 + '@types/jasmine': + specifier: ~5.1.0 + version: 5.1.12 + '@types/node': + specifier: ^20.17.19 + version: 20.19.24 + jasmine-core: + specifier: ~5.10.0 + version: 5.10.0 + karma: + specifier: ~6.4.0 + version: 6.4.4 + karma-chrome-launcher: + specifier: ~3.2.0 + version: 3.2.0 + karma-coverage: + specifier: ~2.2.0 + version: 2.2.1 + karma-jasmine: + specifier: ~5.1.0 + version: 5.1.0(karma@6.4.4) + karma-jasmine-html-reporter: + specifier: ~2.1.0 + version: 2.1.0(jasmine-core@5.10.0)(karma-jasmine@5.1.0(karma@6.4.4))(karma@6.4.4) + typescript: + specifier: ~5.9.2 + version: 5.9.3 + +packages: + + '@algolia/abtesting@1.6.1': + resolution: {integrity: sha512-wV/gNRkzb7sI9vs1OneG129hwe3Q5zPj7zigz3Ps7M5Lpo2hSorrOnXNodHEOV+yXE/ks4Pd+G3CDFIjFTWhMQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-abtesting@5.40.1': + resolution: {integrity: sha512-cxKNATPY5t+Mv8XAVTI57altkaPH+DZi4uMrnexPxPHODMljhGYY+GDZyHwv9a+8CbZHcY372OkxXrDMZA4Lnw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.40.1': + resolution: {integrity: sha512-XP008aMffJCRGAY8/70t+hyEyvqqV7YKm502VPu0+Ji30oefrTn2al7LXkITz7CK6I4eYXWRhN6NaIUi65F1OA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.40.1': + resolution: {integrity: sha512-gWfQuQUBtzUboJv/apVGZMoxSaB0M4Imwl1c9Ap+HpCW7V0KhjBddqF2QQt5tJZCOFsfNIgBbZDGsEPaeKUosw==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.40.1': + resolution: {integrity: sha512-RTLjST/t+lsLMouQ4zeLJq2Ss+UNkLGyNVu+yWHanx6kQ3LT5jv8UvPwyht9s7R6jCPnlSI77WnL80J32ZuyJg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.40.1': + resolution: {integrity: sha512-2FEK6bUomBzEYkTKzD0iRs7Ljtjb45rKK/VSkyHqeJnG+77qx557IeSO0qVFE3SfzapNcoytTofnZum0BQ6r3Q==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.40.1': + resolution: {integrity: sha512-Nju4NtxAvXjrV2hHZNLKVJLXjOlW6jAXHef/CwNzk1b2qIrCWDO589ELi5ZHH1uiWYoYyBXDQTtHmhaOVVoyXg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.40.1': + resolution: {integrity: sha512-Mw6pAUF121MfngQtcUb5quZVqMC68pSYYjCRZkSITC085S3zdk+h/g7i6FxnVdbSU6OztxikSDMh1r7Z+4iPlA==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.40.1': + resolution: {integrity: sha512-z+BPlhs45VURKJIxsR99NNBWpUEEqIgwt10v/fATlNxc4UlXvALdOsWzaFfe89/lbP5Bu4+mbO59nqBC87ZM/g==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.40.1': + resolution: {integrity: sha512-VJMUMbO0wD8Rd2VVV/nlFtLJsOAQvjnVNGkMkspFiFhpBA7s/xJOb+fJvvqwKFUjbKTUA7DjiSi1ljSMYBasXg==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.40.1': + resolution: {integrity: sha512-ehvJLadKVwTp9Scg9NfzVSlBKH34KoWOQNTaN8i1Ac64AnO6iH2apJVSP6GOxssaghZ/s8mFQsDH3QIZoluFHA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.40.1': + resolution: {integrity: sha512-PbidVsPurUSQIr6X9/7s34mgOMdJnn0i6p+N6Ab+lsNhY5eiu+S33kZEpZwkITYBCIbhzDLOvb7xZD3gDi+USA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.40.1': + resolution: {integrity: sha512-ThZ5j6uOZCF11fMw9IBkhigjOYdXGXQpj6h4k+T9UkZrF2RlKcPynFzDeRgaLdpYk8Yn3/MnFbwUmib7yxj5Lw==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.40.1': + resolution: {integrity: sha512-H1gYPojO6krWHnUXu/T44DrEun/Wl95PJzMXRcM/szstNQczSbwq6wIFJPI9nyE95tarZfUNU3rgorT+wZ6iCQ==} + engines: {node: '>= 14.0.0'} + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@angular-devkit/architect@0.1802.21': + resolution: {integrity: sha512-+Ll+xtpKwZ3iLWN/YypvnCZV/F0MVbP+/7ZpMR+Xv/uB0OmribhBVj9WGaCd9I/bGgoYBw8wBV/NFNCKkf0k3Q==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/architect@0.2100.0-rc.0': + resolution: {integrity: sha512-GHNScfffNVVVKLjqD+ZViDccZGFl7ssrPIXtct/AryeeTyE5QKUmZa+NtxIErM4W+vhwb19EQy9KhIm+pG7qOg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/build-angular@18.2.21': + resolution: {integrity: sha512-0pJfURFpEUV2USgZ2TL3nNAaJmF9bICx9OVddBoC+F9FeOpVKxkcVIb+c8Km5zHFo1iyVtPZ6Rb25vFk9Zm/ug==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^21.0.0-next.0 + '@angular/localize': ^18.0.0 + '@angular/platform-server': ^21.0.0-next.0 + '@angular/service-worker': ^18.0.0 + '@web/test-runner': ^0.18.0 + browser-sync: ^3.0.2 + jest: ^29.5.0 + jest-environment-jsdom: ^29.5.0 + karma: ^6.3.0 + ng-packagr: ^18.0.0 + protractor: ^7.0.0 + tailwindcss: ^2.0.0 || ^3.0.0 + typescript: '>=5.4 <5.6' + peerDependenciesMeta: + '@angular/localize': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + '@web/test-runner': + optional: true + browser-sync: + optional: true + jest: + optional: true + jest-environment-jsdom: + optional: true + karma: + optional: true + ng-packagr: + optional: true + protractor: + optional: true + tailwindcss: + optional: true + + '@angular-devkit/build-webpack@0.1802.21': + resolution: {integrity: sha512-2jSVRhA3N4Elg8OLcBktgi+CMSjlAm/bBQJE6TQYbdQWnniuT7JAWUHA/iPf7MYlQE5qj4rnAni1CI/c1Bk4HQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + webpack: ^5.30.0 + webpack-dev-server: ^5.0.2 + + '@angular-devkit/core@18.2.21': + resolution: {integrity: sha512-Lno6GNbJME85wpc/uqn+wamBxvfZJZFYSH8+oAkkyjU/hk8r5+X8DuyqsKAa0m8t46zSTUsonHsQhVe5vgrZeQ==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/core@21.0.0-rc.0': + resolution: {integrity: sha512-7cTo6gruB30aCz0+MPg8ukAqhUVf/cOsIMog1KRpQNoMYxmI6Xivnks+7Km1Qx3uxmdJ5vtXBkEOhzattQdG2w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^4.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics@21.0.0-rc.0': + resolution: {integrity: sha512-Z5QltTtZa6ZLrrtc4IQNmlxyirMYiHGX3fep/Z1/TeubXzlbBD8trWezdezkYLau48npbaUQ9oVWLDZPu1PEgA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular/animations@21.0.0-rc.0': + resolution: {integrity: sha512-uIi4hoKTB2RYoFzyMWGLskVnHmM0Xn1KgHcc9KJ+OxrYlxSxxKmzo1YG2iIcMx/R76HJk7ug/dkg+HbKcjpQeQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/core': ^21.0.0-next.0 + + '@angular/build@18.2.21': + resolution: {integrity: sha512-uvq3qP4cByJrUkV1ri0v3x6LxOFt4fDKiQdNwbQAqdxtfRs3ssEIoCGns4t89sTWXv6VZWBNDcDIKK9/Fa9mmg==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^21.0.0-next.0 + '@angular/localize': ^18.0.0 + '@angular/platform-server': ^21.0.0-next.0 + '@angular/service-worker': ^18.0.0 + less: ^4.2.0 + postcss: ^8.4.0 + tailwindcss: ^2.0.0 || ^3.0.0 + typescript: '>=5.4 <5.6' + peerDependenciesMeta: + '@angular/localize': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + less: + optional: true + postcss: + optional: true + tailwindcss: + optional: true + + '@angular/build@21.0.0-rc.0': + resolution: {integrity: sha512-rLHEOrIzYkIkQ7Crakv8o2PO/ZeidLWl94xDP61WjoVEFckemErIb/S9CCbGo4IWM2Oh71ETmSNoi8EMTcKu6A==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler': ^21.0.0-next.0 + '@angular/compiler-cli': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/localize': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + '@angular/platform-server': ^21.0.0-next.0 + '@angular/service-worker': ^21.0.0-next.0 + '@angular/ssr': ^21.0.0-rc.0 + karma: ^6.4.0 + less: ^4.2.0 + ng-packagr: ^21.0.0-next.0 + postcss: ^8.4.0 + tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 + tslib: ^2.3.0 + typescript: '>=5.9 <6.0' + vitest: ^4.0.0 + peerDependenciesMeta: + '@angular/core': + optional: true + '@angular/localize': + optional: true + '@angular/platform-browser': + optional: true + '@angular/platform-server': + optional: true + '@angular/service-worker': + optional: true + '@angular/ssr': + optional: true + karma: + optional: true + less: + optional: true + ng-packagr: + optional: true + postcss: + optional: true + tailwindcss: + optional: true + vitest: + optional: true + + '@angular/cdk@20.2.11': + resolution: {integrity: sha512-+zcP6eq9+h6f09rZWHNIj2nap9P6S38mm75/WjdGZbl1BJy7vaASDnr4fwXKi2JvTyap/vj6mMuadFXEivavPw==} + peerDependencies: + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/cli@21.0.0-rc.0': + resolution: {integrity: sha512-GmN6gg15r734M8W8ZylH6tNgv0xjq+2reEXx8nTIhueuRrHneqQq8dLdSSgq4GqJApQgKURDvB7XimFpZgwItQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular/common@21.0.0-rc.0': + resolution: {integrity: sha512-wZg/eNYdI/u6zU5DnfXM5tAmjByTXlPlWk4ve9LMZMyKAaw8jqrN0k210519D72saytkE7TPohL2aFGr/O8LGw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/core': ^21.0.0-next.0 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/compiler-cli@21.0.0-rc.0': + resolution: {integrity: sha512-sEljEVfXxMrSq4cBbbmCbgAhr+NKU971bXxGVm4JHJ7gKLW5s5S7r/rlHGMVCe3GfBwydRF8UrtE0Q2SZltEAg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@angular/compiler': ^21.0.0-next.0 + typescript: '>=5.9 <6.0' + peerDependenciesMeta: + typescript: + optional: true + + '@angular/compiler@21.0.0-rc.0': + resolution: {integrity: sha512-zFk1JOlOjQx1ZPyfN4UoPz2kF2B2XXfr3J+5qDqxPavv0bUa/zo/BeC8s12r53kRB3kmLQblcoyzt+KbFkLrzA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + + '@angular/core@21.0.0-rc.0': + resolution: {integrity: sha512-dRhlcCfrAbUsNycZ7eqxu54knq1ejKmyznmaJTwqA7sHIfgxC4C78tE2r6rylNECcvvB3EySV749yLHJJNDNfw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/compiler': ^21.0.0-next.0 + rxjs: ^6.5.3 || ^7.4.0 + zone.js: ~0.15.0 + peerDependenciesMeta: + '@angular/compiler': + optional: true + zone.js: + optional: true + + '@angular/forms@21.0.0-rc.0': + resolution: {integrity: sha512-ppGTKrFYAwXHwAXPoqkj63L7n6QvLgpLlp/No6mvDnn9/x34ZrcabvZWuxqj64+Mf1JJZSK8hYKbhzNz/zskcA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + '@standard-schema/spec': ^1.0.0 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/material@20.2.11': + resolution: {integrity: sha512-lrmudo8n06o6UBVKx/slAfUIjJghwub5JZfIOmQd2js0Vz+eBJYcDJsgBB8lG/LSXKLlPkNwe6o6nJBMVBZg1g==} + peerDependencies: + '@angular/cdk': 20.2.11 + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/forms': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/platform-browser-dynamic@21.0.0-rc.0': + resolution: {integrity: sha512-94JFrrdgCDHDS/a+hGdswvCK+tCJEUuaviAKa8SVybpyh+lQyGVApFePBPzL4LI3a/ph2dtn79f1QIc2eaMDeQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/common': ^21.0.0-next.0 + '@angular/compiler': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + + '@angular/platform-browser@21.0.0-rc.0': + resolution: {integrity: sha512-h6zj3cMXkXlKEAk2O1tAYc1rFJfC7zHEUmWfB/9KeGxDaBzf2A9LRLcsiApUx0Jt8qnGxPRGZq28vuAiXBCyiA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/animations': ^21.0.0-next.0 + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + peerDependenciesMeta: + '@angular/animations': + optional: true + + '@angular/platform-server@21.0.0-rc.0': + resolution: {integrity: sha512-r2KiSmCepQpzSw+54r9Axh5mW59chcGa7r6/OcSJ+Jnlnw8k3V/tJYy0UPIh16qWi4pUVoRimyjE/0nZe/2C/g==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/common': ^21.0.0-next.0 + '@angular/compiler': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/router@21.0.0-rc.0': + resolution: {integrity: sha512-iel8D+n+aqsrKgUvGJbBvNhLl10DKxEfTy6qIKk34FP01wgOJ3ni/pvnY3KYzEfGPGtAwuiM5hV0lDj+RlC+vw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + rxjs: ^6.5.3 || ^7.4.0 + + '@angular/ssr@21.0.0-rc.0': + resolution: {integrity: sha512-nRx3alILlGitSckyC5tYCEmFSqYqDtu7A5Gm0QlvhQkZb1PeEOCXX96mOG7r0LIILl7WD5S5J91xCov27YJwBw==} + peerDependencies: + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/platform-server': ^21.0.0-next.0 + '@angular/router': ^21.0.0-next.0 + peerDependenciesMeta: + '@angular/platform-server': + optional: true + + '@antfu/install-pkg@1.1.0': + resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + + '@antfu/utils@9.3.0': + resolution: {integrity: sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==} + + '@anthropic-ai/sdk@0.24.3': + resolution: {integrity: sha512-916wJXO6T6k8R6BAAcLhLPv/pnLGy7YSEBZXZ1XTFbLcTZE8oTy3oDW9WJf9KKZwMvVcePIfoTSvzXHRcGxkQQ==} + + '@anthropic-ai/vertex-sdk@0.4.3': + resolution: {integrity: sha512-2Uef0C5P2Hx+T88RnUSRA3u4aZqmqnrRSOb2N64ozgKPiSUPTM5JlggAq2b32yWMj5d3MLYa6spJXKMmHXOcoA==} + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.10': + resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.26.8': + resolution: {integrity: sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.28.5': + resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.28.5': + resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.28.5': + resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.4': + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.28.5': + resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.4': + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.26.10': + resolution: {integrity: sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.26.9': + resolution: {integrity: sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@7.1.1': + resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@colors/colors@1.6.0': + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + + '@dabh/diagnostics@2.0.8': + resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} + + '@discoveryjs/json-ext@0.6.1': + resolution: {integrity: sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==} + engines: {node: '>=14.17.0'} + + '@emnapi/core@1.7.0': + resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==} + + '@emnapi/runtime@1.7.0': + resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.0': + resolution: {integrity: sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.0': + resolution: {integrity: sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.0': + resolution: {integrity: sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.0': + resolution: {integrity: sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.0': + resolution: {integrity: sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.0': + resolution: {integrity: sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.0': + resolution: {integrity: sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.0': + resolution: {integrity: sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.0': + resolution: {integrity: sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.0': + resolution: {integrity: sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.0': + resolution: {integrity: sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.0': + resolution: {integrity: sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.0': + resolution: {integrity: sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.0': + resolution: {integrity: sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.0': + resolution: {integrity: sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.0': + resolution: {integrity: sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.0': + resolution: {integrity: sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.0': + resolution: {integrity: sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.0': + resolution: {integrity: sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.0': + resolution: {integrity: sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.0': + resolution: {integrity: sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.0': + resolution: {integrity: sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.0': + resolution: {integrity: sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.0': + resolution: {integrity: sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@fastify/busboy@3.2.0': + resolution: {integrity: sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==} + + '@firebase/app-check-interop-types@0.3.3': + resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==} + + '@firebase/app-types@0.9.3': + resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} + + '@firebase/auth-interop-types@0.2.4': + resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==} + + '@firebase/component@0.7.0': + resolution: {integrity: sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==} + engines: {node: '>=20.0.0'} + + '@firebase/database-compat@2.1.0': + resolution: {integrity: sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==} + engines: {node: '>=20.0.0'} + + '@firebase/database-types@1.0.16': + resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==} + + '@firebase/database@1.1.0': + resolution: {integrity: sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==} + engines: {node: '>=20.0.0'} + + '@firebase/logger@0.5.0': + resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==} + engines: {node: '>=20.0.0'} + + '@firebase/util@1.13.0': + resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==} + engines: {node: '>=20.0.0'} + + '@genkit-ai/ai@1.22.0': + resolution: {integrity: sha512-TDKO+zWyM5YI8zE4a0IlqlpgHuLB4B4islzgWDvzdQlbjtyJp0ayODAMFhS2ruQ6+a/UdXDySRrOX/RcqF4yjA==} + + '@genkit-ai/core@1.22.0': + resolution: {integrity: sha512-etVlpwJkPoy91xR6H5+S/AWZPJMeovb7N35+B90md1+6xWcodQF7WZ3chKcH31Xamlz+jTIvd3riiZGY9RFumg==} + + '@genkit-ai/express@1.22.0': + resolution: {integrity: sha512-dejpHSlH9YPTInDwz2COSpvI6rpZrWARJWbsf798HKMxuCDggRLJVMxxh1ZBjTJIcKfQzb2S+H/fRqHDWarpww==} + peerDependencies: + express: ^4.21.1 + genkit: ^1.22.0 + + '@genkit-ai/firebase@1.22.0': + resolution: {integrity: sha512-iTOVma8be8cOFzO9yaNuzBIICgFAP+N1cuB5T8K5LE5ahsSIG7sZWUE5FwMKtEDFk9D343kgLuvW9nxLkV7IzA==} + peerDependencies: + '@google-cloud/firestore': ^7.11.0 + firebase: '>=11.5.0' + firebase-admin: '>=12.2' + genkit: ^1.22.0 + peerDependenciesMeta: + firebase: + optional: true + + '@genkit-ai/google-cloud@1.22.0': + resolution: {integrity: sha512-PVt7oLu3VARQ4u/R4VvG/q2lsEdTke9jxQI8sg1jxHoKV03fNUwKAyNd59ZT4igrQIUCqdJD4tH3Kzh4yd4QTw==} + peerDependencies: + genkit: ^1.22.0 + + '@genkit-ai/googleai@1.22.0': + resolution: {integrity: sha512-6GTfrsv2acRWlXcvi8jqH044tG/eslMQCH1wxpA//wzTnsnht5f4SJ3isKU3gcmyQtoYWiaUN8/F7OYqkIYHcw==} + peerDependencies: + genkit: ^1.22.0 + + '@genkit-ai/vertexai@1.22.0': + resolution: {integrity: sha512-ftCWDJ2OTkcuekc4R16xQCDnnLD5E8gnVEcHhD9wpY1YyLsJ7EATQCyNg6VC2BW4A3pwn9tqjaJpOyzAIXrLPg==} + peerDependencies: + genkit: ^1.22.0 + + '@google-cloud/aiplatform@3.35.0': + resolution: {integrity: sha512-Eo+ckr1KbTxAOew9P+MeeR0aQXeW5PeOzrSM1JyGny/SGKejwX/RcGWSFpeapnlegTfI9N9xJeUeo3M+XBOeFg==} + engines: {node: '>=14.0.0'} + + '@google-cloud/bigquery@7.9.4': + resolution: {integrity: sha512-C7jeI+9lnCDYK3cRDujcBsPgiwshWKn/f0BiaJmClplfyosCLfWE83iGQ0eKH113UZzjR9c9q7aZQg0nU388sw==} + engines: {node: '>=14.0.0'} + + '@google-cloud/common@5.0.2': + resolution: {integrity: sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/firestore@7.11.6': + resolution: {integrity: sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==} + engines: {node: '>=14.0.0'} + + '@google-cloud/logging-winston@6.0.1': + resolution: {integrity: sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==} + engines: {node: '>=14.0.0'} + peerDependencies: + winston: '>=3.2.1' + + '@google-cloud/logging@11.2.1': + resolution: {integrity: sha512-2h9HBJG3OAsvzXmb81qXmaTPfXYU7KJTQUxunoOKFGnY293YQ/eCkW1Y5mHLocwpEqeqQYT/Qvl6Tk+Q7PfStw==} + engines: {node: '>=14.0.0'} + + '@google-cloud/opentelemetry-cloud-monitoring-exporter@0.19.0': + resolution: {integrity: sha512-5SOPXwC6RET4ZvXxw5D97dp8fWpqWEunHrzrUUGXhG4UAeedQe1KvYV8CK+fnaAbN2l2ha6QDYspT6z40TVY0g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/core': ^1.0.0 + '@opentelemetry/resources': ^1.0.0 + '@opentelemetry/sdk-metrics': ^1.0.0 + + '@google-cloud/opentelemetry-cloud-trace-exporter@2.4.1': + resolution: {integrity: sha512-Dq2IyAyA9PCjbjLOn86i2byjkYPC59b5ic8k/L4q5bBWH0Jro8lzMs8C0G5pJfqh2druj8HF+oAIAlSdWQ+Z9Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@opentelemetry/core': ^1.0.0 + '@opentelemetry/resources': ^1.0.0 + '@opentelemetry/sdk-trace-base': ^1.0.0 + + '@google-cloud/opentelemetry-resource-util@2.4.0': + resolution: {integrity: sha512-/7ujlMoKtDtrbQlJihCjQnm31n2s2RTlvJqcSbt2jV3OkCzPAdo3u31Q13HNugqtIRUSk7bUoLx6AzhURkhW4w==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/resources': ^1.0.0 + + '@google-cloud/paginator@5.0.2': + resolution: {integrity: sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==} + engines: {node: '>=14.0.0'} + + '@google-cloud/precise-date@4.0.0': + resolution: {integrity: sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/projectify@4.0.0': + resolution: {integrity: sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==} + engines: {node: '>=14.0.0'} + + '@google-cloud/promisify@4.0.0': + resolution: {integrity: sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==} + engines: {node: '>=14'} + + '@google-cloud/storage@7.17.3': + resolution: {integrity: sha512-gOnCAbFgAYKRozywLsxagdevTF7Gm+2Ncz5u5CQAuOv/2VCa0rdGJWvJFDOftPx1tc+q8TXiC2pEJfFKu+yeMQ==} + engines: {node: '>=14'} + + '@google-cloud/vertexai@1.10.0': + resolution: {integrity: sha512-HqYqoivNtkq59po8m7KI0n+lWKdz4kabENncYQXZCX/hBWJfXtKAfR/2nUQsP+TwSfHKoA7zDL2RrJYIv/j3VQ==} + engines: {node: '>=18.0.0'} + + '@google/generative-ai@0.24.1': + resolution: {integrity: sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==} + engines: {node: '>=18.0.0'} + + '@grpc/grpc-js@1.14.0': + resolution: {integrity: sha512-N8Jx6PaYzcTRNzirReJCtADVoq4z7+1KQ4E70jTg/koQiMoUSN1kbNjPOqpPbhMFhfU1/l7ixspPl8dNY+FoUg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + + '@grpc/proto-loader@0.8.0': + resolution: {integrity: sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==} + engines: {node: '>=6'} + hasBin: true + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + + '@inquirer/ansi@1.0.1': + resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.0': + resolution: {integrity: sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@3.1.22': + resolution: {integrity: sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.19': + resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.0': + resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@9.2.1': + resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} + engines: {node: '>=18'} + + '@inquirer/editor@4.2.21': + resolution: {integrity: sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.21': + resolution: {integrity: sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.2': + resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.14': + resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==} + engines: {node: '>=18'} + + '@inquirer/input@4.2.5': + resolution: {integrity: sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.21': + resolution: {integrity: sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.21': + resolution: {integrity: sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.9.0': + resolution: {integrity: sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.9': + resolution: {integrity: sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.0': + resolution: {integrity: sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.0': + resolution: {integrity: sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + + '@inquirer/type@2.0.0': + resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.9': + resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/buffers@1.2.1': + resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/codegen@1.0.0': + resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.21.0': + resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pointer@1.0.2': + resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.9.0': + resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@listr2/prompt-adapter-inquirer@3.0.5': + resolution: {integrity: sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@inquirer/prompts': '>= 3 < 8' + listr2: 9.0.5 + + '@lmdb/lmdb-darwin-arm64@3.0.13': + resolution: {integrity: sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-arm64@3.4.3': + resolution: {integrity: sha512-zR6Y45VNtW5s+A+4AyhrJk0VJKhXdkLhrySCpCu7PSdnakebsOzNxf58p5Xoq66vOSuueGAxlqDAF49HwdrSTQ==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@3.0.13': + resolution: {integrity: sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@3.4.3': + resolution: {integrity: sha512-nfGm5pQksBGfaj9uMbjC0YyQreny/Pl7mIDtHtw6g7WQuCgeLullr9FNRsYyKplaEJBPrCVpEjpAznxTBIrXBw==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@3.0.13': + resolution: {integrity: sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm64@3.4.3': + resolution: {integrity: sha512-uX9eaPqWb740wg5D3TCvU/js23lSRSKT7lJrrQ8IuEG/VLgpPlxO3lHDywU44yFYdGS7pElBn6ioKFKhvALZlw==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@3.0.13': + resolution: {integrity: sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-arm@3.4.3': + resolution: {integrity: sha512-Kjqomp7i0rgSbYSUmv9JnXpS55zYT/YcW3Bdf9oqOTjcH0/8tFAP8MLhu/i9V2pMKIURDZk63Ww49DTK0T3c/Q==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@3.0.13': + resolution: {integrity: sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-linux-x64@3.4.3': + resolution: {integrity: sha512-7/8l20D55CfwdMupkc3fNxNJdn4bHsti2X0cp6PwiXlLeSFvAfWs5kCCx+2Cyje4l4GtN//LtKWjTru/9hDJQg==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-arm64@3.4.3': + resolution: {integrity: sha512-yWVR0e5Gl35EGJBsAuqPOdjtUYuN8CcTLKrqpQFoM+KsMadViVCulhKNhkcjSGJB88Am5bRPjMro4MBB9FS23Q==} + cpu: [arm64] + os: [win32] + + '@lmdb/lmdb-win32-x64@3.0.13': + resolution: {integrity: sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==} + cpu: [x64] + os: [win32] + + '@lmdb/lmdb-win32-x64@3.4.3': + resolution: {integrity: sha512-1JdBkcO0Vrua4LUgr4jAe4FUyluwCeq/pDkBrlaVjX3/BBWP1TzVjCL+TibWNQtPAL1BITXPAhlK5Ru4FBd/hg==} + cpu: [x64] + os: [win32] + + '@mermaid-js/parser@0.6.3': + resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==} + + '@mistralai/mistralai-gcp@1.5.0': + resolution: {integrity: sha512-KUv4GziIN8do4gmPe7T85gpYW1o2Q89e0hs8PQfZhFRMYz7uYPwxHyVI5UaxWlHFcmAvyxfaOAH0OuCC38Hb6g==} + peerDependencies: + zod: '>= 3' + + '@modelcontextprotocol/sdk@1.20.1': + resolution: {integrity: sha512-j/P+yuxXfgxb+mW7OEoRCM3G47zCTDqUPivJo/VzpjbG8I9csTXtOprCf5FfOfHK4whOJny0aHuBEON+kS7CCA==} + engines: {node: '>=18'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@ngtools/webpack@18.2.21': + resolution: {integrity: sha512-mfLT7lXbyJRlsazuPyuF5AGsMcgzRJRwsDlgxFbiy1DBlaF1chRFsXrKYj1gQ/WXQWNcEd11aedU0Rt+iCNDVw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler-cli': ^21.0.0-next.0 + typescript: '>=5.4 <5.6' + webpack: ^5.54.0 + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/agent@3.0.0': + resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/agent@4.0.0': + resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/fs@4.0.0': + resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/git@7.0.0': + resolution: {integrity: sha512-vnz7BVGtOctJAIHouCJdvWBhsTVSICMeUgZo2c7XAi5d5Rrl80S1H7oPym7K03cRuinK5Q6s2dw36+PgXQTcMA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/installed-package-contents@3.0.0': + resolution: {integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + '@npmcli/node-gyp@5.0.0': + resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/package-json@7.0.1': + resolution: {integrity: sha512-956YUeI0YITbk2+KnirCkD19HLzES0habV+Els+dyZaVsaM6VGSiNwnRu6t3CZaqDLz4KXy2zx+0N/Zy6YjlAA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/promise-spawn@8.0.3': + resolution: {integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/promise-spawn@9.0.0': + resolution: {integrity: sha512-qxvGj3ZM6Zuk8YeVMY0gZHY19WN6g3OGxwR4MBaxHImfD/4zD0HpgBHNOSayEaisj/p3PyQjdQlO9tbl5ZBFZg==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/redact@3.2.2': + resolution: {integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@npmcli/run-script@10.0.2': + resolution: {integrity: sha512-9lCTqxaoa9c9cdkzSSx+q/qaYrCrUPEwTWzLkVYg1/T8ESH3BG9vmb1zRc6ODsBVB0+gnGRSqSr01pxTS1yX3A==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@opentelemetry/api-logs@0.52.1': + resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/auto-instrumentations-node@0.49.2': + resolution: {integrity: sha512-xtETEPmAby/3MMmedv8Z/873sdLTWg+Vq98rtm4wbwvAiXBB/ao8qRyzRlvR2MR6puEr+vIB/CXeyJnzNA3cyw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.4.1 + + '@opentelemetry/context-async-hooks@1.25.1': + resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.25.1': + resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.30.1': + resolution: {integrity: sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/exporter-jaeger@1.30.1': + resolution: {integrity: sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==} + engines: {node: '>=14'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1': + resolution: {integrity: sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-trace-otlp-http@0.52.1': + resolution: {integrity: sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-trace-otlp-proto@0.52.1': + resolution: {integrity: sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/exporter-zipkin@1.25.1': + resolution: {integrity: sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-amqplib@0.41.0': + resolution: {integrity: sha512-00Oi6N20BxJVcqETjgNzCmVKN+I5bJH/61IlHiIWd00snj1FdgiIKlpE4hYVacTB2sjIBB3nTbHskttdZEE2eg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-lambda@0.43.0': + resolution: {integrity: sha512-pSxcWlsE/pCWQRIw92sV2C+LmKXelYkjkA7C5s39iPUi4pZ2lA1nIiw+1R/y2pDEhUHcaKkNyljQr3cx9ZpVlQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-aws-sdk@0.43.1': + resolution: {integrity: sha512-qLT2cCniJ5W+6PFzKbksnoIQuq9pS83nmgaExfUwXVvlwi0ILc50dea0tWBHZMkdIDa/zZdcuFrJ7+fUcSnRow==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-bunyan@0.40.0': + resolution: {integrity: sha512-aZ4cXaGWwj79ZXSYrgFVsrDlE4mmf2wfvP9bViwRc0j75A6eN6GaHYHqufFGMTCqASQn5pIjjP+Bx+PWTGiofw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cassandra-driver@0.40.0': + resolution: {integrity: sha512-JxbM39JU7HxE9MTKKwi6y5Z3mokjZB2BjwfqYi4B3Y29YO3I42Z7eopG6qq06yWZc+nQli386UDQe0d9xKmw0A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.38.0': + resolution: {integrity: sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-cucumber@0.8.0': + resolution: {integrity: sha512-ieTm4RBIlZt2brPwtX5aEZYtYnkyqhAVXJI9RIohiBVMe5DxiwCwt+2Exep/nDVqGPX8zRBZUl4AEw423OxJig==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/instrumentation-dataloader@0.11.0': + resolution: {integrity: sha512-27urJmwkH4KDaMJtEv1uy2S7Apk4XbN4AgWMdfMJbi7DnOduJmeuA+DpJCwXB72tEWXo89z5T3hUVJIDiSNmNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dns@0.38.0': + resolution: {integrity: sha512-Um07I0TQXDWa+ZbEAKDFUxFH40dLtejtExDOMLNJ1CL8VmOmA71qx93Qi/QG4tGkiI1XWqr7gF/oiMCJ4m8buQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.41.1': + resolution: {integrity: sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.38.0': + resolution: {integrity: sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.14.0': + resolution: {integrity: sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.38.1': + resolution: {integrity: sha512-WvssuKCuavu/hlq661u82UWkc248cyI/sT+c2dEIj6yCk0BUkErY1D+9XOO+PmHdJNE+76i2NdcvQX5rJrOe/w==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.42.0': + resolution: {integrity: sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-grpc@0.52.1': + resolution: {integrity: sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.40.0': + resolution: {integrity: sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.52.1': + resolution: {integrity: sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.42.0': + resolution: {integrity: sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.2.0': + resolution: {integrity: sha512-uKKmhEFd0zR280tJovuiBG7cfnNZT4kvVTvqtHPxQP7nOmRbJstCYHFH13YzjVcKjkmoArmxiSulmZmF7SLIlg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.39.0': + resolution: {integrity: sha512-lRwTqIKQecPWDkH1KEcAUcFhCaNssbKSpxf4sxRTAROCwrCEnYkjOuqJHV+q1/CApjMTaKu0Er4LBv/6bDpoxA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.42.0': + resolution: {integrity: sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.39.0': + resolution: {integrity: sha512-eU1Wx1RRTR/2wYXFzH9gcpB8EPmhYlNDIUHzUXjyUE0CAXEJhBLkYNlzdaVCoQDw2neDqS+Woshiia6+emWK9A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-memcached@0.38.0': + resolution: {integrity: sha512-tPmyqQEZNyrvg6G+iItdlguQEcGzfE+bJkpQifmBXmWBnoS5oU3UxqtyYuXGL2zI9qQM5yMBHH4nRXWALzy7WA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.46.0': + resolution: {integrity: sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.41.0': + resolution: {integrity: sha512-ivJg4QnnabFxxoI7K8D+in7hfikjte38sYzJB9v1641xJk9Esa7jM3hmbPB7lxwcgWJLVEDvfPwobt1if0tXxA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.40.0': + resolution: {integrity: sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.40.0': + resolution: {integrity: sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.39.0': + resolution: {integrity: sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-net@0.38.0': + resolution: {integrity: sha512-stjow1PijcmUquSmRD/fSihm/H61DbjPlJuJhWUe7P22LFPjFhsrSeiB5vGj3vn+QGceNAs+kioUTzMGPbNxtg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.43.0': + resolution: {integrity: sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pino@0.41.0': + resolution: {integrity: sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis-4@0.41.1': + resolution: {integrity: sha512-UqJAbxraBk7s7pQTlFi5ND4sAUs4r/Ai7gsAVZTQDbHl2kSsOp7gpHcpIuN5dpcI2xnuhM2tkH4SmEhbrv2S6Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.41.0': + resolution: {integrity: sha512-RJ1pwI3btykp67ts+5qZbaFSAAzacucwBet5/5EsKYtWBpHbWwV/qbGN/kIBzXg5WEZBhXLrR/RUq0EpEUpL3A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-restify@0.40.0': + resolution: {integrity: sha512-sm/rH/GysY/KOEvZqYBZSLYFeXlBkHCgqPDgWc07tz+bHCN6mPs9P3otGOSTe7o3KAIM8Nc6ncCO59vL+jb2cA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-router@0.39.0': + resolution: {integrity: sha512-LaXnVmD69WPC4hNeLzKexCCS19hRLrUw3xicneAMkzJSzNJvPyk7G6I7lz7VjQh1cooObPBt9gNyd3hhTCUrag==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-socket.io@0.41.0': + resolution: {integrity: sha512-7fzDe9/FpO6NFizC/wnzXXX7bF9oRchsD//wFqy5g5hVEgXZCQ70IhxjrKdBvgjyIejR9T9zTvfQ6PfVKfkCAw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.13.0': + resolution: {integrity: sha512-Pob0+0R62AqXH50pjazTeGBy/1+SK4CYpFUBV5t7xpbpeuQezkkgVGvLca84QqjBqQizcXedjpUJLgHQDixPQg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.5.0': + resolution: {integrity: sha512-aNTeSrFAVcM9qco5DfZ9DNXu6hpMRe8Kt8nCDHfMWDB3pwgGVUE76jTdohc+H/7eLRqh4L7jqs5NSQoHw7S6ww==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation-winston@0.39.0': + resolution: {integrity: sha512-v/1xziLJ9CyB3YDjBSBzbB70Qd0JwWTo36EqWK5m3AR0CzsyMQQmf3ZIZM6sgx7hXMcRQ0pnEYhg6nhrUQPm9A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.52.1': + resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/otlp-exporter-base@0.52.1': + resolution: {integrity: sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-grpc-exporter-base@0.52.1': + resolution: {integrity: sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/otlp-transformer@0.52.1': + resolution: {integrity: sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/propagation-utils@0.30.16': + resolution: {integrity: sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/propagator-aws-xray@1.26.2': + resolution: {integrity: sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-b3@1.25.1': + resolution: {integrity: sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/propagator-jaeger@1.25.1': + resolution: {integrity: sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} + + '@opentelemetry/resource-detector-alibaba-cloud@0.29.7': + resolution: {integrity: sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-aws@1.12.0': + resolution: {integrity: sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-azure@0.2.12': + resolution: {integrity: sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-container@0.4.4': + resolution: {integrity: sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resource-detector-gcp@0.29.13': + resolution: {integrity: sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + + '@opentelemetry/resources@1.25.1': + resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/resources@1.30.1': + resolution: {integrity: sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-logs@0.52.1': + resolution: {integrity: sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.25.1': + resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-node@0.52.1': + resolution: {integrity: sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.25.1': + resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.30.1': + resolution: {integrity: sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-trace-node@1.25.1': + resolution: {integrity: sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.25.1': + resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.28.0': + resolution: {integrity: sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==} + engines: {node: '>=14'} + + '@opentelemetry/semantic-conventions@1.37.0': + resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + + '@oxc-project/types@0.95.0': + resolution: {integrity: sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + + '@rolldown/binding-android-arm64@1.0.0-beta.44': + resolution: {integrity: sha512-g9ejDOehJFhxC1DIXQuZQ9bKv4lRDioOTL42cJjFjqKPl1L7DVb9QQQE1FxokGEIMr6FezLipxwnzOXWe7DNPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.44': + resolution: {integrity: sha512-PxAW1PXLPmCzfhfKIS53kwpjLGTUdIfX4Ht+l9mj05C3lYCGaGowcNsYi2rdxWH24vSTmeK+ajDNRmmmrK0M7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.44': + resolution: {integrity: sha512-/CtQqs1oO9uSb5Ju60rZvsdjE7Pzn8EK2ISAdl2jedjMzeD/4neNyCbwyJOAPzU+GIQTZVyrFZJX+t7HXR1R/g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.44': + resolution: {integrity: sha512-V5Q5W9c4+2GJ4QabmjmVV6alY97zhC/MZBaLkDtHwGy3qwzbM4DYgXUbun/0a8AH5hGhuU27tUIlYz6ZBlvgOA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44': + resolution: {integrity: sha512-X6adjkHeFqKsTU0FXdNN9HY4LDozPqIfHcnXovE5RkYLWIjMWuc489mIZ6iyhrMbCqMUla9IOsh5dvXSGT9o9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44': + resolution: {integrity: sha512-kRRKGZI4DXWa6ANFr3dLA85aSVkwPdgXaRjfanwY84tfc3LncDiIjyWCb042e3ckPzYhHSZ3LmisO+cdOIYL6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.44': + resolution: {integrity: sha512-hMtiN9xX1NhxXBa2U3Up4XkVcsVp2h73yYtMDY59z9CDLEZLrik9RVLhBL5QtoX4zZKJ8HZKJtWuGYvtmkCbIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.44': + resolution: {integrity: sha512-rd1LzbpXQuR8MTG43JB9VyXDjG7ogSJbIkBpZEHJ8oMKzL6j47kQT5BpIXrg3b5UVygW9QCI2fpFdMocT5Kudg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.44': + resolution: {integrity: sha512-qI2IiPqmPRW25exXkuQr3TlweCDc05YvvbSDRPCuPsWkwb70dTiSoXn8iFxT4PWqTi71wWHg1Wyta9PlVhX5VA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.44': + resolution: {integrity: sha512-+vHvEc1pL5iJRFlldLC8mjm6P4Qciyfh2bh5ZI6yxDQKbYhCHRKNURaKz1mFcwxhVL5YMYsLyaqM3qizVif9MQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.44': + resolution: {integrity: sha512-XSgLxRrtFj6RpTeMYmmQDAwHjKseYGKUn5LPiIdW4Cq+f5SBSStL2ToBDxkbdxKPEbCZptnLPQ/nfKcAxrC8Xg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44': + resolution: {integrity: sha512-cF1LJdDIX02cJrFrX3wwQ6IzFM7I74BYeKFkzdcIA4QZ0+2WA7/NsKIgjvrunupepWb1Y6PFWdRlHSaz5AW1Wg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44': + resolution: {integrity: sha512-5uaJonDafhHiMn+iEh7qUp3QQ4Gihv3lEOxKfN8Vwadpy0e+5o28DWI42DpJ9YBYMrVy4JOWJ/3etB/sptpUwA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.44': + resolution: {integrity: sha512-vsqhWAFJkkmgfBN/lkLCWTXF1PuPhMjfnAyru48KvF7mVh2+K7WkKYHezF3Fjz4X/mPScOcIv+g6cf6wnI6eWg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.44': + resolution: {integrity: sha512-g6eW7Zwnr2c5RADIoqziHoVs6b3W5QTQ4+qbpfjbkMJ9x+8Og211VW/oot2dj9dVwaK/UyC6Yo+02gV+wWQVNg==} + + '@rollup/rollup-android-arm-eabi@4.22.4': + resolution: {integrity: sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.22.4': + resolution: {integrity: sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.22.4': + resolution: {integrity: sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.22.4': + resolution: {integrity: sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.22.4': + resolution: {integrity: sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.22.4': + resolution: {integrity: sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.22.4': + resolution: {integrity: sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.22.4': + resolution: {integrity: sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.22.4': + resolution: {integrity: sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.22.4': + resolution: {integrity: sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.22.4': + resolution: {integrity: sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.22.4': + resolution: {integrity: sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.22.4': + resolution: {integrity: sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.22.4': + resolution: {integrity: sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.22.4': + resolution: {integrity: sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.22.4': + resolution: {integrity: sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + + '@schematics/angular@21.0.0-rc.0': + resolution: {integrity: sha512-yLHNXvlQ3+Z+23QPOFLWwr61G68abowJWt6MKXPZPnzi6Oh/ZlJTTQCGXWPkcq6IzfcTnq4zZSrPbh6fykiEYA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@sigstore/bundle@4.0.0': + resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/core@3.0.0': + resolution: {integrity: sha512-NgbJ+aW9gQl/25+GIEGYcCyi8M+ng2/5X04BMuIgoDfgvp18vDcoNHOQjQsG9418HGNYRxG3vfEXaR1ayD37gg==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/protobuf-specs@0.5.0': + resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@sigstore/sign@4.0.1': + resolution: {integrity: sha512-KFNGy01gx9Y3IBPG/CergxR9RZpN43N+lt3EozEfeoyqm8vEiLxwRl3ZO5sPx3Obv1ix/p7FWOlPc2Jgwfp9PA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/tuf@4.0.0': + resolution: {integrity: sha512-0QFuWDHOQmz7t66gfpfNO6aEjoFrdhkJaej/AOqb4kqWZVbPWFZifXZzkxyQBB1OwTbkhdT3LNpMFxwkTvf+2w==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/verify@3.0.0': + resolution: {integrity: sha512-moXtHH33AobOhTZF8xcX1MpOFqdvfCk7v6+teJL8zymBiDXwEsQH6XG9HGx2VIxnJZNm4cNSzflTLDnQLmIdmw==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@so-ric/colorspace@1.1.6': + resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} + + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@tailwindcss/node@4.1.16': + resolution: {integrity: sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==} + + '@tailwindcss/oxide-android-arm64@4.1.16': + resolution: {integrity: sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.16': + resolution: {integrity: sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.16': + resolution: {integrity: sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.16': + resolution: {integrity: sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + resolution: {integrity: sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + resolution: {integrity: sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + resolution: {integrity: sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + resolution: {integrity: sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + resolution: {integrity: sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + resolution: {integrity: sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + resolution: {integrity: sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + resolution: {integrity: sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.16': + resolution: {integrity: sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.16': + resolution: {integrity: sha512-Qn3SFGPXYQMKR/UtqS+dqvPrzEeBZHrFA92maT4zijCVggdsXnDBMsPFJo1eArX3J+O+Gi+8pV4PkqjLCNBk3A==} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@4.0.0': + resolution: {integrity: sha512-h5x5ga/hh82COe+GoD4+gKUeV4T3iaYOxqLt41GRKApinPI7DMidhCmNVTjKfhCWFJIGXaFJee07XczdT4jdZQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/aws-lambda@8.10.122': + resolution: {integrity: sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==} + + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/bunyan@1.8.9': + resolution: {integrity: sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==} + + '@types/caseless@0.12.5': + resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.36': + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/d3-array@3.2.2': + resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} + + '@types/d3-axis@3.0.6': + resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} + + '@types/d3-brush@3.0.6': + resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} + + '@types/d3-chord@3.0.6': + resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} + + '@types/d3-color@3.1.3': + resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} + + '@types/d3-contour@3.0.6': + resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} + + '@types/d3-delaunay@6.0.4': + resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} + + '@types/d3-dispatch@3.0.7': + resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} + + '@types/d3-drag@3.0.7': + resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} + + '@types/d3-dsv@3.0.7': + resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} + + '@types/d3-ease@3.0.2': + resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} + + '@types/d3-fetch@3.0.7': + resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} + + '@types/d3-force@3.0.10': + resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} + + '@types/d3-format@3.0.4': + resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} + + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} + + '@types/d3-hierarchy@3.1.7': + resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} + + '@types/d3-interpolate@3.0.4': + resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} + + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} + + '@types/d3-polygon@3.0.2': + resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} + + '@types/d3-quadtree@3.0.6': + resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} + + '@types/d3-random@3.0.3': + resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-selection@3.0.11': + resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} + + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} + + '@types/d3-time-format@4.0.3': + resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/d3-timer@3.0.2': + resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} + + '@types/d3-transition@3.0.9': + resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} + + '@types/d3-zoom@3.0.8': + resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} + + '@types/d3@7.4.3': + resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/express-serve-static-core@4.19.7': + resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + + '@types/express-serve-static-core@5.1.0': + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} + + '@types/express@4.17.25': + resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + + '@types/express@5.0.5': + resolution: {integrity: sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==} + + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + + '@types/highlight.js@10.1.0': + resolution: {integrity: sha512-77hF2dGBsOgnvZll1vymYiNUtqJ8cJfXPD6GG/2M0aLRc29PkvB7Au6sIDjIEFcSICBhCh2+Pyq6WSRS7LUm6A==} + deprecated: This is a stub types definition. highlight.js provides its own type definitions, so you do not need this installed. + + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} + + '@types/http-proxy@1.17.17': + resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} + + '@types/jasmine@5.1.12': + resolution: {integrity: sha512-1BzPxNsFDLDfj9InVR3IeY0ZVf4o9XV+4mDqoCfyPkbsA7dYyKAPAb2co6wLFlHcvxPlt1wShm7zQdV7uTfLGA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + + '@types/long@4.0.2': + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + + '@types/memcached@2.2.10': + resolution: {integrity: sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + + '@types/mysql@2.15.22': + resolution: {integrity: sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==} + + '@types/node-fetch@2.6.13': + resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} + + '@types/node-forge@1.3.14': + resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} + + '@types/node@18.19.130': + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} + + '@types/node@20.19.24': + resolution: {integrity: sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==} + + '@types/node@22.19.0': + resolution: {integrity: sha512-xpr/lmLPQEj+TUnHmR+Ab91/glhJvsqcjB+yY0Ix9GO70H6Lb4FHH5GeqdOE5btAx7eIMwuHkp4H2MSkLcqWbA==} + + '@types/pg-pool@2.0.4': + resolution: {integrity: sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==} + + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/request@2.48.13': + resolution: {integrity: sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/send@0.17.6': + resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} + + '@types/send@1.2.1': + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.10': + resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/triple-beam@1.3.5': + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@vitejs/plugin-basic-ssl@1.1.0': + resolution: {integrity: sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==} + engines: {node: '>=14.6.0'} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + + '@vitejs/plugin-basic-ssl@2.1.0': + resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + peerDependencies: + vite: ^6.0.0 || ^7.0.0 + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + '@yarnpkg/lockfile@1.1.0': + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + adjust-sourcemap-loader@4.0.0: + resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} + engines: {node: '>=8.9'} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + algoliasearch@5.40.1: + resolution: {integrity: sha512-iUNxcXUNg9085TJx0HJLjqtDE0r1RZ0GOGrt8KNQqQT5ugu8lZsHuMUYW/e0lHhq6xBvmktU9Bw4CXP9VQeKrg==} + engines: {node: '>= 14.0.0'} + + ansi-color@0.2.1: + resolution: {integrity: sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.1.1: + resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} + engines: {node: '>=18'} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + arrify@2.0.1: + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} + + async-mutex@0.5.0: + resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} + + async-retry@1.3.3: + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-loader@9.1.3: + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.11.1: + resolution: {integrity: sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + + baseline-browser-mapping@2.8.23: + resolution: {integrity: sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==} + hasBin: true + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + beasties@0.3.5: + resolution: {integrity: sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==} + engines: {node: '>=14.0.0'} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + big.js@6.2.2: + resolution: {integrity: sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ==} + + bignumber.js@9.3.1: + resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + bufrw@1.4.0: + resolution: {integrity: sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==} + engines: {node: '>= 0.10.x'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cacache@19.0.1: + resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + cacache@20.0.1: + resolution: {integrity: sha512-+7LYcYGBYoNqTp1Rv7Ny1YjUo5E0/ftkQtraH3vkfAGgVHc+ouWdC8okAwQgQR7EVIdW6JTzTmhKFwzb+4okAQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001753: + resolution: {integrity: sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-spinners@3.3.0: + resolution: {integrity: sha512-/+40ljC3ONVnYIttjMWrlL51nItDAbBrq2upN8BPyvGU/2n5Oxw3tbNwORCaNuNqLJnxGqOfjUuhsv7l5Q4IsQ==} + engines: {node: '>=18.20'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-truncate@5.1.1: + resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + engines: {node: '>=20'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-convert@3.1.2: + resolution: {integrity: sha512-UNqkvCDXstVck3kdowtOTWROIJQwafjOfXSmddoDrXo4cewMKmusCeF22Q24zvjR8nwWib/3S/dfyzPItPEiJg==} + engines: {node: '>=14.6'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-name@2.0.2: + resolution: {integrity: sha512-9vEt7gE16EW7Eu7pvZnR0abW9z6ufzhXxGXZEVU9IqPdlsUiMwJeJfRtq0zePUmnbHGT9zajca7mX8zgoayo4A==} + engines: {node: '>=12.20'} + + color-string@2.1.2: + resolution: {integrity: sha512-RxmjYxbWemV9gKu4zPgiZagUxbH3RQpEIO77XoSSX0ivgABDZ+h8Zuash/EMFLTI4N9QgFPOJ6JQpPZKFxa+dA==} + engines: {node: '>=18'} + + color@5.0.2: + resolution: {integrity: sha512-e2hz5BzbUPcYlIRHo8ieAhYgoajrJr+hWoceg6E345TPsATMUKqDgzt8fSXZJJbxfpiPzkWyphz8yn8At7q3fA==} + engines: {node: '>=18'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.8.1: + resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + connect@3.7.0: + resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} + engines: {node: '>= 0.10.0'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + copy-webpack-plugin@12.0.2: + resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.1.0 + + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cose-base@2.2.0: + resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + critters@0.0.24: + resolution: {integrity: sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==} + deprecated: Ownership of Critters has moved to the Nuxt team, who will be maintaining the project going forward. If you'd like to keep using Critters, please switch to the actively-maintained fork at https://github.com/danielroe/beasties + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-loader@7.1.2: + resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-select@6.0.0: + resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + css-what@7.0.0: + resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + custom-event@1.0.1: + resolution: {integrity: sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape-fcose@2.2.0: + resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.33.1: + resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.13: + resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + date-format@4.0.14: + resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} + engines: {node: '>=4.0'} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + di@0.0.1: + resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dom-serialize@2.2.1: + resolution: {integrity: sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + dompurify@3.3.0: + resolution: {integrity: sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dot-prop@6.0.1: + resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} + engines: {node: '>=10'} + + dotprompt@1.1.2: + resolution: {integrity: sha512-24EU+eORQbPywBicIP44BiqykzEXFwZq1ZQKO5TEr9KrrENyDA7I1NzqhtmmEdQVfAXka0DEbSLPN5nerCqJ8A==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} + + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emoji-toolkit@9.0.1: + resolution: {integrity: sha512-sMMNqKNLVHXJfIKoPbrRJwtYuysVNC9GlKetr72zE3SSVbHqoeDLWVrxP0uM0AE0qvdl3hbUk+tJhhwXZrDHaw==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + + ent@2.2.2: + resolution: {integrity: sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==} + engines: {node: '>= 0.4'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + + error@7.0.2: + resolution: {integrity: sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild-wasm@0.23.0: + resolution: {integrity: sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.0: + resolution: {integrity: sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + eventid@2.0.1: + resolution: {integrity: sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==} + engines: {node: '>=10'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + farmhash-modern@1.1.0: + resolution: {integrity: sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==} + engines: {node: '>=18.0.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + find-yarn-workspace-root@2.0.0: + resolution: {integrity: sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==} + + firebase-admin@13.5.0: + resolution: {integrity: sha512-QZOpv1DJRJpH8NcWiL1xXE10tw3L/bdPFlgjcWrqU3ufyOJDYfxB1MMtxiVTwxK16NlybQbEM6ciSich2uWEIQ==} + engines: {node: '>=18'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data-encoder@1.7.2: + resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} + + form-data@2.5.5: + resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} + engines: {node: '>= 0.12'} + + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + engines: {node: '>= 6'} + + formdata-node@4.4.1: + resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} + engines: {node: '>= 12.20'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + gaxios@6.7.1: + resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} + engines: {node: '>=14'} + + gcp-metadata@6.1.1: + resolution: {integrity: sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==} + engines: {node: '>=14'} + + genkit@1.22.0: + resolution: {integrity: sha512-GoVVO3EnNHrjkMkUPRvgx1MjBHKvOlZAu/ffMIJgLFxrH7rrUbvfHXE6Nk7uh5BNvET7+DApyhbhqz9G8sy+mQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.4.0: + resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regex.js@1.2.0: + resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@11.0.3: + resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} + engines: {node: 20 || >=22} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globby@14.1.0: + resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} + engines: {node: '>=18'} + + good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + + google-auth-library@9.15.1: + resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==} + engines: {node: '>=14'} + + google-gax@4.6.1: + resolution: {integrity: sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==} + engines: {node: '>=14'} + + google-logging-utils@0.0.2: + resolution: {integrity: sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==} + engines: {node: '>=14'} + + googleapis-common@7.2.0: + resolution: {integrity: sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==} + engines: {node: '>=14.0.0'} + + googleapis@137.1.0: + resolution: {integrity: sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==} + engines: {node: '>=14.0.0'} + + googleapis@140.0.1: + resolution: {integrity: sha512-ZGvBX4mQcFXO9ACnVNg6Aqy3KtBPB5zTuue43YVLxwn8HSv8jB7w+uDKoIPSoWuxGROgnj2kbng6acXncOQRNA==} + engines: {node: '>=14.0.0'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gtoken@7.1.0: + resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} + engines: {node: '>=14.0.0'} + + hachure-fill@0.5.2: + resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hexer@1.5.0: + resolution: {integrity: sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==} + engines: {node: '>= 0.10.x'} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + hosted-git-info@9.0.2: + resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} + engines: {node: ^20.17.0 || >=22.9.0} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.10: + resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + http-proxy-middleware@2.0.9: + resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy-middleware@3.0.5: + resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.7.0: + resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore-walk@8.0.0: + resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} + engines: {node: ^20.17.0 || >=22.9.0} + + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-in-the-middle@1.15.0: + resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@5.0.0: + resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} + engines: {node: ^18.17.0 || >=20.5.0} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + ip-address@10.0.1: + resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + is@3.3.2: + resolution: {integrity: sha512-a2xr4E3s1PjDS8ORcGgXpWx6V+liNs+O3JRD2mb9aeugD7rtkkZ0zgLdYgw0tWsKhsdiezGYptSiMlVazCBTuQ==} + engines: {node: '>= 0.4'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} + + jaeger-client@3.19.0: + resolution: {integrity: sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==} + engines: {node: '>=10'} + + jasmine-core@4.6.1: + resolution: {integrity: sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==} + + jasmine-core@5.10.0: + resolution: {integrity: sha512-MrChbWV5LBo+EaeKwTM1eZ6oYSz1brvFExnRafraEkJkbJ9evbUxABhnIgGQimhpMxhg+BD6QmOvb/e3NXsNdg==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jose@4.15.9: + resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@4.0.0: + resolution: {integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==} + engines: {node: ^18.17.0 || >=20.5.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stable-stringify@1.3.0: + resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} + engines: {node: '>= 0.4'} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonify@0.0.1: + resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.2: + resolution: {integrity: sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==} + + jwa@2.0.1: + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} + + jwks-rsa@3.2.0: + resolution: {integrity: sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==} + engines: {node: '>=14'} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + jws@4.0.0: + resolution: {integrity: sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==} + + karma-chrome-launcher@3.2.0: + resolution: {integrity: sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==} + + karma-coverage@2.2.1: + resolution: {integrity: sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==} + engines: {node: '>=10.0.0'} + + karma-jasmine-html-reporter@2.1.0: + resolution: {integrity: sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==} + peerDependencies: + jasmine-core: ^4.0.0 || ^5.0.0 + karma: ^6.0.0 + karma-jasmine: ^5.0.0 + + karma-jasmine@5.1.0: + resolution: {integrity: sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==} + engines: {node: '>=12'} + peerDependencies: + karma: ^6.0.0 + + karma-source-map-support@1.4.0: + resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + + karma@6.4.4: + resolution: {integrity: sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==} + engines: {node: '>= 10'} + hasBin: true + + katex@0.16.25: + resolution: {integrity: sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==} + hasBin: true + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + klaw-sync@6.0.0: + resolution: {integrity: sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==} + + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + + kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + + langium@3.3.1: + resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} + engines: {node: '>=16.0.0'} + + launch-editor@2.12.0: + resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + layout-base@2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + + less-loader@12.2.0: + resolution: {integrity: sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + + license-webpack-plugin@4.0.2: + resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} + peerDependencies: + webpack: '*' + peerDependenciesMeta: + webpack: + optional: true + + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + + limiter@1.1.5: + resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + + listr2@9.0.5: + resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} + engines: {node: '>=20.0.0'} + + lmdb@3.0.13: + resolution: {integrity: sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==} + hasBin: true + + lmdb@3.4.3: + resolution: {integrity: sha512-GWV1kVi6uhrXWqe+3NXWO73OYe8fto6q8JMo0HOpk1vf8nEyFWgo4CSNJpIFzsOxOrysVUlcO48qRbQfmKd1gA==} + hasBin: true + + loader-runner@4.3.1: + resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + + local-pkg@1.1.2: + resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} + engines: {node: '>=14'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.mapvalues@4.6.0: + resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + log4js@6.9.1: + resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} + engines: {node: '>=8.0'} + + logform@2.7.0: + resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} + engines: {node: '>= 12.0.0'} + + long@1.1.5: + resolution: {integrity: sha512-TU6nAF5SdasnTr28c7e74P4Crbn9o3/zwo1pM22Wvg2i2vlZ4Eelxwu4QT7j21z0sDBlJDEnEZjXTZg2J8WJrg==} + engines: {node: '>=0.6'} + + long@2.4.0: + resolution: {integrity: sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==} + engines: {node: '>=0.6'} + + long@5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.2.2: + resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} + engines: {node: 20 || >=22} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-memoizer@2.3.0: + resolution: {integrity: sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magic-string@0.30.19: + resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-fetch-happen@14.0.3: + resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + make-fetch-happen@15.0.2: + resolution: {integrity: sha512-sI1NY4lWlXBAfjmCtVWIIpBypbBdhHtcjnwnv+gtCnsaOffyFil3aidszGC8hgzJe+fT1qix05sWxmD/Bmf/oQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + marked@16.4.1: + resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==} + engines: {node: '>= 20'} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + memfs@4.50.0: + resolution: {integrity: sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@11.12.1: + resolution: {integrity: sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + mini-css-extract-plugin@2.9.0: + resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@10.1.1: + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass-fetch@4.0.1: + resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + + mrmime@2.0.0: + resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + engines: {node: '>=10'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.5: + resolution: {integrity: sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + ngx-highlightjs@14.0.1: + resolution: {integrity: sha512-pa4YPChIho+Qs6P036oMvTt8pmTlMwberz/kGBojKVMEHSj9t4PT1YzBplM+RMK0VWgLK4zRbJbxivQrLPr1fQ==} + peerDependencies: + '@angular/cdk': '>=19.0.0' + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + rxjs: '>=7.0.0' + + ngx-markdown@20.1.0: + resolution: {integrity: sha512-BLn6CTMO27cU0zeaJYoC1g5c1hAkrpE5oqVSQFGW0J5gq+gEuvTt4vrtNLc8Z+HYXtuuWmuhUWiXL/bYoiDJ+A==} + peerDependencies: + '@angular/common': ^21.0.0-next.0 + '@angular/core': ^21.0.0-next.0 + '@angular/platform-browser': ^21.0.0-next.0 + marked: ^15.0.0 || ^16.0.0 + rxjs: ^6.5.3 || ^7.4.0 + zone.js: ~0.15.0 + + nice-napi@1.0.2: + resolution: {integrity: sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==} + os: ['!win32'] + + node-addon-api@3.2.1: + resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + node-gyp@11.5.0: + resolution: {integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-bundled@4.0.0: + resolution: {integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==} + engines: {node: ^18.17.0 || >=20.5.0} + + npm-install-checks@8.0.0: + resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-normalize-package-bin@4.0.0: + resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} + engines: {node: ^18.17.0 || >=20.5.0} + + npm-normalize-package-bin@5.0.0: + resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-package-arg@13.0.1: + resolution: {integrity: sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-packlist@10.0.3: + resolution: {integrity: sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-pick-manifest@11.0.3: + resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + npm-registry-fetch@19.1.0: + resolution: {integrity: sha512-xyZLfs7TxPu/WKjHUs0jZOPinzBAI32kEUel6za0vH+JUTnFZ5zbHI1ZoGZRDm6oMjADtrli6FxtMlk/5ABPNw==} + engines: {node: ^20.17.0 || >=22.9.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.1.0: + resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + + openai@4.104.0: + resolution: {integrity: sha512-p99EFNsA/yX6UhVO93f5kJsDRLAg+CTA2RBqdHK4RtK8u5IJw32Hyb2dTGKbnnFmnuoBv5r7Z2CURI9sGZpSuA==} + hasBin: true + peerDependencies: + ws: ^8.18.0 + zod: ^3.23.8 + peerDependenciesMeta: + ws: + optional: true + zod: + optional: true + + opentracing@0.14.7: + resolution: {integrity: sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==} + engines: {node: '>=0.10'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ora@9.0.0: + resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} + engines: {node: '>=20'} + + ordered-binary@1.6.0: + resolution: {integrity: sha512-IQh2aMfMIDbPjI/8a3Edr+PiOpcsB7yo8NdW7aHWVaoR/pcDldunMvnnwbk/auPGqmKeAdxtZl7MHX/QmPwhvQ==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.5.0: + resolution: {integrity: sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==} + + pacote@21.0.3: + resolution: {integrity: sha512-itdFlanxO0nmQv4ORsvA9K1wv40IPfB9OmWqfaJWvoJ30VKyHsqNgDVeG+TVhI7Gk7XW8slUy7cA9r6dF5qohw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + parse5-html-rewriting-stream@7.0.0: + resolution: {integrity: sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==} + + parse5-html-rewriting-stream@8.0.0: + resolution: {integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==} + + parse5-sax-parser@7.0.0: + resolution: {integrity: sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==} + + parse5-sax-parser@8.0.0: + resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + parse5@8.0.0: + resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + partial-json@0.1.7: + resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} + + patch-package@8.0.1: + resolution: {integrity: sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==} + engines: {node: '>=14', npm: '>5'} + hasBin: true + + path-data-parser@0.1.0: + resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + path-to-regexp@8.3.0: + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} + + path-type@6.0.0: + resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} + engines: {node: '>=18'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + piscina@4.6.1: + resolution: {integrity: sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==} + + piscina@5.1.3: + resolution: {integrity: sha512-0u3N7H4+hbr40KjuVn2uNhOcthu/9usKhnw5vT3J7ply79v3D3M8naI00el9Klcy16x557VsEkkUQaHCWFXC/g==} + engines: {node: '>=20.x'} + + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + points-on-curve@0.2.0: + resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + + points-on-path@0.2.1: + resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + + postcss-loader@8.1.1: + resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + proc-log@5.0.0: + resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + proc-log@6.0.0: + resolution: {integrity: sha512-KG/XsTDN901PNfPfAMmj6N/Ywg9tM+bHK8pAz+27fS4N4Pcr+4zoYBOcGSBu6ceXYNPxkLpa4ohtfxV1XcLAfA==} + engines: {node: ^20.17.0 || >=22.9.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process@0.10.1: + resolution: {integrity: sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==} + engines: {node: '>= 0.6.0'} + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + proto3-json-serializer@2.0.2: + resolution: {integrity: sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==} + engines: {node: '>=14.0.0'} + + protobuf.js@1.1.2: + resolution: {integrity: sha512-USO7Xus/pzPw549M1TguiyoOrKEhm9VMXv+CkDufcjMC8Rd7EPbxeRQPEjCV8ua1tm0k7z9xHkogcxovZogWdA==} + + protobufjs@7.5.4: + resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} + engines: {node: '>=12.0.0'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + + punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qjobs@1.2.0: + resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} + engines: {node: '>=0.9'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + raw-body@3.0.1: + resolution: {integrity: sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==} + engines: {node: '>= 0.10'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regex-parser@2.3.1: + resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} + + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@7.5.2: + resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} + engines: {node: '>=8.6.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-url-loader@5.0.0: + resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} + engines: {node: '>=12'} + + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + retry-request@7.0.2: + resolution: {integrity: sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==} + engines: {node: '>=14'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rolldown@1.0.0-beta.44: + resolution: {integrity: sha512-gcqgyCi3g93Fhr49PKvymE8PoaGS0sf6ajQrsYaQ8o5de6aUEbD6rJZiJbhOfpcqOnycgsAsUNPYri1h25NgsQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.22.4: + resolution: {integrity: sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + roughjs@4.6.6: + resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass-loader@16.0.0: + resolution: {integrity: sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + sass: ^1.3.0 + sass-embedded: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + node-sass: + optional: true + sass: + optional: true + sass-embedded: + optional: true + webpack: + optional: true + + sass@1.77.6: + resolution: {integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==} + engines: {node: '>=14.0.0'} + hasBin: true + + sass@1.93.2: + resolution: {integrity: sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.4.2: + resolution: {integrity: sha512-FySGAa0RGcFiN6zfrO9JvK1r7TB59xuzCcTHOBXBNoKgDejlOQCR2KL/FGk3/iDlsqyYg1ELZpOmlg09B01Czw==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sigstore@4.0.0: + resolution: {integrity: sha512-Gw/FgHtrLM9WP8P5lLcSGh9OQcrTruWCELAiS48ik1QbL0cH+dfjomiRTUE9zzz+D1N6rOLkwXUvVmXZAsNE0Q==} + engines: {node: ^20.17.0 || >=22.9.0} + + slash@2.0.0: + resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} + engines: {node: '>=6'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.2: + resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} + engines: {node: '>=18'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + socks-proxy-agent@8.0.5: + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} + + socks@2.8.7: + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-loader@5.0.0: + resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.72.1 + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + ssri@12.0.0: + resolution: {integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stream-events@1.0.5: + resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + streamroller@3.1.5: + resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} + engines: {node: '>=8.0'} + + string-template@0.2.1: + resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string-width@8.1.0: + resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + engines: {node: '>=20'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + stubs@3.0.0: + resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwindcss@4.1.16: + resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + + teeny-request@9.0.0: + resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} + engines: {node: '>=14'} + + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.31.6: + resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} + engines: {node: '>=10'} + hasBin: true + + text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + + thingies@2.5.0: + resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + thriftrw@3.11.4: + resolution: {integrity: sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==} + engines: {node: '>= 0.10.x'} + hasBin: true + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tmp@0.2.5: + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-dump@1.1.0: + resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tuf-js@4.0.0: + resolution: {integrity: sha512-Lq7ieeGvXDXwpoSmOSgLWVdsGGV9J4a77oDTAPe/Ltrqnnm/ETaRlBAQTH5JatEh8KXuE6sddf9qAv1Q2282Hg==} + engines: {node: ^20.17.0 || >=22.9.0} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typed-assert@1.0.9: + resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + ua-parser-js@0.7.41: + resolution: {integrity: sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==} + hasBin: true + + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + unique-filename@4.0.0: + resolution: {integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + unique-slug@5.0.0: + resolution: {integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==} + engines: {node: ^18.17.0 || >=20.5.0} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uri-templates@0.2.0: + resolution: {integrity: sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==} + + url-template@2.0.8: + resolution: {integrity: sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@6.0.2: + resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} + engines: {node: ^18.17.0 || >=20.5.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vite@7.1.11: + resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + void-elements@2.0.1: + resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} + engines: {node: '>=0.10.0'} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} + engines: {node: '>=10.13.0'} + + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + web-streams-polyfill@4.0.0-beta.3: + resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} + engines: {node: '>= 14'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.2.2: + resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@6.0.1: + resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} + engines: {node: '>=18.0.0'} + + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack-subresource-integrity@5.1.0: + resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} + engines: {node: '>= 12'} + peerDependencies: + html-webpack-plugin: '>= 5.0.0-beta.1 < 6' + webpack: ^5.12.0 + peerDependenciesMeta: + html-webpack-plugin: + optional: true + + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + winston-transport@4.9.0: + resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} + engines: {node: '>= 12.0.0'} + + winston@3.18.3: + resolution: {integrity: sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==} + engines: {node: '>= 12.0.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xhr2@0.2.1: + resolution: {integrity: sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==} + engines: {node: '>= 6'} + + xorshift@1.2.0: + resolution: {integrity: sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yargs@18.0.0: + resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zone.js@0.15.1: + resolution: {integrity: sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==} + +snapshots: + + '@algolia/abtesting@1.6.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-abtesting@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-analytics@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-common@5.40.1': {} + + '@algolia/client-insights@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-personalization@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-query-suggestions@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/client-search@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/ingestion@1.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/monitoring@1.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/recommend@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + '@algolia/requester-browser-xhr@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + + '@algolia/requester-fetch@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + + '@algolia/requester-node-http@5.40.1': + dependencies: + '@algolia/client-common': 5.40.1 + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@angular-devkit/architect@0.1802.21': + dependencies: + '@angular-devkit/core': 18.2.21 + rxjs: 7.8.1 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/architect@0.2100.0-rc.0': + dependencies: + '@angular-devkit/core': 21.0.0-rc.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular-devkit/build-angular@18.2.21(@angular/compiler-cli@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3))(@angular/platform-server@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@types/node@20.19.24)(karma@6.4.4)(lightningcss@1.30.2)(tailwindcss@4.1.16)(typescript@5.9.3)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.1802.21 + '@angular-devkit/build-webpack': 0.1802.21(webpack-dev-server@5.2.2(webpack@5.94.0))(webpack@5.94.0(esbuild@0.23.0)) + '@angular-devkit/core': 18.2.21 + '@angular/build': 18.2.21(@angular/compiler-cli@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3))(@angular/platform-server@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@types/node@20.19.24)(less@4.2.0)(lightningcss@1.30.2)(postcss@8.4.41)(tailwindcss@4.1.16)(terser@5.31.6)(typescript@5.9.3) + '@angular/compiler-cli': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3) + '@babel/core': 7.26.10 + '@babel/generator': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-runtime': 7.26.10(@babel/core@7.26.10) + '@babel/preset-env': 7.26.9(@babel/core@7.26.10) + '@babel/runtime': 7.26.10 + '@discoveryjs/json-ext': 0.6.1 + '@ngtools/webpack': 18.2.21(@angular/compiler-cli@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.94.0(esbuild@0.23.0)) + ansi-colors: 4.1.3 + autoprefixer: 10.4.20(postcss@8.4.41) + babel-loader: 9.1.3(@babel/core@7.26.10)(webpack@5.94.0(esbuild@0.23.0)) + browserslist: 4.27.0 + copy-webpack-plugin: 12.0.2(webpack@5.94.0(esbuild@0.23.0)) + critters: 0.0.24 + css-loader: 7.1.2(webpack@5.94.0(esbuild@0.23.0)) + esbuild-wasm: 0.23.0 + fast-glob: 3.3.2 + http-proxy-middleware: 3.0.5 + https-proxy-agent: 7.0.5 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + karma-source-map-support: 1.4.0 + less: 4.2.0 + less-loader: 12.2.0(less@4.2.0)(webpack@5.94.0(esbuild@0.23.0)) + license-webpack-plugin: 4.0.2(webpack@5.94.0(esbuild@0.23.0)) + loader-utils: 3.3.1 + magic-string: 0.30.11 + mini-css-extract-plugin: 2.9.0(webpack@5.94.0(esbuild@0.23.0)) + mrmime: 2.0.0 + open: 10.1.0 + ora: 5.4.1 + parse5-html-rewriting-stream: 7.0.0 + picomatch: 4.0.2 + piscina: 4.6.1 + postcss: 8.4.41 + postcss-loader: 8.1.1(postcss@8.4.41)(typescript@5.9.3)(webpack@5.94.0(esbuild@0.23.0)) + resolve-url-loader: 5.0.0 + rxjs: 7.8.1 + sass: 1.77.6 + sass-loader: 16.0.0(sass@1.77.6)(webpack@5.94.0(esbuild@0.23.0)) + semver: 7.6.3 + source-map-loader: 5.0.0(webpack@5.94.0(esbuild@0.23.0)) + source-map-support: 0.5.21 + terser: 5.31.6 + tree-kill: 1.2.2 + tslib: 2.6.3 + typescript: 5.9.3 + watchpack: 2.4.1 + webpack: 5.94.0(esbuild@0.23.0) + webpack-dev-middleware: 7.4.2(webpack@5.94.0) + webpack-dev-server: 5.2.2(webpack@5.94.0) + webpack-merge: 6.0.1 + webpack-subresource-integrity: 5.1.0(webpack@5.94.0(esbuild@0.23.0)) + optionalDependencies: + '@angular/platform-server': 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + esbuild: 0.23.0 + karma: 6.4.4 + tailwindcss: 4.1.16 + transitivePeerDependencies: + - '@rspack/core' + - '@swc/core' + - '@types/node' + - bufferutil + - chokidar + - debug + - html-webpack-plugin + - lightningcss + - node-sass + - sass-embedded + - stylus + - sugarss + - supports-color + - uglify-js + - utf-8-validate + - webpack-cli + + '@angular-devkit/build-webpack@0.1802.21(webpack-dev-server@5.2.2(webpack@5.94.0))(webpack@5.94.0(esbuild@0.23.0))': + dependencies: + '@angular-devkit/architect': 0.1802.21 + rxjs: 7.8.1 + webpack: 5.94.0(esbuild@0.23.0) + webpack-dev-server: 5.2.2(webpack@5.94.0) + transitivePeerDependencies: + - chokidar + + '@angular-devkit/core@18.2.21': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.2 + rxjs: 7.8.1 + source-map: 0.7.4 + + '@angular-devkit/core@21.0.0-rc.0': + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + jsonc-parser: 3.3.1 + picomatch: 4.0.3 + rxjs: 7.8.2 + source-map: 0.7.6 + + '@angular-devkit/schematics@21.0.0-rc.0': + dependencies: + '@angular-devkit/core': 21.0.0-rc.0 + jsonc-parser: 3.3.1 + magic-string: 0.30.19 + ora: 9.0.0 + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar + + '@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))': + dependencies: + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + tslib: 2.8.1 + + '@angular/build@18.2.21(@angular/compiler-cli@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3))(@angular/platform-server@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2))(@types/node@20.19.24)(less@4.2.0)(lightningcss@1.30.2)(postcss@8.4.41)(tailwindcss@4.1.16)(terser@5.31.6)(typescript@5.9.3)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.1802.21 + '@angular/compiler-cli': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3) + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@inquirer/confirm': 3.1.22 + '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.4.21(@types/node@20.19.24)(less@4.2.0)(lightningcss@1.30.2)(sass@1.77.6)(terser@5.31.6)) + browserslist: 4.27.0 + critters: 0.0.24 + esbuild: 0.23.0 + fast-glob: 3.3.2 + https-proxy-agent: 7.0.5 + listr2: 8.2.4 + lmdb: 3.0.13 + magic-string: 0.30.11 + mrmime: 2.0.0 + parse5-html-rewriting-stream: 7.0.0 + picomatch: 4.0.2 + piscina: 4.6.1 + rollup: 4.22.4 + sass: 1.77.6 + semver: 7.6.3 + typescript: 5.9.3 + vite: 5.4.21(@types/node@20.19.24)(less@4.2.0)(lightningcss@1.30.2)(sass@1.77.6)(terser@5.31.6) + watchpack: 2.4.1 + optionalDependencies: + '@angular/platform-server': 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + less: 4.2.0 + postcss: 8.4.41 + tailwindcss: 4.1.16 + transitivePeerDependencies: + - '@types/node' + - chokidar + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + '@angular/build@21.0.0-rc.0(0da76aceb47717093753a25a99bbabdc)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2100.0-rc.0 + '@angular/compiler': 21.0.0-rc.0 + '@angular/compiler-cli': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3) + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 5.1.19(@types/node@20.19.24) + '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.1.11(@types/node@20.19.24)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.31.6)(yaml@2.8.1)) + beasties: 0.3.5 + browserslist: 4.27.0 + esbuild: 0.25.11 + https-proxy-agent: 7.0.6 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + magic-string: 0.30.19 + mrmime: 2.0.1 + parse5-html-rewriting-stream: 8.0.0 + picomatch: 4.0.3 + piscina: 5.1.3 + rolldown: 1.0.0-beta.44 + sass: 1.93.2 + semver: 7.7.3 + source-map-support: 0.5.21 + tinyglobby: 0.2.15 + tslib: 2.8.1 + typescript: 5.9.3 + vite: 7.1.11(@types/node@20.19.24)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.31.6)(yaml@2.8.1) + watchpack: 2.4.4 + optionalDependencies: + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + '@angular/platform-server': 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + '@angular/ssr': 21.0.0-rc.0(538b4115bf272e3548cf40d78a3956af) + karma: 6.4.4 + less: 4.2.0 + lmdb: 3.4.3 + postcss: 8.5.6 + tailwindcss: 4.1.16 + transitivePeerDependencies: + - '@types/node' + - chokidar + - jiti + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + '@angular/cdk@20.2.11(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + parse5: 8.0.0 + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/cli@21.0.0-rc.0(@types/node@20.19.24)': + dependencies: + '@angular-devkit/architect': 0.2100.0-rc.0 + '@angular-devkit/core': 21.0.0-rc.0 + '@angular-devkit/schematics': 21.0.0-rc.0 + '@inquirer/prompts': 7.9.0(@types/node@20.19.24) + '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.9.0(@types/node@20.19.24))(@types/node@20.19.24)(listr2@9.0.5) + '@modelcontextprotocol/sdk': 1.20.1 + '@schematics/angular': 21.0.0-rc.0 + '@yarnpkg/lockfile': 1.1.0 + algoliasearch: 5.40.1 + ini: 5.0.0 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + npm-package-arg: 13.0.1 + pacote: 21.0.3 + parse5-html-rewriting-stream: 8.0.0 + resolve: 1.22.11 + semver: 7.7.3 + yargs: 18.0.0 + zod: 3.25.76 + transitivePeerDependencies: + - '@types/node' + - chokidar + - supports-color + + '@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2)': + dependencies: + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/compiler-cli@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3)': + dependencies: + '@angular/compiler': 21.0.0-rc.0 + '@babel/core': 7.28.4 + '@jridgewell/sourcemap-codec': 1.5.5 + chokidar: 4.0.3 + convert-source-map: 1.9.0 + reflect-metadata: 0.2.2 + semver: 7.7.3 + tslib: 2.8.1 + yargs: 18.0.0 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@angular/compiler@21.0.0-rc.0': + dependencies: + tslib: 2.8.1 + + '@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)': + dependencies: + rxjs: 7.8.2 + tslib: 2.8.1 + optionalDependencies: + '@angular/compiler': 21.0.0-rc.0 + zone.js: 0.15.1 + + '@angular/forms@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@standard-schema/spec@1.0.0)(rxjs@7.8.2)': + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + '@standard-schema/spec': 1.0.0 + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/material@20.2.11(da6da421bfbc1d9a2431ebc2039fbc7a)': + dependencies: + '@angular/cdk': 20.2.11(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/forms': 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@standard-schema/spec@1.0.0)(rxjs@7.8.2) + '@angular/platform-browser': 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/platform-browser-dynamic@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))': + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': 21.0.0-rc.0 + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + tslib: 2.8.1 + + '@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))': + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + tslib: 2.8.1 + optionalDependencies: + '@angular/animations': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + + '@angular/platform-server@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/compiler': 21.0.0-rc.0 + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + rxjs: 7.8.2 + tslib: 2.8.1 + xhr2: 0.2.1 + + '@angular/router@21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + rxjs: 7.8.2 + tslib: 2.8.1 + + '@angular/ssr@21.0.0-rc.0(538b4115bf272e3548cf40d78a3956af)': + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/router': 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + tslib: 2.8.1 + optionalDependencies: + '@angular/platform-server': 21.0.0-rc.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@21.0.0-rc.0)(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(rxjs@7.8.2) + + '@antfu/install-pkg@1.1.0': + dependencies: + package-manager-detector: 1.5.0 + tinyexec: 1.0.2 + optional: true + + '@antfu/utils@9.3.0': + optional: true + + '@anthropic-ai/sdk@0.24.3(encoding@0.1.13)': + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0(encoding@0.1.13) + web-streams-polyfill: 3.3.3 + transitivePeerDependencies: + - encoding + + '@anthropic-ai/vertex-sdk@0.4.3(encoding@0.1.13)': + dependencies: + '@anthropic-ai/sdk': 0.24.3(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.26.10 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.25.2) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.26.10 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.10': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.27.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 + lodash.debounce: 4.0.8 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-split-export-declaration@7.24.7': + dependencies: + '@babel/types': 7.28.5 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10) + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.10) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.26.10) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/preset-env@7.26.9(@babel/core@7.26.10)': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.26.10) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-async-generator-functions': 7.26.8(@babel/core@7.26.10) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.26.10) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.26.10) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.26.10) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.26.10) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.26.10) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.10) + babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.26.10) + core-js-compat: 3.46.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.5 + esutils: 2.0.3 + + '@babel/runtime@7.26.10': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@braintree/sanitize-url@7.1.1': + optional: true + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + optional: true + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + optional: true + + '@chevrotain/regexp-to-ast@11.0.3': + optional: true + + '@chevrotain/types@11.0.3': + optional: true + + '@chevrotain/utils@11.0.3': + optional: true + + '@colors/colors@1.5.0': {} + + '@colors/colors@1.6.0': + optional: true + + '@dabh/diagnostics@2.0.8': + dependencies: + '@so-ric/colorspace': 1.1.6 + enabled: 2.0.0 + kuler: 2.0.0 + optional: true + + '@discoveryjs/json-ext@0.6.1': {} + + '@emnapi/core@1.7.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.0': + optional: true + + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.0': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.0': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.0': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.0': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.0': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.0': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.0': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.0': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.0': + optional: true + + '@esbuild/linux-arm@0.25.11': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.0': + optional: true + + '@esbuild/linux-ia32@0.25.11': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.0': + optional: true + + '@esbuild/linux-loong64@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.0': + optional: true + + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.0': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.0': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.0': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.0': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.0': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.23.0': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.0': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.0': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.0': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.0': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.0': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + + '@fastify/busboy@3.2.0': + optional: true + + '@firebase/app-check-interop-types@0.3.3': + optional: true + + '@firebase/app-types@0.9.3': + optional: true + + '@firebase/auth-interop-types@0.2.4': + optional: true + + '@firebase/component@0.7.0': + dependencies: + '@firebase/util': 1.13.0 + tslib: 2.8.1 + optional: true + + '@firebase/database-compat@2.1.0': + dependencies: + '@firebase/component': 0.7.0 + '@firebase/database': 1.1.0 + '@firebase/database-types': 1.0.16 + '@firebase/logger': 0.5.0 + '@firebase/util': 1.13.0 + tslib: 2.8.1 + optional: true + + '@firebase/database-types@1.0.16': + dependencies: + '@firebase/app-types': 0.9.3 + '@firebase/util': 1.13.0 + optional: true + + '@firebase/database@1.1.0': + dependencies: + '@firebase/app-check-interop-types': 0.3.3 + '@firebase/auth-interop-types': 0.2.4 + '@firebase/component': 0.7.0 + '@firebase/logger': 0.5.0 + '@firebase/util': 1.13.0 + faye-websocket: 0.11.4 + tslib: 2.8.1 + optional: true + + '@firebase/logger@0.5.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@firebase/util@1.13.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@genkit-ai/ai@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))': + dependencies: + '@genkit-ai/core': 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) + '@opentelemetry/api': 1.9.0 + '@types/node': 20.19.24 + colorette: 2.0.20 + dotprompt: 1.1.2 + json5: 2.2.3 + node-fetch: 3.3.2 + partial-json: 0.1.7 + uri-templates: 0.2.0 + uuid: 10.0.0 + transitivePeerDependencies: + - '@google-cloud/firestore' + - encoding + - firebase + - firebase-admin + - genkit + - supports-color + + '@genkit-ai/core@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-jaeger': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + async-mutex: 0.5.0 + body-parser: 1.20.3 + cors: 2.8.5 + dotprompt: 1.1.2 + express: 4.21.2 + get-port: 5.1.1 + json-schema: 0.4.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + optionalDependencies: + '@genkit-ai/firebase': 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) + transitivePeerDependencies: + - '@google-cloud/firestore' + - encoding + - firebase + - firebase-admin + - genkit + - supports-color + + '@genkit-ai/express@1.22.0(express@5.1.0)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))': + dependencies: + body-parser: 1.20.3 + cors: 2.8.5 + express: 5.1.0 + genkit: 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)) + transitivePeerDependencies: + - supports-color + + '@genkit-ai/firebase@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))': + dependencies: + '@genkit-ai/google-cloud': 1.22.0(encoding@0.1.13)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) + '@google-cloud/firestore': 7.11.6(encoding@0.1.13) + firebase-admin: 13.5.0(encoding@0.1.13) + genkit: 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@genkit-ai/google-cloud@1.22.0(encoding@0.1.13)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))': + dependencies: + '@google-cloud/logging-winston': 6.0.1(encoding@0.1.13)(winston@3.18.3) + '@google-cloud/opentelemetry-cloud-monitoring-exporter': 0.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@google-cloud/opentelemetry-cloud-trace-exporter': 2.4.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/auto-instrumentations-node': 0.49.2(@opentelemetry/api@1.9.0)(encoding@0.1.13) + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-winston': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + genkit: 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)) + google-auth-library: 9.15.1(encoding@0.1.13) + node-fetch: 3.3.2 + winston: 3.18.3 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@genkit-ai/googleai@1.22.0(encoding@0.1.13)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))': + dependencies: + '@google/generative-ai': 0.24.1 + genkit: 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)) + google-auth-library: 9.15.1(encoding@0.1.13) + node-fetch: 3.3.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@genkit-ai/vertexai@1.22.0(encoding@0.1.13)(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)))(ws@8.18.3)(zod@3.25.76)': + dependencies: + '@anthropic-ai/sdk': 0.24.3(encoding@0.1.13) + '@anthropic-ai/vertex-sdk': 0.4.3(encoding@0.1.13) + '@google-cloud/aiplatform': 3.35.0(encoding@0.1.13) + '@google-cloud/vertexai': 1.10.0(encoding@0.1.13) + '@mistralai/mistralai-gcp': 1.5.0(encoding@0.1.13)(zod@3.25.76) + genkit: 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)) + google-auth-library: 9.15.1(encoding@0.1.13) + googleapis: 140.0.1(encoding@0.1.13) + node-fetch: 3.3.2 + openai: 4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76) + optionalDependencies: + '@google-cloud/bigquery': 7.9.4(encoding@0.1.13) + firebase-admin: 13.5.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + - ws + - zod + + '@google-cloud/aiplatform@3.35.0(encoding@0.1.13)': + dependencies: + google-gax: 4.6.1(encoding@0.1.13) + protobuf.js: 1.1.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@google-cloud/bigquery@7.9.4(encoding@0.1.13)': + dependencies: + '@google-cloud/common': 5.0.2(encoding@0.1.13) + '@google-cloud/paginator': 5.0.2 + '@google-cloud/precise-date': 4.0.0 + '@google-cloud/promisify': 4.0.0 + arrify: 2.0.1 + big.js: 6.2.2 + duplexify: 4.1.3 + extend: 3.0.2 + is: 3.3.2 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/common@5.0.2(encoding@0.1.13)': + dependencies: + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.0.0 + arrify: 2.0.1 + duplexify: 4.1.3 + extend: 3.0.2 + google-auth-library: 9.15.1(encoding@0.1.13) + html-entities: 2.6.0 + retry-request: 7.0.2(encoding@0.1.13) + teeny-request: 9.0.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/firestore@7.11.6(encoding@0.1.13)': + dependencies: + '@opentelemetry/api': 1.9.0 + fast-deep-equal: 3.1.3 + functional-red-black-tree: 1.0.1 + google-gax: 4.6.1(encoding@0.1.13) + protobufjs: 7.5.4 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/logging-winston@6.0.1(encoding@0.1.13)(winston@3.18.3)': + dependencies: + '@google-cloud/logging': 11.2.1(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) + lodash.mapvalues: 4.6.0 + winston: 3.18.3 + winston-transport: 4.9.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/logging@11.2.1(encoding@0.1.13)': + dependencies: + '@google-cloud/common': 5.0.2(encoding@0.1.13) + '@google-cloud/paginator': 5.0.2 + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.0.0 + '@opentelemetry/api': 1.9.0 + arrify: 2.0.1 + dot-prop: 6.0.1 + eventid: 2.0.1 + extend: 3.0.2 + gcp-metadata: 6.1.1(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) + google-gax: 4.6.1(encoding@0.1.13) + on-finished: 2.4.1 + pumpify: 2.0.1 + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/opentelemetry-cloud-monitoring-exporter@0.19.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)': + dependencies: + '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@google-cloud/precise-date': 4.0.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + google-auth-library: 9.15.1(encoding@0.1.13) + googleapis: 137.1.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/opentelemetry-cloud-trace-exporter@2.4.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)': + dependencies: + '@google-cloud/opentelemetry-resource-util': 2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@grpc/grpc-js': 1.14.0 + '@grpc/proto-loader': 0.7.15 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + google-auth-library: 9.15.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/opentelemetry-resource-util@2.4.0(@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0))(encoding@0.1.13)': + dependencies: + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + gcp-metadata: 6.1.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/paginator@5.0.2': + dependencies: + arrify: 2.0.1 + extend: 3.0.2 + optional: true + + '@google-cloud/precise-date@4.0.0': + optional: true + + '@google-cloud/projectify@4.0.0': + optional: true + + '@google-cloud/promisify@4.0.0': + optional: true + + '@google-cloud/storage@7.17.3(encoding@0.1.13)': + dependencies: + '@google-cloud/paginator': 5.0.2 + '@google-cloud/projectify': 4.0.0 + '@google-cloud/promisify': 4.0.0 + abort-controller: 3.0.0 + async-retry: 1.3.3 + duplexify: 4.1.3 + fast-xml-parser: 4.5.3 + gaxios: 6.7.1(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) + html-entities: 2.6.0 + mime: 3.0.0 + p-limit: 3.1.0 + retry-request: 7.0.2(encoding@0.1.13) + teeny-request: 9.0.0(encoding@0.1.13) + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@google-cloud/vertexai@1.10.0(encoding@0.1.13)': + dependencies: + google-auth-library: 9.15.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + '@google/generative-ai@0.24.1': {} + + '@grpc/grpc-js@1.14.0': + dependencies: + '@grpc/proto-loader': 0.8.0 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + + '@grpc/proto-loader@0.8.0': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.5.4 + yargs: 17.7.2 + + '@iconify/types@2.0.0': + optional: true + + '@iconify/utils@3.0.2': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.3.0 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@inquirer/ansi@1.0.1': {} + + '@inquirer/checkbox@4.3.0(@types/node@20.19.24)': + dependencies: + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@20.19.24) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/confirm@3.1.22': + dependencies: + '@inquirer/core': 9.2.1 + '@inquirer/type': 1.5.5 + + '@inquirer/confirm@5.1.19(@types/node@20.19.24)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/core@10.3.0(@types/node@20.19.24)': + dependencies: + '@inquirer/ansi': 1.0.1 + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@20.19.24) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/core@9.2.1': + dependencies: + '@inquirer/figures': 1.0.14 + '@inquirer/type': 2.0.0 + '@types/mute-stream': 0.0.4 + '@types/node': 22.19.0 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 1.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + + '@inquirer/editor@4.2.21(@types/node@20.19.24)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/external-editor': 1.0.2(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/expand@4.0.21(@types/node@20.19.24)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/external-editor@1.0.2(@types/node@20.19.24)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/figures@1.0.14': {} + + '@inquirer/input@4.2.5(@types/node@20.19.24)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/number@3.0.21(@types/node@20.19.24)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/password@4.0.21(@types/node@20.19.24)': + dependencies: + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/prompts@7.9.0(@types/node@20.19.24)': + dependencies: + '@inquirer/checkbox': 4.3.0(@types/node@20.19.24) + '@inquirer/confirm': 5.1.19(@types/node@20.19.24) + '@inquirer/editor': 4.2.21(@types/node@20.19.24) + '@inquirer/expand': 4.0.21(@types/node@20.19.24) + '@inquirer/input': 4.2.5(@types/node@20.19.24) + '@inquirer/number': 3.0.21(@types/node@20.19.24) + '@inquirer/password': 4.0.21(@types/node@20.19.24) + '@inquirer/rawlist': 4.1.9(@types/node@20.19.24) + '@inquirer/search': 3.2.0(@types/node@20.19.24) + '@inquirer/select': 4.4.0(@types/node@20.19.24) + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/rawlist@4.1.9(@types/node@20.19.24)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/search@3.2.0(@types/node@20.19.24)': + dependencies: + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@20.19.24) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/select@4.4.0(@types/node@20.19.24)': + dependencies: + '@inquirer/ansi': 1.0.1 + '@inquirer/core': 10.3.0(@types/node@20.19.24) + '@inquirer/figures': 1.0.14 + '@inquirer/type': 3.0.9(@types/node@20.19.24) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 20.19.24 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@2.0.0': + dependencies: + mute-stream: 1.0.0 + + '@inquirer/type@3.0.9(@types/node@20.19.24)': + optionalDependencies: + '@types/node': 20.19.24 + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/source-map@0.3.11': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@js-sdsl/ordered-map@4.4.2': {} + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) + '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) + tslib: 2.8.1 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.9.0(@types/node@20.19.24))(@types/node@20.19.24)(listr2@9.0.5)': + dependencies: + '@inquirer/prompts': 7.9.0(@types/node@20.19.24) + '@inquirer/type': 3.0.9(@types/node@20.19.24) + listr2: 9.0.5 + transitivePeerDependencies: + - '@types/node' + + '@lmdb/lmdb-darwin-arm64@3.0.13': + optional: true + + '@lmdb/lmdb-darwin-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-darwin-x64@3.0.13': + optional: true + + '@lmdb/lmdb-darwin-x64@3.4.3': + optional: true + + '@lmdb/lmdb-linux-arm64@3.0.13': + optional: true + + '@lmdb/lmdb-linux-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-linux-arm@3.0.13': + optional: true + + '@lmdb/lmdb-linux-arm@3.4.3': + optional: true + + '@lmdb/lmdb-linux-x64@3.0.13': + optional: true + + '@lmdb/lmdb-linux-x64@3.4.3': + optional: true + + '@lmdb/lmdb-win32-arm64@3.4.3': + optional: true + + '@lmdb/lmdb-win32-x64@3.0.13': + optional: true + + '@lmdb/lmdb-win32-x64@3.4.3': + optional: true + + '@mermaid-js/parser@0.6.3': + dependencies: + langium: 3.3.1 + optional: true + + '@mistralai/mistralai-gcp@1.5.0(encoding@0.1.13)(zod@3.25.76)': + dependencies: + google-auth-library: 9.15.1(encoding@0.1.13) + zod: 3.25.76 + transitivePeerDependencies: + - encoding + - supports-color + + '@modelcontextprotocol/sdk@1.20.1': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.1 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true + + '@napi-rs/nice-android-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.1.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.1.1': + optional: true + + '@napi-rs/nice-openharmony-arm64@1.1.1': + optional: true + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true + + '@napi-rs/nice@1.1.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 + optional: true + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.7.0 + '@emnapi/runtime': 1.7.0 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@ngtools/webpack@18.2.21(@angular/compiler-cli@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.94.0(esbuild@0.23.0))': + dependencies: + '@angular/compiler-cli': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(typescript@5.9.3) + typescript: 5.9.3 + webpack: 5.94.0(esbuild@0.23.0) + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@npmcli/agent@3.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 10.4.3 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/agent@4.0.0': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 11.2.2 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + '@npmcli/fs@4.0.0': + dependencies: + semver: 7.7.3 + + '@npmcli/git@7.0.0': + dependencies: + '@npmcli/promise-spawn': 8.0.3 + ini: 5.0.0 + lru-cache: 11.2.2 + npm-pick-manifest: 11.0.3 + proc-log: 5.0.0 + promise-retry: 2.0.1 + semver: 7.7.3 + which: 5.0.0 + + '@npmcli/installed-package-contents@3.0.0': + dependencies: + npm-bundled: 4.0.0 + npm-normalize-package-bin: 4.0.0 + + '@npmcli/node-gyp@5.0.0': {} + + '@npmcli/package-json@7.0.1': + dependencies: + '@npmcli/git': 7.0.0 + glob: 11.0.3 + hosted-git-info: 9.0.2 + json-parse-even-better-errors: 4.0.0 + proc-log: 5.0.0 + semver: 7.7.3 + validate-npm-package-license: 3.0.4 + + '@npmcli/promise-spawn@8.0.3': + dependencies: + which: 5.0.0 + + '@npmcli/promise-spawn@9.0.0': + dependencies: + which: 5.0.0 + + '@npmcli/redact@3.2.2': {} + + '@npmcli/run-script@10.0.2': + dependencies: + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.1 + '@npmcli/promise-spawn': 9.0.0 + node-gyp: 11.5.0 + proc-log: 6.0.0 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/api-logs@0.52.1': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/auto-instrumentations-node@0.49.2(@opentelemetry/api@1.9.0)(encoding@0.1.13)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-lambda': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-aws-sdk': 0.43.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-bunyan': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cassandra-driver': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-cucumber': 0.8.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.11.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dns': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.41.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.14.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.38.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-grpc': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-memcached': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.46.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-net': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pino': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis-4': 0.41.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-restify': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-router': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-socket.io': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.13.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-winston': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-alibaba-cloud': 0.29.7(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-aws': 1.12.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-azure': 0.2.12(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-container': 0.4.4(@opentelemetry/api@1.9.0) + '@opentelemetry/resource-detector-gcp': 0.29.13(@opentelemetry/api@1.9.0)(encoding@0.1.13) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/exporter-jaeger@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + jaeger-client: 3.19.0 + + '@opentelemetry/exporter-trace-otlp-grpc@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-grpc-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-http@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-trace-otlp-proto@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/exporter-zipkin@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/instrumentation-amqplib@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-aws-lambda@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-aws-xray': 1.26.2(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/aws-lambda': 8.10.122 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-aws-sdk@0.43.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagation-utils': 0.30.16(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-bunyan@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@types/bunyan': 1.8.9 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-cassandra-driver@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-connect@0.38.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/connect': 3.4.36 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-cucumber@0.8.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-dataloader@0.11.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-dns@0.38.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-express@0.41.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-fastify@0.38.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-fs@0.14.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-generic-pool@0.38.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-graphql@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-grpc@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-hapi@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-http@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-ioredis@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-kafkajs@0.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-knex@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-koa@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-lru-memoizer@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-memcached@0.38.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/memcached': 2.2.10 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-mongodb@0.46.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-mongoose@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-mysql2@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-mysql@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/mysql': 2.15.22 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-nestjs-core@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-net@0.38.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-pg@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-pino@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-redis-4@0.41.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-redis@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-restify@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-router@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-socket.io@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-tedious@0.13.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-undici@0.5.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation-winston@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.15.0 + require-in-the-middle: 7.5.2 + semver: 7.7.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/otlp-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-grpc-exporter-base@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@grpc/grpc-js': 1.14.0 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-exporter-base': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/otlp-transformer': 0.52.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/otlp-transformer@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + protobufjs: 7.5.4 + + '@opentelemetry/propagation-utils@0.30.16(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + optional: true + + '@opentelemetry/propagator-aws-xray@1.26.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + optional: true + + '@opentelemetry/propagator-b3@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/propagator-jaeger@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/redis-common@0.36.2': + optional: true + + '@opentelemetry/resource-detector-alibaba-cloud@0.29.7(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + optional: true + + '@opentelemetry/resource-detector-aws@1.12.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + optional: true + + '@opentelemetry/resource-detector-azure@0.2.12(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + optional: true + + '@opentelemetry/resource-detector-container@0.4.4(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + optional: true + + '@opentelemetry/resource-detector-gcp@0.29.13(@opentelemetry/api@1.9.0)(encoding@0.1.13)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.37.0 + gcp-metadata: 6.1.1(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/resources@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-logs@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + + '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + lodash.merge: 4.6.2 + + '@opentelemetry/sdk-node@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-proto': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-zipkin': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-node': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.30.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.28.0 + + '@opentelemetry/sdk-trace-node@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-b3': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/propagator-jaeger': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + semver: 7.7.3 + + '@opentelemetry/semantic-conventions@1.25.1': {} + + '@opentelemetry/semantic-conventions@1.28.0': {} + + '@opentelemetry/semantic-conventions@1.37.0': + optional: true + + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + optional: true + + '@oxc-project/types@0.95.0': {} + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + + '@rolldown/binding-android-arm64@1.0.0-beta.44': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.44': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.44': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.44': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.44': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.44': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.44': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.44': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.44': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.44': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.44': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.44': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.44': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.44': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.44': {} + + '@rollup/rollup-android-arm-eabi@4.22.4': + optional: true + + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.22.4': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.22.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-x64@4.22.4': + optional: true + + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.22.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.22.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.22.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.22.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.22.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.22.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.22.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.22.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + + '@schematics/angular@21.0.0-rc.0': + dependencies: + '@angular-devkit/core': 21.0.0-rc.0 + '@angular-devkit/schematics': 21.0.0-rc.0 + jsonc-parser: 3.3.1 + transitivePeerDependencies: + - chokidar + + '@sigstore/bundle@4.0.0': + dependencies: + '@sigstore/protobuf-specs': 0.5.0 + + '@sigstore/core@3.0.0': {} + + '@sigstore/protobuf-specs@0.5.0': {} + + '@sigstore/sign@4.0.1': + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + make-fetch-happen: 15.0.2 + proc-log: 5.0.0 + promise-retry: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@sigstore/tuf@4.0.0': + dependencies: + '@sigstore/protobuf-specs': 0.5.0 + tuf-js: 4.0.0 + transitivePeerDependencies: + - supports-color + + '@sigstore/verify@3.0.0': + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + + '@sindresorhus/merge-streams@2.3.0': {} + + '@so-ric/colorspace@1.1.6': + dependencies: + color: 5.0.2 + text-hex: 1.0.0 + optional: true + + '@socket.io/component-emitter@3.1.2': {} + + '@standard-schema/spec@1.0.0': {} + + '@tailwindcss/node@4.1.16': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.16 + + '@tailwindcss/oxide-android-arm64@4.1.16': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.16': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.16': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + optional: true + + '@tailwindcss/oxide@4.1.16': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-x64': 4.1.16 + '@tailwindcss/oxide-freebsd-x64': 4.1.16 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.16 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.16 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-x64-musl': 4.1.16 + '@tailwindcss/oxide-wasm32-wasi': 4.1.16 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 + + '@tailwindcss/postcss@4.1.16': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.16 + '@tailwindcss/oxide': 4.1.16 + postcss: 8.5.6 + tailwindcss: 4.1.16 + + '@tootallnate/once@2.0.0': {} + + '@tufjs/canonical-json@2.0.0': {} + + '@tufjs/models@4.0.0': + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.5 + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/aws-lambda@8.10.122': + optional: true + + '@types/body-parser@1.19.6': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.19.24 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 20.19.24 + + '@types/bunyan@1.8.9': + dependencies: + '@types/node': 20.19.24 + optional: true + + '@types/caseless@0.12.5': {} + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 4.19.7 + '@types/node': 20.19.24 + + '@types/connect@3.4.36': + dependencies: + '@types/node': 20.19.24 + optional: true + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.19.24 + + '@types/cors@2.8.19': + dependencies: + '@types/node': 20.19.24 + + '@types/d3-array@3.2.2': + optional: true + + '@types/d3-axis@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + optional: true + + '@types/d3-brush@3.0.6': + dependencies: + '@types/d3-selection': 3.0.11 + optional: true + + '@types/d3-chord@3.0.6': + optional: true + + '@types/d3-color@3.1.3': + optional: true + + '@types/d3-contour@3.0.6': + dependencies: + '@types/d3-array': 3.2.2 + '@types/geojson': 7946.0.16 + optional: true + + '@types/d3-delaunay@6.0.4': + optional: true + + '@types/d3-dispatch@3.0.7': + optional: true + + '@types/d3-drag@3.0.7': + dependencies: + '@types/d3-selection': 3.0.11 + optional: true + + '@types/d3-dsv@3.0.7': + optional: true + + '@types/d3-ease@3.0.2': + optional: true + + '@types/d3-fetch@3.0.7': + dependencies: + '@types/d3-dsv': 3.0.7 + optional: true + + '@types/d3-force@3.0.10': + optional: true + + '@types/d3-format@3.0.4': + optional: true + + '@types/d3-geo@3.1.0': + dependencies: + '@types/geojson': 7946.0.16 + optional: true + + '@types/d3-hierarchy@3.1.7': + optional: true + + '@types/d3-interpolate@3.0.4': + dependencies: + '@types/d3-color': 3.1.3 + optional: true + + '@types/d3-path@3.1.1': + optional: true + + '@types/d3-polygon@3.0.2': + optional: true + + '@types/d3-quadtree@3.0.6': + optional: true + + '@types/d3-random@3.0.3': + optional: true + + '@types/d3-scale-chromatic@3.1.0': + optional: true + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + optional: true + + '@types/d3-selection@3.0.11': + optional: true + + '@types/d3-shape@3.1.7': + dependencies: + '@types/d3-path': 3.1.1 + optional: true + + '@types/d3-time-format@4.0.3': + optional: true + + '@types/d3-time@3.0.4': + optional: true + + '@types/d3-timer@3.0.2': + optional: true + + '@types/d3-transition@3.0.9': + dependencies: + '@types/d3-selection': 3.0.11 + optional: true + + '@types/d3-zoom@3.0.8': + dependencies: + '@types/d3-interpolate': 3.0.4 + '@types/d3-selection': 3.0.11 + optional: true + + '@types/d3@7.4.3': + dependencies: + '@types/d3-array': 3.2.2 + '@types/d3-axis': 3.0.6 + '@types/d3-brush': 3.0.6 + '@types/d3-chord': 3.0.6 + '@types/d3-color': 3.1.3 + '@types/d3-contour': 3.0.6 + '@types/d3-delaunay': 6.0.4 + '@types/d3-dispatch': 3.0.7 + '@types/d3-drag': 3.0.7 + '@types/d3-dsv': 3.0.7 + '@types/d3-ease': 3.0.2 + '@types/d3-fetch': 3.0.7 + '@types/d3-force': 3.0.10 + '@types/d3-format': 3.0.4 + '@types/d3-geo': 3.1.0 + '@types/d3-hierarchy': 3.1.7 + '@types/d3-interpolate': 3.0.4 + '@types/d3-path': 3.1.1 + '@types/d3-polygon': 3.0.2 + '@types/d3-quadtree': 3.0.6 + '@types/d3-random': 3.0.3 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + '@types/d3-selection': 3.0.11 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.4 + '@types/d3-time-format': 4.0.3 + '@types/d3-timer': 3.0.2 + '@types/d3-transition': 3.0.9 + '@types/d3-zoom': 3.0.8 + optional: true + + '@types/estree@1.0.5': {} + + '@types/estree@1.0.8': {} + + '@types/express-serve-static-core@4.19.7': + dependencies: + '@types/node': 20.19.24 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express-serve-static-core@5.1.0': + dependencies: + '@types/node': 20.19.24 + '@types/qs': 6.14.0 + '@types/range-parser': 1.2.7 + '@types/send': 1.2.1 + + '@types/express@4.17.25': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 4.19.7 + '@types/qs': 6.14.0 + '@types/serve-static': 1.15.10 + + '@types/express@5.0.5': + dependencies: + '@types/body-parser': 1.19.6 + '@types/express-serve-static-core': 5.1.0 + '@types/serve-static': 1.15.10 + + '@types/geojson@7946.0.16': + optional: true + + '@types/highlight.js@10.1.0': + dependencies: + highlight.js: 11.11.1 + + '@types/http-errors@2.0.5': {} + + '@types/http-proxy@1.17.17': + dependencies: + '@types/node': 20.19.24 + + '@types/jasmine@5.1.12': {} + + '@types/json-schema@7.0.15': {} + + '@types/jsonwebtoken@9.0.10': + dependencies: + '@types/ms': 2.1.0 + '@types/node': 20.19.24 + optional: true + + '@types/long@4.0.2': {} + + '@types/memcached@2.2.10': + dependencies: + '@types/node': 20.19.24 + optional: true + + '@types/mime@1.3.5': {} + + '@types/ms@2.1.0': + optional: true + + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.19.24 + + '@types/mysql@2.15.22': + dependencies: + '@types/node': 20.19.24 + optional: true + + '@types/node-fetch@2.6.13': + dependencies: + '@types/node': 20.19.24 + form-data: 4.0.4 + + '@types/node-forge@1.3.14': + dependencies: + '@types/node': 20.19.24 + + '@types/node@18.19.130': + dependencies: + undici-types: 5.26.5 + + '@types/node@20.19.24': + dependencies: + undici-types: 6.21.0 + + '@types/node@22.19.0': + dependencies: + undici-types: 6.21.0 + + '@types/pg-pool@2.0.4': + dependencies: + '@types/pg': 8.6.1 + optional: true + + '@types/pg@8.6.1': + dependencies: + '@types/node': 20.19.24 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + optional: true + + '@types/qs@6.14.0': {} + + '@types/range-parser@1.2.7': {} + + '@types/request@2.48.13': + dependencies: + '@types/caseless': 0.12.5 + '@types/node': 20.19.24 + '@types/tough-cookie': 4.0.5 + form-data: 2.5.5 + + '@types/retry@0.12.2': {} + + '@types/send@0.17.6': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.19.24 + + '@types/send@1.2.1': + dependencies: + '@types/node': 20.19.24 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 5.0.5 + + '@types/serve-static@1.15.10': + dependencies: + '@types/http-errors': 2.0.5 + '@types/node': 20.19.24 + '@types/send': 0.17.6 + + '@types/shimmer@1.2.0': {} + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 20.19.24 + + '@types/tedious@4.0.14': + dependencies: + '@types/node': 20.19.24 + optional: true + + '@types/tough-cookie@4.0.5': {} + + '@types/triple-beam@1.3.5': + optional: true + + '@types/trusted-types@2.0.7': + optional: true + + '@types/wrap-ansi@3.0.0': {} + + '@types/ws@8.18.1': + dependencies: + '@types/node': 20.19.24 + + '@vitejs/plugin-basic-ssl@1.1.0(vite@5.4.21(@types/node@20.19.24)(less@4.2.0)(lightningcss@1.30.2)(sass@1.77.6)(terser@5.31.6))': + dependencies: + vite: 5.4.21(@types/node@20.19.24)(less@4.2.0)(lightningcss@1.30.2)(sass@1.77.6)(terser@5.31.6) + + '@vitejs/plugin-basic-ssl@2.1.0(vite@7.1.11(@types/node@20.19.24)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.31.6)(yaml@2.8.1))': + dependencies: + vite: 7.1.11(@types/node@20.19.24)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.31.6)(yaml@2.8.1) + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + '@yarnpkg/lockfile@1.1.0': {} + + abbrev@3.0.1: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + accepts@2.0.0: + dependencies: + mime-types: 3.0.1 + negotiator: 1.0.0 + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + + acorn@8.15.0: {} + + adjust-sourcemap-loader@4.0.0: + dependencies: + loader-utils: 2.0.4 + regex-parser: 2.3.1 + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.4: {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + algoliasearch@5.40.1: + dependencies: + '@algolia/abtesting': 1.6.1 + '@algolia/client-abtesting': 5.40.1 + '@algolia/client-analytics': 5.40.1 + '@algolia/client-common': 5.40.1 + '@algolia/client-insights': 5.40.1 + '@algolia/client-personalization': 5.40.1 + '@algolia/client-query-suggestions': 5.40.1 + '@algolia/client-search': 5.40.1 + '@algolia/ingestion': 1.40.1 + '@algolia/monitoring': 1.40.1 + '@algolia/recommend': 5.40.1 + '@algolia/requester-browser-xhr': 5.40.1 + '@algolia/requester-fetch': 5.40.1 + '@algolia/requester-node-http': 5.40.1 + + ansi-color@0.2.1: {} + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.1.1: + dependencies: + environment: 1.1.0 + + ansi-html-community@0.0.8: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.2.2: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.3: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + array-flatten@1.1.1: {} + + arrify@2.0.1: + optional: true + + async-mutex@0.5.0: + dependencies: + tslib: 2.8.1 + + async-retry@1.3.3: + dependencies: + retry: 0.13.1 + optional: true + + async@3.2.6: + optional: true + + asynckit@0.4.0: {} + + autoprefixer@10.4.20(postcss@8.4.41): + dependencies: + browserslist: 4.27.0 + caniuse-lite: 1.0.30001753 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + + babel-loader@9.1.3(@babel/core@7.26.10)(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + '@babel/core': 7.26.10 + find-cache-dir: 4.0.0 + schema-utils: 4.3.3 + webpack: 5.94.0(esbuild@0.23.0) + + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.26.10): + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.26.10): + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) + core-js-compat: 3.46.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.26.10): + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + base64id@2.0.0: {} + + baseline-browser-mapping@2.8.23: {} + + batch@0.6.1: {} + + beasties@0.3.5: + dependencies: + css-select: 6.0.0 + css-what: 7.0.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + htmlparser2: 10.0.0 + picocolors: 1.1.1 + postcss: 8.5.6 + postcss-media-query-parser: 0.2.3 + + big.js@5.2.2: {} + + big.js@6.2.2: + optional: true + + bignumber.js@9.3.1: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.3 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.1 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.23 + caniuse-lite: 1.0.30001753 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufrw@1.4.0: + dependencies: + ansi-color: 0.2.1 + error: 7.0.2 + hexer: 1.5.0 + xtend: 4.0.2 + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + + bytes@3.1.2: {} + + cacache@19.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 10.4.5 + lru-cache: 10.4.3 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + tar: 7.5.2 + unique-filename: 4.0.0 + + cacache@20.0.1: + dependencies: + '@npmcli/fs': 4.0.0 + fs-minipass: 3.0.3 + glob: 11.0.3 + lru-cache: 11.2.2 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 12.0.0 + unique-filename: 4.0.0 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001753: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} + + chardet@2.1.1: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + optional: true + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + optional: true + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chownr@3.0.0: {} + + chrome-trace-event@1.0.4: {} + + ci-info@3.9.0: {} + + cjs-module-lexer@1.4.3: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-spinners@3.3.0: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-truncate@5.1.1: + dependencies: + slice-ansi: 7.1.2 + string-width: 8.1.0 + + cli-width@4.1.0: {} + + clipboard@2.0.11: + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + optional: true + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone@1.0.4: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-convert@3.1.2: + dependencies: + color-name: 2.0.2 + optional: true + + color-name@1.1.4: {} + + color-name@2.0.2: + optional: true + + color-string@2.1.2: + dependencies: + color-name: 2.0.2 + optional: true + + color@5.0.2: + dependencies: + color-convert: 3.1.2 + color-string: 2.1.2 + optional: true + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + commander@7.2.0: + optional: true + + commander@8.3.0: + optional: true + + common-path-prefix@3.0.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.54.0 + + compression@1.8.1: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.1.0 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + confbox@0.1.8: + optional: true + + confbox@0.2.2: + optional: true + + connect-history-api-fallback@2.0.0: {} + + connect@3.7.0: + dependencies: + debug: 2.6.9 + finalhandler: 1.1.2 + parseurl: 1.3.3 + utils-merge: 1.0.1 + transitivePeerDependencies: + - supports-color + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-disposition@1.0.0: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie-signature@1.2.2: {} + + cookie@0.7.1: {} + + cookie@0.7.2: {} + + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + + copy-webpack-plugin@12.0.2(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + fast-glob: 3.3.2 + glob-parent: 6.0.2 + globby: 14.1.0 + normalize-path: 3.0.0 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + webpack: 5.94.0(esbuild@0.23.0) + + core-js-compat@3.46.0: + dependencies: + browserslist: 4.27.0 + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + optional: true + + cose-base@2.2.0: + dependencies: + layout-base: 2.0.1 + optional: true + + cosmiconfig@9.0.0(typescript@5.9.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.9.3 + + critters@0.0.24: + dependencies: + chalk: 4.1.2 + css-select: 5.2.2 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + htmlparser2: 8.0.2 + postcss: 8.5.6 + postcss-media-query-parser: 0.2.3 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-loader@7.1.2(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) + postcss-modules-scope: 3.2.1(postcss@8.5.6) + postcss-modules-values: 4.0.0(postcss@8.5.6) + postcss-value-parser: 4.2.0 + semver: 7.6.3 + optionalDependencies: + webpack: 5.94.0(esbuild@0.23.0) + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-select@6.0.0: + dependencies: + boolbase: 1.0.0 + css-what: 7.0.0 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-what@6.2.2: {} + + css-what@7.0.0: {} + + cssesc@3.0.0: {} + + custom-event@1.0.1: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.33.1 + optional: true + + cytoscape-fcose@2.2.0(cytoscape@3.33.1): + dependencies: + cose-base: 2.2.0 + cytoscape: 3.33.1 + optional: true + + cytoscape@3.33.1: + optional: true + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + optional: true + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + optional: true + + d3-axis@3.0.0: + optional: true + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + optional: true + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + optional: true + + d3-color@3.1.0: + optional: true + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + optional: true + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + optional: true + + d3-dispatch@3.0.1: + optional: true + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + optional: true + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + optional: true + + d3-ease@3.0.1: + optional: true + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + optional: true + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + optional: true + + d3-format@3.1.0: + optional: true + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + optional: true + + d3-hierarchy@3.1.2: + optional: true + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + optional: true + + d3-path@1.0.9: + optional: true + + d3-path@3.1.0: + optional: true + + d3-polygon@3.0.1: + optional: true + + d3-quadtree@3.0.1: + optional: true + + d3-random@3.0.1: + optional: true + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + optional: true + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + optional: true + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + optional: true + + d3-selection@3.0.0: + optional: true + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + optional: true + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + optional: true + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + optional: true + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + optional: true + + d3-timer@3.0.1: + optional: true + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + optional: true + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + optional: true + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + optional: true + + dagre-d3-es@7.0.13: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + optional: true + + data-uri-to-buffer@4.0.1: {} + + date-format@4.0.14: {} + + dayjs@1.11.19: + optional: true + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@3.0.0: {} + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + optional: true + + delayed-stream@1.0.0: {} + + delegate@3.2.0: + optional: true + + depd@1.1.2: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-libc@1.0.3: + optional: true + + detect-libc@2.1.2: {} + + detect-node@2.1.0: {} + + di@0.0.1: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dom-serialize@2.2.1: + dependencies: + custom-event: 1.0.1 + ent: 2.2.2 + extend: 3.0.2 + void-elements: 2.0.1 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + dompurify@3.3.0: + optionalDependencies: + '@types/trusted-types': 2.0.7 + optional: true + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dot-prop@6.0.1: + dependencies: + is-obj: 2.0.0 + optional: true + + dotprompt@1.1.2: + dependencies: + handlebars: 4.7.8 + yaml: 2.8.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.244: {} + + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emoji-toolkit@9.0.1: + optional: true + + emojis-list@3.0.0: {} + + enabled@2.0.0: + optional: true + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 20.19.24 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + ent@2.2.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + punycode: 1.4.1 + safe-regex-test: 1.1.0 + + entities@4.5.0: {} + + entities@6.0.1: {} + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + err-code@2.0.3: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + + error@7.0.2: + dependencies: + string-template: 0.2.1 + xtend: 4.0.2 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.7.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild-wasm@0.23.0: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.0: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.0 + '@esbuild/android-arm': 0.23.0 + '@esbuild/android-arm64': 0.23.0 + '@esbuild/android-x64': 0.23.0 + '@esbuild/darwin-arm64': 0.23.0 + '@esbuild/darwin-x64': 0.23.0 + '@esbuild/freebsd-arm64': 0.23.0 + '@esbuild/freebsd-x64': 0.23.0 + '@esbuild/linux-arm': 0.23.0 + '@esbuild/linux-arm64': 0.23.0 + '@esbuild/linux-ia32': 0.23.0 + '@esbuild/linux-loong64': 0.23.0 + '@esbuild/linux-mips64el': 0.23.0 + '@esbuild/linux-ppc64': 0.23.0 + '@esbuild/linux-riscv64': 0.23.0 + '@esbuild/linux-s390x': 0.23.0 + '@esbuild/linux-x64': 0.23.0 + '@esbuild/netbsd-x64': 0.23.0 + '@esbuild/openbsd-arm64': 0.23.0 + '@esbuild/openbsd-x64': 0.23.0 + '@esbuild/sunos-x64': 0.23.0 + '@esbuild/win32-arm64': 0.23.0 + '@esbuild/win32-ia32': 0.23.0 + '@esbuild/win32-x64': 0.23.0 + + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + event-target-shim@5.0.1: {} + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + eventid@2.0.1: + dependencies: + uuid: 8.3.2 + optional: true + + events@3.3.0: {} + + eventsource-parser@3.0.6: {} + + eventsource@3.0.7: + dependencies: + eventsource-parser: 3.0.6 + + exponential-backoff@3.1.3: {} + + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + exsolve@1.0.7: + optional: true + + extend@3.0.2: {} + + farmhash-modern@1.1.0: + optional: true + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-uri@3.1.0: {} + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + optional: true + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fecha@4.2.3: + optional: true + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.1.2: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + finalhandler@2.1.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + find-cache-dir@4.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + find-yarn-workspace-root@2.0.0: + dependencies: + micromatch: 4.0.8 + + firebase-admin@13.5.0(encoding@0.1.13): + dependencies: + '@fastify/busboy': 3.2.0 + '@firebase/database-compat': 2.1.0 + '@firebase/database-types': 1.0.16 + '@types/node': 22.19.0 + farmhash-modern: 1.1.0 + fast-deep-equal: 3.1.3 + google-auth-library: 9.15.1(encoding@0.1.13) + jsonwebtoken: 9.0.2 + jwks-rsa: 3.2.0 + node-forge: 1.3.1 + uuid: 11.1.0 + optionalDependencies: + '@google-cloud/firestore': 7.11.6(encoding@0.1.13) + '@google-cloud/storage': 7.17.3(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + flat@5.0.2: {} + + flatted@3.3.3: {} + + fn.name@1.1.0: + optional: true + + follow-redirects@1.15.11(debug@4.4.3): + optionalDependencies: + debug: 4.4.3 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data-encoder@1.7.2: {} + + form-data@2.5.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + + form-data@4.0.4: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + formdata-node@4.4.1: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + fresh@0.5.2: {} + + fresh@2.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + functional-red-black-tree@1.0.1: + optional: true + + gaxios@6.7.1(encoding@0.1.13): + dependencies: + extend: 3.0.2 + https-proxy-agent: 7.0.6 + is-stream: 2.0.1 + node-fetch: 2.7.0(encoding@0.1.13) + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + gcp-metadata@6.1.1(encoding@0.1.13): + dependencies: + gaxios: 6.7.1(encoding@0.1.13) + google-logging-utils: 0.0.2 + json-bigint: 1.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13)): + dependencies: + '@genkit-ai/ai': 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) + '@genkit-ai/core': 1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))(genkit@1.22.0(@google-cloud/firestore@7.11.6(encoding@0.1.13))(encoding@0.1.13)(firebase-admin@13.5.0(encoding@0.1.13))) + uuid: 10.0.0 + transitivePeerDependencies: + - '@google-cloud/firestore' + - encoding + - firebase + - firebase-admin + - supports-color + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.4.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-port@5.1.1: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regex.js@1.2.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@11.0.3: + dependencies: + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.1.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@15.15.0: + optional: true + + globby@14.1.0: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + path-type: 6.0.0 + slash: 5.1.0 + unicorn-magic: 0.3.0 + + good-listener@1.2.2: + dependencies: + delegate: 3.2.0 + optional: true + + google-auth-library@9.15.1(encoding@0.1.13): + dependencies: + base64-js: 1.5.1 + ecdsa-sig-formatter: 1.0.11 + gaxios: 6.7.1(encoding@0.1.13) + gcp-metadata: 6.1.1(encoding@0.1.13) + gtoken: 7.1.0(encoding@0.1.13) + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + google-gax@4.6.1(encoding@0.1.13): + dependencies: + '@grpc/grpc-js': 1.14.0 + '@grpc/proto-loader': 0.7.15 + '@types/long': 4.0.2 + abort-controller: 3.0.0 + duplexify: 4.1.3 + google-auth-library: 9.15.1(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) + object-hash: 3.0.0 + proto3-json-serializer: 2.0.2 + protobufjs: 7.5.4 + retry-request: 7.0.2(encoding@0.1.13) + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + google-logging-utils@0.0.2: {} + + googleapis-common@7.2.0(encoding@0.1.13): + dependencies: + extend: 3.0.2 + gaxios: 6.7.1(encoding@0.1.13) + google-auth-library: 9.15.1(encoding@0.1.13) + qs: 6.14.0 + url-template: 2.0.8 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + googleapis@137.1.0(encoding@0.1.13): + dependencies: + google-auth-library: 9.15.1(encoding@0.1.13) + googleapis-common: 7.2.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + googleapis@140.0.1(encoding@0.1.13): + dependencies: + google-auth-library: 9.15.1(encoding@0.1.13) + googleapis-common: 7.2.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gtoken@7.1.0(encoding@0.1.13): + dependencies: + gaxios: 6.7.1(encoding@0.1.13) + jws: 4.0.0 + transitivePeerDependencies: + - encoding + - supports-color + + hachure-fill@0.5.2: + optional: true + + handle-thing@2.0.1: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hexer@1.5.0: + dependencies: + ansi-color: 0.2.1 + minimist: 1.2.8 + process: 0.10.1 + xtend: 4.0.2 + + highlight.js@11.11.1: {} + + hosted-git-info@9.0.2: + dependencies: + lru-cache: 11.2.2 + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-entities@2.6.0: + optional: true + + html-escaper@2.0.2: {} + + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 6.0.1 + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-cache-semantics@4.2.0: {} + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.10: {} + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + http-proxy-middleware@2.0.9(@types/express@4.17.25): + dependencies: + '@types/http-proxy': 1.17.17 + http-proxy: 1.18.1(debug@4.4.3) + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.25 + transitivePeerDependencies: + - debug + + http-proxy-middleware@3.0.5: + dependencies: + '@types/http-proxy': 1.17.17 + debug: 4.4.3 + http-proxy: 1.18.1(debug@4.4.3) + is-glob: 4.0.3 + is-plain-object: 5.0.0 + micromatch: 4.0.8 + transitivePeerDependencies: + - supports-color + + http-proxy@1.18.1(debug@4.4.3): + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.11(debug@4.4.3) + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + hyperdyperid@1.2.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.7.0: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + ieee754@1.2.1: {} + + ignore-walk@8.0.0: + dependencies: + minimatch: 10.1.1 + + ignore@7.0.5: {} + + image-size@0.5.5: + optional: true + + immutable@4.3.7: {} + + immutable@5.1.4: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-in-the-middle@1.15.0: + dependencies: + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@5.0.0: {} + + internmap@1.0.1: + optional: true + + internmap@2.0.3: + optional: true + + ip-address@10.0.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-arrayish@0.2.1: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.1.0: + dependencies: + get-east-asian-width: 1.4.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@1.0.0: {} + + is-interactive@2.0.0: {} + + is-network-error@1.3.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: + optional: true + + is-plain-obj@3.0.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-plain-object@5.0.0: {} + + is-promise@4.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-stream@2.0.1: {} + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@2.1.0: {} + + is-what@3.14.1: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + is@3.3.2: + optional: true + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isbinaryfile@4.0.10: {} + + isexe@2.0.0: {} + + isexe@3.1.1: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.26.10 + '@babel/parser': 7.28.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.3 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.2.0: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jackspeak@4.1.1: + dependencies: + '@isaacs/cliui': 8.0.2 + + jaeger-client@3.19.0: + dependencies: + node-int64: 0.4.0 + opentracing: 0.14.7 + thriftrw: 3.11.4 + uuid: 8.3.2 + xorshift: 1.2.0 + + jasmine-core@4.6.1: {} + + jasmine-core@5.10.0: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 20.19.24 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jiti@1.21.7: {} + + jiti@2.6.1: {} + + jose@4.15.9: + optional: true + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-bigint@1.0.0: + dependencies: + bignumber.js: 9.3.1 + + json-parse-even-better-errors@2.3.1: {} + + json-parse-even-better-errors@4.0.0: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stable-stringify@1.3.0: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + isarray: 2.0.5 + jsonify: 0.0.1 + object-keys: 1.1.1 + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonify@0.0.1: {} + + jsonparse@1.3.1: {} + + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.7.3 + optional: true + + jwa@1.4.2: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + optional: true + + jwa@2.0.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jwks-rsa@3.2.0: + dependencies: + '@types/express': 4.17.25 + '@types/jsonwebtoken': 9.0.10 + debug: 4.4.3 + jose: 4.15.9 + limiter: 1.1.5 + lru-memoizer: 2.3.0 + transitivePeerDependencies: + - supports-color + optional: true + + jws@3.2.2: + dependencies: + jwa: 1.4.2 + safe-buffer: 5.2.1 + optional: true + + jws@4.0.0: + dependencies: + jwa: 2.0.1 + safe-buffer: 5.2.1 + + karma-chrome-launcher@3.2.0: + dependencies: + which: 1.3.1 + + karma-coverage@2.2.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.2.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + karma-jasmine-html-reporter@2.1.0(jasmine-core@5.10.0)(karma-jasmine@5.1.0(karma@6.4.4))(karma@6.4.4): + dependencies: + jasmine-core: 5.10.0 + karma: 6.4.4 + karma-jasmine: 5.1.0(karma@6.4.4) + + karma-jasmine@5.1.0(karma@6.4.4): + dependencies: + jasmine-core: 4.6.1 + karma: 6.4.4 + + karma-source-map-support@1.4.0: + dependencies: + source-map-support: 0.5.21 + + karma@6.4.4: + dependencies: + '@colors/colors': 1.5.0 + body-parser: 1.20.3 + braces: 3.0.3 + chokidar: 3.6.0 + connect: 3.7.0 + di: 0.0.1 + dom-serialize: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + http-proxy: 1.18.1(debug@4.4.3) + isbinaryfile: 4.0.10 + lodash: 4.17.21 + log4js: 6.9.1 + mime: 2.6.0 + minimatch: 3.1.2 + mkdirp: 0.5.6 + qjobs: 1.2.0 + range-parser: 1.2.1 + rimraf: 3.0.2 + socket.io: 4.8.1 + source-map: 0.6.1 + tmp: 0.2.5 + ua-parser-js: 0.7.41 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + katex@0.16.25: + dependencies: + commander: 8.3.0 + optional: true + + khroma@2.1.0: + optional: true + + kind-of@6.0.3: {} + + klaw-sync@6.0.0: + dependencies: + graceful-fs: 4.2.11 + + kolorist@1.8.0: + optional: true + + kuler@2.0.0: + optional: true + + langium@3.3.1: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + optional: true + + launch-editor@2.12.0: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.3 + + layout-base@1.0.2: + optional: true + + layout-base@2.0.1: + optional: true + + less-loader@12.2.0(less@4.2.0)(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + less: 4.2.0 + optionalDependencies: + webpack: 5.94.0(esbuild@0.23.0) + + less@4.2.0: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.8.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + license-webpack-plugin@4.0.2(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + webpack-sources: 3.3.3 + optionalDependencies: + webpack: 5.94.0(esbuild@0.23.0) + + lightningcss-android-arm64@1.30.2: + optional: true + + lightningcss-darwin-arm64@1.30.2: + optional: true + + lightningcss-darwin-x64@1.30.2: + optional: true + + lightningcss-freebsd-x64@1.30.2: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + + lightningcss-linux-arm64-musl@1.30.2: + optional: true + + lightningcss-linux-x64-gnu@1.30.2: + optional: true + + lightningcss-linux-x64-musl@1.30.2: + optional: true + + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + + lightningcss-win32-x64-msvc@1.30.2: + optional: true + + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + + limiter@1.1.5: + optional: true + + lines-and-columns@1.2.4: {} + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + + listr2@9.0.5: + dependencies: + cli-truncate: 5.1.1 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.2 + + lmdb@3.0.13: + dependencies: + msgpackr: 1.11.5 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.2.2 + ordered-binary: 1.6.0 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 3.0.13 + '@lmdb/lmdb-darwin-x64': 3.0.13 + '@lmdb/lmdb-linux-arm': 3.0.13 + '@lmdb/lmdb-linux-arm64': 3.0.13 + '@lmdb/lmdb-linux-x64': 3.0.13 + '@lmdb/lmdb-win32-x64': 3.0.13 + + lmdb@3.4.3: + dependencies: + msgpackr: 1.11.5 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.2.2 + ordered-binary: 1.6.0 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 3.4.3 + '@lmdb/lmdb-darwin-x64': 3.4.3 + '@lmdb/lmdb-linux-arm': 3.4.3 + '@lmdb/lmdb-linux-arm64': 3.4.3 + '@lmdb/lmdb-linux-x64': 3.4.3 + '@lmdb/lmdb-win32-arm64': 3.4.3 + '@lmdb/lmdb-win32-x64': 3.4.3 + optional: true + + loader-runner@4.3.1: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + loader-utils@3.3.1: {} + + local-pkg@1.1.2: + dependencies: + mlly: 1.8.0 + pkg-types: 2.3.0 + quansync: 0.2.11 + optional: true + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: + optional: true + + lodash.camelcase@4.3.0: {} + + lodash.clonedeep@4.5.0: + optional: true + + lodash.debounce@4.0.8: {} + + lodash.includes@4.3.0: + optional: true + + lodash.isboolean@3.0.3: + optional: true + + lodash.isinteger@4.0.4: + optional: true + + lodash.isnumber@3.0.3: + optional: true + + lodash.isplainobject@4.0.6: + optional: true + + lodash.isstring@4.0.1: + optional: true + + lodash.mapvalues@4.6.0: + optional: true + + lodash.merge@4.6.2: {} + + lodash.once@4.1.1: + optional: true + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.1.1 + cli-cursor: 5.0.0 + slice-ansi: 7.1.2 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + log4js@6.9.1: + dependencies: + date-format: 4.0.14 + debug: 4.4.3 + flatted: 3.3.3 + rfdc: 1.4.1 + streamroller: 3.1.5 + transitivePeerDependencies: + - supports-color + + logform@2.7.0: + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.5.0 + triple-beam: 1.4.1 + optional: true + + long@1.1.5: {} + + long@2.4.0: {} + + long@5.3.2: {} + + lru-cache@10.4.3: {} + + lru-cache@11.2.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + optional: true + + lru-memoizer@2.3.0: + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 6.0.0 + optional: true + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.19: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + make-dir@4.0.0: + dependencies: + semver: 7.7.3 + + make-fetch-happen@14.0.3: + dependencies: + '@npmcli/agent': 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + + make-fetch-happen@15.0.2: + dependencies: + '@npmcli/agent': 4.0.0 + cacache: 20.0.1 + http-cache-semantics: 4.2.0 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + + marked@16.4.1: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + media-typer@1.1.0: {} + + memfs@4.50.0: + dependencies: + '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + merge-descriptors@1.0.3: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid@11.12.1: + dependencies: + '@braintree/sanitize-url': 7.1.1 + '@iconify/utils': 3.0.2 + '@mermaid-js/parser': 0.6.3 + '@types/d3': 7.4.3 + cytoscape: 3.33.1 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) + cytoscape-fcose: 2.2.0(cytoscape@3.33.1) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.13 + dayjs: 1.11.19 + dompurify: 3.3.0 + katex: 0.16.25 + khroma: 2.1.0 + lodash-es: 4.17.21 + marked: 16.4.1 + roughjs: 4.6.6 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 11.1.0 + transitivePeerDependencies: + - supports-color + optional: true + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.54.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mime@1.6.0: {} + + mime@2.6.0: {} + + mime@3.0.0: + optional: true + + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + + mini-css-extract-plugin@2.9.0(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + schema-utils: 4.3.3 + tapable: 2.3.0 + webpack: 5.94.0(esbuild@0.23.0) + + minimalistic-assert@1.0.1: {} + + minimatch@10.1.1: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + minimist@1.2.8: {} + + minipass-collect@2.0.1: + dependencies: + minipass: 7.1.2 + + minipass-fetch@4.0.1: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@7.1.2: {} + + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mlly@1.8.0: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + optional: true + + module-details-from-path@1.0.4: {} + + mrmime@2.0.0: {} + + mrmime@2.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.5: + optionalDependencies: + msgpackr-extract: 3.0.3 + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + mute-stream@1.0.0: {} + + mute-stream@2.0.0: {} + + nanoid@3.3.11: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.2 + optional: true + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + negotiator@1.0.0: {} + + neo-async@2.6.2: {} + + ngx-highlightjs@14.0.1(@angular/cdk@20.2.11(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2): + dependencies: + '@angular/cdk': 20.2.11(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + highlight.js: 11.11.1 + rxjs: 7.8.2 + tslib: 2.8.1 + + ngx-markdown@20.1.0(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(marked@16.4.1)(rxjs@7.8.2)(zone.js@0.15.1): + dependencies: + '@angular/common': 21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) + '@angular/core': 21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1) + '@angular/platform-browser': 21.0.0-rc.0(@angular/animations@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@21.0.0-rc.0(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@21.0.0-rc.0(@angular/compiler@21.0.0-rc.0)(rxjs@7.8.2)(zone.js@0.15.1)) + marked: 16.4.1 + rxjs: 7.8.2 + tslib: 2.8.1 + zone.js: 0.15.1 + optionalDependencies: + clipboard: 2.0.11 + emoji-toolkit: 9.0.1 + katex: 0.16.25 + mermaid: 11.12.1 + prismjs: 1.30.0 + transitivePeerDependencies: + - supports-color + + nice-napi@1.0.2: + dependencies: + node-addon-api: 3.2.1 + node-gyp-build: 4.8.4 + optional: true + + node-addon-api@3.2.1: + optional: true + + node-addon-api@6.1.0: {} + + node-addon-api@7.1.1: + optional: true + + node-domexception@1.0.0: {} + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-forge@1.3.1: {} + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.1.2 + + node-gyp-build@4.8.4: + optional: true + + node-gyp@11.5.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + tar: 7.5.2 + tinyglobby: 0.2.15 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + + node-int64@0.4.0: {} + + node-releases@2.0.27: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-bundled@4.0.0: + dependencies: + npm-normalize-package-bin: 4.0.0 + + npm-install-checks@8.0.0: + dependencies: + semver: 7.7.3 + + npm-normalize-package-bin@4.0.0: {} + + npm-normalize-package-bin@5.0.0: {} + + npm-package-arg@13.0.1: + dependencies: + hosted-git-info: 9.0.2 + proc-log: 5.0.0 + semver: 7.7.3 + validate-npm-package-name: 6.0.2 + + npm-packlist@10.0.3: + dependencies: + ignore-walk: 8.0.0 + proc-log: 6.0.0 + + npm-pick-manifest@11.0.3: + dependencies: + npm-install-checks: 8.0.0 + npm-normalize-package-bin: 5.0.0 + npm-package-arg: 13.0.1 + semver: 7.7.3 + + npm-registry-fetch@19.1.0: + dependencies: + '@npmcli/redact': 3.2.2 + jsonparse: 1.3.1 + make-fetch-happen: 15.0.2 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minizlib: 3.1.0 + npm-package-arg: 13.0.1 + proc-log: 5.0.0 + transitivePeerDependencies: + - supports-color + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + obuf@1.1.2: {} + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.1.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + one-time@1.0.0: + dependencies: + fn.name: 1.1.0 + optional: true + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + open@7.4.2: + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + + openai@4.104.0(encoding@0.1.13)(ws@8.18.3)(zod@3.25.76): + dependencies: + '@types/node': 18.19.130 + '@types/node-fetch': 2.6.13 + abort-controller: 3.0.0 + agentkeepalive: 4.6.0 + form-data-encoder: 1.7.2 + formdata-node: 4.4.1 + node-fetch: 2.7.0(encoding@0.1.13) + optionalDependencies: + ws: 8.18.3 + zod: 3.25.76 + transitivePeerDependencies: + - encoding + + opentracing@0.14.7: {} + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + ora@9.0.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.3.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.2.2 + string-width: 8.1.0 + strip-ansi: 7.1.2 + + ordered-binary@1.6.0: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + optional: true + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@7.0.3: {} + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.3.0 + retry: 0.13.1 + + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.5.0: + optional: true + + pacote@21.0.3: + dependencies: + '@npmcli/git': 7.0.0 + '@npmcli/installed-package-contents': 3.0.0 + '@npmcli/package-json': 7.0.1 + '@npmcli/promise-spawn': 8.0.3 + '@npmcli/run-script': 10.0.2 + cacache: 20.0.1 + fs-minipass: 3.0.3 + minipass: 7.1.2 + npm-package-arg: 13.0.1 + npm-packlist: 10.0.3 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + sigstore: 4.0.0 + ssri: 12.0.0 + tar: 7.5.2 + transitivePeerDependencies: + - supports-color + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.27.1 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-node-version@1.0.1: {} + + parse5-html-rewriting-stream@7.0.0: + dependencies: + entities: 4.5.0 + parse5: 7.3.0 + parse5-sax-parser: 7.0.0 + + parse5-html-rewriting-stream@8.0.0: + dependencies: + entities: 6.0.1 + parse5: 8.0.0 + parse5-sax-parser: 8.0.0 + + parse5-sax-parser@7.0.0: + dependencies: + parse5: 7.3.0 + + parse5-sax-parser@8.0.0: + dependencies: + parse5: 8.0.0 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + parse5@8.0.0: + dependencies: + entities: 6.0.1 + + parseurl@1.3.3: {} + + partial-json@0.1.7: {} + + patch-package@8.0.1: + dependencies: + '@yarnpkg/lockfile': 1.1.0 + chalk: 4.1.2 + ci-info: 3.9.0 + cross-spawn: 7.0.6 + find-yarn-workspace-root: 2.0.0 + fs-extra: 10.1.0 + json-stable-stringify: 1.3.0 + klaw-sync: 6.0.0 + minimist: 1.2.8 + open: 7.4.2 + semver: 7.7.3 + slash: 2.0.0 + tmp: 0.2.5 + yaml: 2.8.1 + + path-data-parser@0.1.0: + optional: true + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-scurry@2.0.0: + dependencies: + lru-cache: 11.2.2 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + path-to-regexp@8.3.0: {} + + path-type@6.0.0: {} + + pathe@2.0.3: + optional: true + + pg-int8@1.0.1: + optional: true + + pg-protocol@1.10.3: + optional: true + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + optional: true + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + picomatch@4.0.3: {} + + pify@4.0.1: + optional: true + + piscina@4.6.1: + optionalDependencies: + nice-napi: 1.0.2 + + piscina@5.1.3: + optionalDependencies: + '@napi-rs/nice': 1.1.1 + + pkce-challenge@5.0.0: {} + + pkg-dir@7.0.0: + dependencies: + find-up: 6.3.0 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 + optional: true + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.7 + pathe: 2.0.3 + optional: true + + points-on-curve@0.2.0: + optional: true + + points-on-path@0.2.1: + dependencies: + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + optional: true + + postcss-loader@8.1.1(postcss@8.4.41)(typescript@5.9.3)(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + cosmiconfig: 9.0.0(typescript@5.9.3) + jiti: 1.21.7 + postcss: 8.4.41 + semver: 7.6.3 + optionalDependencies: + webpack: 5.94.0(esbuild@0.23.0) + transitivePeerDependencies: + - typescript + + postcss-media-query-parser@0.2.3: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-modules-values@4.0.0(postcss@8.5.6): + dependencies: + icss-utils: 5.1.0(postcss@8.5.6) + postcss: 8.5.6 + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.41: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postgres-array@2.0.0: + optional: true + + postgres-bytea@1.0.0: + optional: true + + postgres-date@1.0.7: + optional: true + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + optional: true + + prismjs@1.30.0: + optional: true + + proc-log@5.0.0: {} + + proc-log@6.0.0: {} + + process-nextick-args@2.0.1: {} + + process@0.10.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + proto3-json-serializer@2.0.2: + dependencies: + protobufjs: 7.5.4 + + protobuf.js@1.1.2: + dependencies: + long: 1.1.5 + + protobufjs@7.5.4: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.19.24 + long: 5.3.2 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + prr@1.0.1: + optional: true + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + optional: true + + pumpify@2.0.1: + dependencies: + duplexify: 4.1.3 + inherits: 2.0.4 + pump: 3.0.3 + optional: true + + punycode@1.4.1: {} + + punycode@2.3.1: {} + + qjobs@1.2.0: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.11: + optional: true + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + raw-body@3.0.1: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.7.0 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + reflect-metadata@0.2.2: {} + + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regex-parser@2.3.1: {} + + regexpu-core@6.4.0: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.13.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + + regjsgen@0.8.0: {} + + regjsparser@0.13.0: + dependencies: + jsesc: 3.1.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-in-the-middle@7.5.2: + dependencies: + debug: 4.4.3 + module-details-from-path: 1.0.4 + resolve: 1.22.11 + transitivePeerDependencies: + - supports-color + + requires-port@1.0.0: {} + + resolve-from@4.0.0: {} + + resolve-url-loader@5.0.0: + dependencies: + adjust-sourcemap-loader: 4.0.0 + convert-source-map: 1.9.0 + loader-utils: 2.0.4 + postcss: 8.5.6 + source-map: 0.6.1 + + resolve@1.22.11: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + retry-request@7.0.2(encoding@0.1.13): + dependencies: + '@types/request': 2.48.13 + extend: 3.0.2 + teeny-request: 9.0.0(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + + retry@0.12.0: {} + + retry@0.13.1: {} + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + robust-predicates@3.0.2: + optional: true + + rolldown@1.0.0-beta.44: + dependencies: + '@oxc-project/types': 0.95.0 + '@rolldown/pluginutils': 1.0.0-beta.44 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.44 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.44 + '@rolldown/binding-darwin-x64': 1.0.0-beta.44 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.44 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.44 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.44 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.44 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.44 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.44 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.44 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.44 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.44 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.44 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.44 + + rollup@4.22.4: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.22.4 + '@rollup/rollup-android-arm64': 4.22.4 + '@rollup/rollup-darwin-arm64': 4.22.4 + '@rollup/rollup-darwin-x64': 4.22.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.22.4 + '@rollup/rollup-linux-arm-musleabihf': 4.22.4 + '@rollup/rollup-linux-arm64-gnu': 4.22.4 + '@rollup/rollup-linux-arm64-musl': 4.22.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.22.4 + '@rollup/rollup-linux-riscv64-gnu': 4.22.4 + '@rollup/rollup-linux-s390x-gnu': 4.22.4 + '@rollup/rollup-linux-x64-gnu': 4.22.4 + '@rollup/rollup-linux-x64-musl': 4.22.4 + '@rollup/rollup-win32-arm64-msvc': 4.22.4 + '@rollup/rollup-win32-ia32-msvc': 4.22.4 + '@rollup/rollup-win32-x64-msvc': 4.22.4 + fsevents: 2.3.3 + + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + + roughjs@4.6.6: + dependencies: + hachure-fill: 0.5.2 + path-data-parser: 0.1.0 + points-on-curve: 0.2.0 + points-on-path: 0.2.1 + optional: true + + router@2.2.0: + dependencies: + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color + + run-applescript@7.1.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: + optional: true + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safe-stable-stringify@2.5.0: + optional: true + + safer-buffer@2.1.2: {} + + sass-loader@16.0.0(sass@1.77.6)(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + neo-async: 2.6.2 + optionalDependencies: + sass: 1.77.6 + webpack: 5.94.0(esbuild@0.23.0) + + sass@1.77.6: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.1 + + sass@1.93.2: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + sax@1.4.2: + optional: true + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + select-hose@2.0.0: {} + + select@1.1.2: + optional: true + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.14 + node-forge: 1.3.1 + + semver@5.7.2: + optional: true + + semver@6.3.1: {} + + semver@7.6.3: {} + + semver@7.7.3: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + send@1.2.0: + dependencies: + debug: 4.4.3 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.3: {} + + shimmer@1.2.1: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sigstore@4.0.0: + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.0.0 + '@sigstore/protobuf-specs': 0.5.0 + '@sigstore/sign': 4.0.1 + '@sigstore/tuf': 4.0.0 + '@sigstore/verify': 3.0.0 + transitivePeerDependencies: + - supports-color + + slash@2.0.0: {} + + slash@5.1.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.2: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + + smart-buffer@4.2.0: {} + + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + socks-proxy-agent@8.0.5: + dependencies: + agent-base: 7.1.4 + debug: 4.4.3 + socks: 2.8.7 + transitivePeerDependencies: + - supports-color + + socks@2.8.7: + dependencies: + ip-address: 10.0.1 + smart-buffer: 4.2.0 + + source-map-js@1.2.1: {} + + source-map-loader@5.0.0(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + iconv-lite: 0.6.3 + source-map-js: 1.2.1 + webpack: 5.94.0(esbuild@0.23.0) + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + source-map@0.7.6: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.3 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.3 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + + stack-trace@0.0.10: + optional: true + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + statuses@2.0.2: {} + + stdin-discarder@0.2.2: {} + + stream-events@1.0.5: + dependencies: + stubs: 3.0.0 + + stream-shift@1.0.3: {} + + streamroller@3.1.5: + dependencies: + date-format: 4.0.14 + debug: 4.4.3 + fs-extra: 8.1.0 + transitivePeerDependencies: + - supports-color + + string-template@0.2.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.2 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string-width@8.1.0: + dependencies: + get-east-asian-width: 1.4.0 + strip-ansi: 7.1.2 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + + strnum@1.1.2: + optional: true + + stubs@3.0.0: {} + + stylis@4.3.6: + optional: true + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwindcss@4.1.16: {} + + tapable@2.3.0: {} + + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + + teeny-request@9.0.0(encoding@0.1.13): + dependencies: + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0(encoding@0.1.13) + stream-events: 1.0.5 + uuid: 9.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + terser-webpack-plugin@5.3.14(esbuild@0.23.0)(webpack@5.94.0): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.31.6 + webpack: 5.94.0(esbuild@0.23.0) + optionalDependencies: + esbuild: 0.23.0 + + terser@5.31.6: + dependencies: + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-hex@1.0.0: + optional: true + + thingies@2.5.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + thriftrw@3.11.4: + dependencies: + bufrw: 1.4.0 + error: 7.0.2 + long: 2.4.0 + + thunky@1.1.0: {} + + tiny-emitter@2.1.0: + optional: true + + tinyexec@1.0.2: + optional: true + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tmp@0.2.5: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tr46@0.0.3: {} + + tree-dump@1.1.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + tree-kill@1.2.2: {} + + triple-beam@1.4.1: + optional: true + + ts-dedent@2.2.0: + optional: true + + tslib@2.6.3: {} + + tslib@2.8.1: {} + + tuf-js@4.0.0: + dependencies: + '@tufjs/models': 4.0.0 + debug: 4.4.3 + make-fetch-happen: 15.0.2 + transitivePeerDependencies: + - supports-color + + type-fest@0.21.3: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + type-is@2.0.1: + dependencies: + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typed-assert@1.0.9: {} + + typescript@5.9.3: {} + + ua-parser-js@0.7.41: {} + + ufo@1.6.1: + optional: true + + uglify-js@3.19.3: + optional: true + + undici-types@5.26.5: {} + + undici-types@6.21.0: {} + + unicode-canonical-property-names-ecmascript@2.0.1: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + + unicode-match-property-value-ecmascript@2.2.1: {} + + unicode-property-aliases-ecmascript@2.2.0: {} + + unicorn-magic@0.3.0: {} + + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-slug@5.0.0: + dependencies: + imurmurhash: 0.1.4 + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uri-templates@0.2.0: {} + + url-template@2.0.8: {} + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@10.0.0: {} + + uuid@11.1.0: + optional: true + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@6.0.2: {} + + vary@1.1.2: {} + + vite@5.4.21(@types/node@20.19.24)(less@4.2.0)(lightningcss@1.30.2)(sass@1.77.6)(terser@5.31.6): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.6 + rollup: 4.22.4 + optionalDependencies: + '@types/node': 20.19.24 + fsevents: 2.3.3 + less: 4.2.0 + lightningcss: 1.30.2 + sass: 1.77.6 + terser: 5.31.6 + + vite@7.1.11(@types/node@20.19.24)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.30.2)(sass@1.93.2)(terser@5.31.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 20.19.24 + fsevents: 2.3.3 + jiti: 2.6.1 + less: 4.2.0 + lightningcss: 1.30.2 + sass: 1.93.2 + terser: 5.31.6 + yaml: 2.8.1 + + void-elements@2.0.1: {} + + vscode-jsonrpc@8.2.0: + optional: true + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + optional: true + + vscode-languageserver-textdocument@1.0.12: + optional: true + + vscode-languageserver-types@3.17.5: + optional: true + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + optional: true + + vscode-uri@3.0.8: + optional: true + + watchpack@2.4.1: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + weak-lru-cache@1.2.2: {} + + web-streams-polyfill@3.3.3: {} + + web-streams-polyfill@4.0.0-beta.3: {} + + webidl-conversions@3.0.1: {} + + webpack-dev-middleware@7.4.2(webpack@5.94.0): + dependencies: + colorette: 2.0.20 + memfs: 4.50.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.3 + optionalDependencies: + webpack: 5.94.0(esbuild@0.23.0) + + webpack-dev-server@5.2.2(webpack@5.94.0): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.25 + '@types/express-serve-static-core': 4.19.7 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.10 + '@types/sockjs': 0.3.36 + '@types/ws': 8.18.1 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.8.1 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.9(@types/express@4.17.25) + ipaddr.js: 2.2.0 + launch-editor: 2.12.0 + open: 10.1.0 + p-retry: 6.2.1 + schema-utils: 4.3.3 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2(webpack@5.94.0) + ws: 8.18.3 + optionalDependencies: + webpack: 5.94.0(esbuild@0.23.0) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@6.0.1: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.3.3: {} + + webpack-subresource-integrity@5.1.0(webpack@5.94.0(esbuild@0.23.0)): + dependencies: + typed-assert: 1.0.9 + webpack: 5.94.0(esbuild@0.23.0) + + webpack@5.94.0(esbuild@0.23.0): + dependencies: + '@types/estree': 1.0.8 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + browserslist: 4.27.0 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.1 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(esbuild@0.23.0)(webpack@5.94.0) + watchpack: 2.4.1 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.10 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@5.0.0: + dependencies: + isexe: 3.1.1 + + wildcard@2.0.1: {} + + winston-transport@4.9.0: + dependencies: + logform: 2.7.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + optional: true + + winston@3.18.3: + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.8 + async: 3.2.6 + is-stream: 2.0.1 + logform: 2.7.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.5.0 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.9.0 + optional: true + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.1.2 + + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.1.2 + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + ws@8.18.3: {} + + xhr2@0.2.1: {} + + xorshift@1.2.0: {} + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yallist@5.0.0: {} + + yaml@2.8.1: {} + + yargs-parser@20.2.9: {} + + yargs-parser@21.1.1: {} + + yargs-parser@22.0.0: {} + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yargs@18.0.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 7.2.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 + + yocto-queue@0.1.0: + optional: true + + yocto-queue@1.2.1: {} + + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.1.2: {} + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} + + zone.js@0.15.1: {} diff --git a/dynamic-sdui-app/public/cover-art/biography.png b/dynamic-sdui-app/public/cover-art/biography.png new file mode 100644 index 0000000..b141cf6 Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/biography.png differ diff --git a/dynamic-sdui-app/public/cover-art/childrens.png b/dynamic-sdui-app/public/cover-art/childrens.png new file mode 100644 index 0000000..90c75fd Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/childrens.png differ diff --git a/dynamic-sdui-app/public/cover-art/cooking.png b/dynamic-sdui-app/public/cover-art/cooking.png new file mode 100644 index 0000000..51325b6 Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/cooking.png differ diff --git a/dynamic-sdui-app/public/cover-art/fantasy.png b/dynamic-sdui-app/public/cover-art/fantasy.png new file mode 100644 index 0000000..aac3dee Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/fantasy.png differ diff --git a/dynamic-sdui-app/public/cover-art/military-thriller.png b/dynamic-sdui-app/public/cover-art/military-thriller.png new file mode 100644 index 0000000..b9911b2 Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/military-thriller.png differ diff --git a/dynamic-sdui-app/public/cover-art/mystery.png b/dynamic-sdui-app/public/cover-art/mystery.png new file mode 100644 index 0000000..901c1fd Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/mystery.png differ diff --git a/dynamic-sdui-app/public/cover-art/philosophy.png b/dynamic-sdui-app/public/cover-art/philosophy.png new file mode 100644 index 0000000..eb01084 Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/philosophy.png differ diff --git a/dynamic-sdui-app/public/cover-art/political-thriller.png b/dynamic-sdui-app/public/cover-art/political-thriller.png new file mode 100644 index 0000000..818c2bb Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/political-thriller.png differ diff --git a/dynamic-sdui-app/public/cover-art/romance.png b/dynamic-sdui-app/public/cover-art/romance.png new file mode 100644 index 0000000..40f2bc6 Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/romance.png differ diff --git a/dynamic-sdui-app/public/cover-art/rpg-lit.png b/dynamic-sdui-app/public/cover-art/rpg-lit.png new file mode 100644 index 0000000..a84d88b Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/rpg-lit.png differ diff --git a/dynamic-sdui-app/public/cover-art/science-fiction.png b/dynamic-sdui-app/public/cover-art/science-fiction.png new file mode 100644 index 0000000..d988c5c Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/science-fiction.png differ diff --git a/dynamic-sdui-app/public/cover-art/self-help.png b/dynamic-sdui-app/public/cover-art/self-help.png new file mode 100644 index 0000000..3beb127 Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/self-help.png differ diff --git a/dynamic-sdui-app/public/cover-art/travel.png b/dynamic-sdui-app/public/cover-art/travel.png new file mode 100644 index 0000000..71fb7a5 Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/travel.png differ diff --git a/dynamic-sdui-app/public/cover-art/young-adult.png b/dynamic-sdui-app/public/cover-art/young-adult.png new file mode 100644 index 0000000..9304ddc Binary files /dev/null and b/dynamic-sdui-app/public/cover-art/young-adult.png differ diff --git a/dynamic-sdui-app/public/favicon.ico b/dynamic-sdui-app/public/favicon.ico new file mode 100644 index 0000000..57614f9 Binary files /dev/null and b/dynamic-sdui-app/public/favicon.ico differ diff --git a/dynamic-sdui-app/public/properties/beach-villa-2.png b/dynamic-sdui-app/public/properties/beach-villa-2.png new file mode 100644 index 0000000..7277278 Binary files /dev/null and b/dynamic-sdui-app/public/properties/beach-villa-2.png differ diff --git a/dynamic-sdui-app/public/properties/beach-villa-3.png b/dynamic-sdui-app/public/properties/beach-villa-3.png new file mode 100644 index 0000000..7f69a37 Binary files /dev/null and b/dynamic-sdui-app/public/properties/beach-villa-3.png differ diff --git a/dynamic-sdui-app/public/properties/beach-villa.png b/dynamic-sdui-app/public/properties/beach-villa.png new file mode 100644 index 0000000..a65545a Binary files /dev/null and b/dynamic-sdui-app/public/properties/beach-villa.png differ diff --git a/dynamic-sdui-app/public/properties/city-loft.png b/dynamic-sdui-app/public/properties/city-loft.png new file mode 100644 index 0000000..4beb587 Binary files /dev/null and b/dynamic-sdui-app/public/properties/city-loft.png differ diff --git a/dynamic-sdui-app/public/properties/desert-oasis-2.png b/dynamic-sdui-app/public/properties/desert-oasis-2.png new file mode 100644 index 0000000..4f27421 Binary files /dev/null and b/dynamic-sdui-app/public/properties/desert-oasis-2.png differ diff --git a/dynamic-sdui-app/public/properties/desert-oasis.png b/dynamic-sdui-app/public/properties/desert-oasis.png new file mode 100644 index 0000000..046fa3a Binary files /dev/null and b/dynamic-sdui-app/public/properties/desert-oasis.png differ diff --git a/dynamic-sdui-app/public/properties/historic-house.png b/dynamic-sdui-app/public/properties/historic-house.png new file mode 100644 index 0000000..1e468c7 Binary files /dev/null and b/dynamic-sdui-app/public/properties/historic-house.png differ diff --git a/dynamic-sdui-app/public/properties/japanese-house-2.png b/dynamic-sdui-app/public/properties/japanese-house-2.png new file mode 100644 index 0000000..6d1ead4 Binary files /dev/null and b/dynamic-sdui-app/public/properties/japanese-house-2.png differ diff --git a/dynamic-sdui-app/public/properties/japanese-house-3.png b/dynamic-sdui-app/public/properties/japanese-house-3.png new file mode 100644 index 0000000..b8ac1c9 Binary files /dev/null and b/dynamic-sdui-app/public/properties/japanese-house-3.png differ diff --git a/dynamic-sdui-app/public/properties/japanese-house.png b/dynamic-sdui-app/public/properties/japanese-house.png new file mode 100644 index 0000000..ee231ee Binary files /dev/null and b/dynamic-sdui-app/public/properties/japanese-house.png differ diff --git a/dynamic-sdui-app/public/properties/lake-house.png b/dynamic-sdui-app/public/properties/lake-house.png new file mode 100644 index 0000000..8f91bce Binary files /dev/null and b/dynamic-sdui-app/public/properties/lake-house.png differ diff --git a/dynamic-sdui-app/public/properties/mountain-cabin-2.png b/dynamic-sdui-app/public/properties/mountain-cabin-2.png new file mode 100644 index 0000000..b662f65 Binary files /dev/null and b/dynamic-sdui-app/public/properties/mountain-cabin-2.png differ diff --git a/dynamic-sdui-app/public/properties/mountain-cabin-3.png b/dynamic-sdui-app/public/properties/mountain-cabin-3.png new file mode 100644 index 0000000..472a777 Binary files /dev/null and b/dynamic-sdui-app/public/properties/mountain-cabin-3.png differ diff --git a/dynamic-sdui-app/public/properties/mountain-cabin.png b/dynamic-sdui-app/public/properties/mountain-cabin.png new file mode 100644 index 0000000..f5c71c0 Binary files /dev/null and b/dynamic-sdui-app/public/properties/mountain-cabin.png differ diff --git a/dynamic-sdui-app/public/properties/treehouse-2.png b/dynamic-sdui-app/public/properties/treehouse-2.png new file mode 100644 index 0000000..3afe00e Binary files /dev/null and b/dynamic-sdui-app/public/properties/treehouse-2.png differ diff --git a/dynamic-sdui-app/public/properties/treehouse.png b/dynamic-sdui-app/public/properties/treehouse.png new file mode 100644 index 0000000..3443c41 Binary files /dev/null and b/dynamic-sdui-app/public/properties/treehouse.png differ diff --git a/dynamic-sdui-app/public/properties/tuscan-villa.png b/dynamic-sdui-app/public/properties/tuscan-villa.png new file mode 100644 index 0000000..764bd54 Binary files /dev/null and b/dynamic-sdui-app/public/properties/tuscan-villa.png differ diff --git a/dynamic-sdui-app/src/app/app.config.server.ts b/dynamic-sdui-app/src/app/app.config.server.ts new file mode 100644 index 0000000..7b0d850 --- /dev/null +++ b/dynamic-sdui-app/src/app/app.config.server.ts @@ -0,0 +1,19 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { mergeApplicationConfig, ApplicationConfig } from '@angular/core'; +import { provideServerRendering, withRoutes } from '@angular/ssr'; +import { appConfig } from './app.config'; +import { serverRoutes } from './app.routes.server'; + +const serverConfig: ApplicationConfig = { + providers: [ + provideServerRendering(withRoutes(serverRoutes)) + ] +}; + +export const config = mergeApplicationConfig(appConfig, serverConfig); diff --git a/dynamic-sdui-app/src/app/app.config.ts b/dynamic-sdui-app/src/app/app.config.ts new file mode 100644 index 0000000..a874d87 --- /dev/null +++ b/dynamic-sdui-app/src/app/app.config.ts @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core'; +import { provideRouter, withComponentInputBinding } from '@angular/router'; +import { provideHighlightOptions } from 'ngx-highlightjs'; +import { provideMarkdown } from 'ngx-markdown'; + +import { routes } from './app.routes'; +import { provideClientHydration, withEventReplay } from '@angular/platform-browser'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideRouter(routes, withComponentInputBinding()), + provideClientHydration(withEventReplay()), + provideMarkdown(), + provideHighlightOptions({ + coreLibraryLoader: () => import('highlight.js/lib/core'), + languages: { + typescript: () => import('highlight.js/lib/languages/typescript'), + xml: () => import('highlight.js/lib/languages/xml'), + css: () => import('highlight.js/lib/languages/css'), + bash: () => import('highlight.js/lib/languages/bash'), + }, + }), + ] +}; diff --git a/dynamic-sdui-app/src/app/app.routes.server.ts b/dynamic-sdui-app/src/app/app.routes.server.ts new file mode 100644 index 0000000..d3d414e --- /dev/null +++ b/dynamic-sdui-app/src/app/app.routes.server.ts @@ -0,0 +1,15 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { RenderMode, ServerRoute } from '@angular/ssr'; + +export const serverRoutes: ServerRoute[] = [ + { + path: '**', + renderMode: RenderMode.Client + } +]; diff --git a/dynamic-sdui-app/src/app/app.routes.ts b/dynamic-sdui-app/src/app/app.routes.ts new file mode 100644 index 0000000..192b752 --- /dev/null +++ b/dynamic-sdui-app/src/app/app.routes.ts @@ -0,0 +1,29 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Routes } from '@angular/router'; +import { Base } from './base-components/base.component'; +import { MagicAiComponent } from './magic-ai/magic-ai-container.component'; +import { FavoritesListComponent } from './apps/vacation-rentals/components/favorites-list.component'; +import { ShowcaseDirectoryComponent } from './showcase/showcase-directory.component' + +export const routes: Routes = [ + { + path: '', + component: Base, + children: [ + { path: '', redirectTo: '/magic/0', pathMatch: 'full' }, + { path: 'magic', redirectTo: '/magic/0', pathMatch: 'full' }, + { path: 'magic/:index', component: MagicAiComponent }, + { path: 'favorites', component: FavoritesListComponent }, + ] + }, + { path: 'showcase', component: ShowcaseDirectoryComponent }, + { path: 'showcase/adev-docs', loadComponent:() => import('./apps/adev-docs/components/component-showcase.component').then(c => c.AdevDocsComponentShowcaseComponent) }, + { path: 'showcase/haven', loadComponent: () => import('./apps/vacation-rentals/components/component-showcase.component').then(c => c.ComponentShowcaseComponent) }, + { path: 'showcase/magic-bookstore', loadComponent: () => import('./apps/magic-bookstore/magic-bookstore-showcase.component').then(c => c.MagicBookstoreShowcaseComponent) }, +]; diff --git a/dynamic-sdui-app/src/app/app.spec.ts b/dynamic-sdui-app/src/app/app.spec.ts new file mode 100644 index 0000000..2e2a8e4 --- /dev/null +++ b/dynamic-sdui-app/src/app/app.spec.ts @@ -0,0 +1,23 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { TestBed } from '@angular/core/testing'; +import { App } from './base-components/app'; + +describe('App', () => { + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [App], + }).compileComponents(); + }); + + it('should create the app', () => { + const fixture = TestBed.createComponent(App); + const app = fixture.componentInstance; + expect(app).toBeTruthy(); + }); +}); diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/app-context.ts b/dynamic-sdui-app/src/app/apps/adev-docs/app-context.ts new file mode 100644 index 0000000..508c77a --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/app-context.ts @@ -0,0 +1,242 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Type } from '@angular/core'; +import { LearnMoreButtonComponent } from './components/learn-more-button.component'; +import { SectionTitleComponent } from './components/section-title.component'; +import { SubsectionTitleComponent } from './components/subsection-title.component'; +import { ConceptExplanationComponent } from './components/concept-explanation.component'; +import { ApiReferenceComponent } from './components/api-reference.component'; +import { CodeSnippetComponent } from './components/code-snippet.component'; +import { FullCodeExampleComponent } from './components/full-code-example.component'; +import { CalloutComponent } from './components/callout.component'; +import { TopicCardComponent } from './components/topic-card.component'; +import { ComponentContext } from '../../magic-ai/app-context'; + +// --- GENERATE CONTEXT DATA (from Step 6) --- +const GENERATED_COMPONENT_CONTEXT_DATA: ComponentContext[] = [ + { + "name": "LearnMoreButtonComponent", + "description": "A button that allows the user to request more information about a specific topic.", + "type": "dynamicComponent", + "inputs": { + "buttonText": { + "type": "string", + "description": "The text to display on the button.", + "required": true + }, + "topic": { + "type": "string", + "description": "The topic to learn more about.", + "required": true + } + } + }, + { + "name": "SectionTitleComponent", + "description": "Displays a prominent title for a major section of documentation.", + "type": "dynamicComponent", + "inputs": { + "title": { + "type": "string", + "description": "The main title text for the section.", + "required": true + } + } + }, + { + "name": "SubsectionTitleComponent", + "description": "Displays a title for a subsection within a major documentation section.", + "type": "dynamicComponent", + "inputs": { + "title": { + "type": "string", + "description": "The title text for the subsection.", + "required": true + } + } + }, + { + "name": "ConceptExplanationComponent", + "description": "Renders a block of text explaining an Angular concept or providing general descriptive information.", + "type": "dynamicComponent", + "inputs": { + "content": { + "type": "string", + "description": "The HTML content of the explanation.", + "required": true + } + } + }, + { + "name": "ApiReferenceComponent", + "description": "Displays detailed information about an Angular API (e.g., a class, interface, method, property, or decorator).", + "type": "dynamicComponent", + "inputs": { + "apiItem": { + "type": "{ name: string; typeSignature?: string; description: string; parameters?: { name: string; type: string; description: string; }[]; returnValue?: { type: string; description: string; }; }", + "description": "An object containing the API item's name, optional type signature, description, optional parameters, and optional return value.", + "required": true + } + } + }, + { + "name": "CodeSnippetComponent", + "description": "Renders a small, inline, or block-level code snippet to illustrate a specific usage.", + "type": "dynamicComponent", + "inputs": { + "code": { + "type": "string", + "description": "The code to display.", + "required": true + }, + "language": { + "type": "string", + "description": "The programming language of the code (e.g., 'typescript', 'html', 'css').", + "required": true + } + } + }, + { + "name": "FullCodeExampleComponent", + "description": "Displays a complete, runnable code example with accompanying explanations. Use this whenever a user asks for a code example.", + "type": "dynamicComponent", + "inputs": { + "example": { + "type": "{ title: string; description: string; code: string; language: string; }", + "description": "An object containing the example's title, a detailed description, the code, and its language.", + "required": true + } + } + }, + { + "name": "CalloutComponent", + "description": "Displays important notes, warnings, tips, or other callout information.", + "type": "dynamicComponent", + "inputs": { + "type": { + "type": "'info' | 'warning' | 'danger' | 'tip'", + "description": "The type of callout, determining its visual style.", + "required": true + }, + "content": { + "type": "string", + "description": "The HTML content of the callout message.", + "required": true + } + } + }, + { + "name": "TopicCardComponent", + "description": "A card to present a topic to a user for further exploration. It should be used on the welcome page or inline in explanatory content to offer related content.", + "type": "dynamicComponent", + "inputs": { + "topic": { + "type": "string", + "description": "The topic to display on the card.", + "required": true + }, + "description": { + "type": "string", + "description": "A short description of the topic.", + "required": true + } + } + } +]; + +// --- GENERATE COMPONENT MAP --- +const GENERATED_COMPONENT_MAP: { [key: string]: Type } = { + 'LearnMoreButtonComponent': LearnMoreButtonComponent, + 'SectionTitleComponent': SectionTitleComponent, + 'SubsectionTitleComponent': SubsectionTitleComponent, + 'ConceptExplanationComponent': ConceptExplanationComponent, + 'ApiReferenceComponent': ApiReferenceComponent, + 'CodeSnippetComponent': CodeSnippetComponent, + 'FullCodeExampleComponent': FullCodeExampleComponent, + 'CalloutComponent': CalloutComponent, + 'TopicCardComponent': TopicCardComponent, +}; + +const GENERATED_APP_DESCRIPTION = ` +You are building a UI for a dynamic documentation site for the Angular web framework. +The goal is to surface relevant information efficiently, combining related concepts and different types of content (explanations, API references, code snippets, full examples) into a single view. + +### 1. Domain-Specific Mapping Rules: +* When you see data related to a 'concept explanation' or general descriptive text, you must use the \`ConceptExplanationComponent\`. +* When you see data related to 'API reference' (methods, properties, fields, interfaces, types), you must use the \`ApiReferenceComponent\`. +* When you see data related to 'short code snippets' for quick illustration, you must use the \`CodeSnippetComponent\`. +* When you see data related to 'full code examples' with detailed explanations, you must use the \`FullCodeExampleComponent\`. +* When you see data related to a 'section title' for major content divisions, you must use the \`SectionTitleComponent\`. +* When you see data related to a 'subsection title' for minor content divisions, you must use the \`SubsectionTitleComponent\`. +* When you see data related to a 'callout', 'note', 'warning', or 'tip', you must use the \`CalloutComponent\`. + +### 2. Layout Compositions: +* **DefaultLayout:** If no specific layoutHint is provided, you must render a single-column layout, stacking components vertically. This is suitable for general content flow. +* **ConceptDetailLayout:** If layoutHint is "ConceptDetailLayout", you must render a vertical stack of components, prioritizing \`ConceptExplanationComponent\`, followed by relevant \`CodeSnippetComponent\` and optionally \`ApiReferenceComponent\` or \`FullCodeExampleComponent\` to provide comprehensive detail on a single concept. +* **ApiReferenceLayout:** If layoutHint is "ApiReferenceLayout", you must render a layout focused on API details. This should primarily feature \`ApiReferenceComponent\`, potentially interleaved with \`CodeSnippetComponent\` for usage examples and \`ConceptExplanationComponent\` for introductory or explanatory text. +* **CodeExampleLayout:** If layoutHint is "CodeExampleLayout", you must render a layout that highlights code examples. This should feature \`FullCodeExampleComponent\` prominently, accompanied by \`ConceptExplanationComponent\` for context and explanation, and optionally \`CodeSnippetComponent\` for smaller, related examples. +* **MixedContentLayout:** If layoutHint is "MixedContentLayout", you must render a flexible vertical stack that can combine various content types (explanations, snippets, API details, full examples) in an order that best explains a complex topic. Use \`SectionTitleComponent\` and \`SubsectionTitleComponent\` to organize the content logically within this layout. +`; + +const LOADING_TEXT: string[] = [ + "Compiling components... and my thoughts.", + "Bootstrapping the AppModule... This is not a drill.", + "Resolving dependencies... and existential crises.", + "Waking up the Angular Ivy compiler... It's not a morning person.", + "Running change detection... I see you're still waiting.", + "Awaiting asynchronous operations... and the heat death of the universe.", + "Fetching the latest bundle... It's heavier than it looks.", + "Optimizing the critical rendering path... and my route to the coffee machine.", + "Tree-shaking unused modules... and the office plants.", + "Negotiating with the Zone.js monkeys...", + "Trying to remember if this is AngularJS or just Angular...", + "Injecting dependencies... Hold still, this won't hurt a bit.", + "Just transpiling some TypeScript. It's like regular JavaScript, but with a tie.", + "I'm not slow, I'm just single-threaded.", + "Hold on, I'm debugging my life choices... and this component.", + "If you think this is slow, you should see my webpack config.", + "Don't worry, I've cached your patience... somewhere.", + "This is taking longer than a `git merge` conflict resolution.", + "I'm not stuck, I'm just admiring the elegance of the loading spinner.", + "I'm sure your component will render... eventually.", + "I'm not just loading, I'm achieving a state of zen-like tranquility.", + "The good news is, your app is becoming self-aware. The bad news is, it's a teenager.", + "I'm not saying it's aliens, but... it's aliens.", + "I'm not procrastinating, I'm just waiting for the right moment to render.", + "I'm not a magician, but I'm about to pull a UI out of a hat.", + "I'm not just a pretty face, I'm also a loading spinner.", + "I'm not just a loading spinner, I'm a metaphor for the human condition.", + "I'm not just a metaphor for the human condition, I'm also a pretty face.", + "I'm not just a pretty face, I'm also a loading spinner... wait, I said that already.", + "Warming up the virtual DOM... almost there!", + "Crafting pixels with care, one frame at a time.", + "Assembling the perfect user experience, piece by piece.", + "Just a moment while we fetch the latest web wisdom.", + "Polishing the UI to a brilliant shine.", + "Brewing a fresh cup of JavaScript... almost ready!", + "Connecting the dots in the vast web of knowledge.", + "Unpacking the bundle of joy (and code).", + "Preparing your personalized Angular insights.", + "Making sure all your directives are in order.", + "Just a few more cycles until perfection.", + "Gathering all the bits and bytes for your viewing pleasure.", + "Almost ready to serve up some fresh front-end goodness.", + "We're working hard to make your web dreams a reality.", + "Your patience is appreciated, and your experience is our priority.", +]; + +export const GENERATED_APP_CONTEXT = { + appName: 'Angular Docs', + theme: 'adev-docs', + welcomeText: 'Welcome! How can I help you with your Angular questions today?', + placeholders: LOADING_TEXT, + appDescription: GENERATED_APP_DESCRIPTION, + componentMap: GENERATED_COMPONENT_MAP, + componentContextData: GENERATED_COMPONENT_CONTEXT_DATA +}; diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/api-reference.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/api-reference.component.ts new file mode 100644 index 0000000..9410d04 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/api-reference.component.ts @@ -0,0 +1,159 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormatInlineCodePipe } from '../../../pipes/format-inline-code.pipe'; + +interface ApiParameter { + name: string; + type: string; + description: string; +} + +interface ApiReturnValue { + type: string; + description: string; +} + +interface ApiItem { + name: string; + typeSignature?: string; + description: string; + parameters?: ApiParameter[]; + returnValue?: ApiReturnValue; +} + +@Component({ + selector: 'adev-api-reference', + standalone: true, + imports: [CommonModule, FormatInlineCodePipe], + template: `@if (apiItem(); as item) { +
      +

      {{ item.name }}

      + @if (item.typeSignature) { +
      {{ item.typeSignature }}
      + } +

      + + @if (item.parameters && item.parameters.length > 0) { +
      +

      Parameters

      +
        + @for (param of item.parameters; track param.name) { +
      • + {{ param.name }}: + {{ param.type }} - + +
      • + } +
      +
      + } + + @if (item.returnValue) { +
      +

      Returns

      +

      + {{ item.returnValue.type }} - + +

      +
      + } +
      +}`, + styles: [`.api-reference-card { + background-color: var(--adev-docs-surface); + border: 1px solid var(--adev-docs-border); + border-radius: var(--adev-docs-border-radius); + padding: 1.5rem; + margin-bottom: 1.5rem; + box-shadow: var(--adev-docs-shadow); + color: var(--adev-docs-text); +} + +.api-name { + font-size: 1.6rem; + font-weight: 700; + color: var(--adev-docs-primary); + margin-bottom: 0.8rem; +} + +.api-signature { + background-color: var(--adev-docs-code-background); + padding: 0.8rem; + border-radius: var(--adev-docs-border-radius); + overflow-x: auto; + margin-bottom: 1rem; +} + +.api-signature code { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; + color: var(--adev-docs-code-text); + font-size: 0.95em; +} + +.api-description { + font-size: 1rem; + line-height: 1.5; + margin-bottom: 1.2rem; + color: var(--adev-docs-text-secondary); +} + +.api-section { + margin-top: 1.5rem; +} + +.api-section h4 { + font-size: 1.2rem; + font-weight: 600; + color: var(--adev-docs-text); + margin-bottom: 0.8rem; + border-bottom: 1px solid var(--adev-docs-border); + padding-bottom: 0.3rem; +} + +.api-params-list { + list-style: none; + padding: 0; + margin: 0; +} + +.api-params-list li { + margin-bottom: 0.7rem; + font-size: 0.95rem; +} + +.param-name { + font-weight: 600; + color: var(--adev-docs-text); +} + +.param-type { + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; + color: var(--adev-docs-primary); +} + +.param-description { + color: var(--adev-docs-text-secondary); +} + +.return-type { + font-weight: 600; + color: var(--adev-docs-primary); + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; +} + +.return-description { + color: var(--adev-docs-text-secondary); +} +`], +}) +export class ApiReferenceComponent { + apiItem = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/callout.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/callout.component.ts new file mode 100644 index 0000000..f34d3c3 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/callout.component.ts @@ -0,0 +1,80 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormatInlineCodePipe } from '../../../pipes/format-inline-code.pipe'; + +type CalloutType = 'info' | 'warning' | 'danger' | 'tip'; + +@Component({ + selector: 'adev-callout', + standalone: true, + imports: [CommonModule, FormatInlineCodePipe], + template: `@if (content()) { +
      +
      + @switch (type()) { + @case ('info') { ℹ️ } + @case ('warning') { ⚠️ } + @case ('danger') { 🛑 } + @case ('tip') { 💡 } + @default { ℹ️ } + } +
      +
      +
      +}`, + styles: [`.callout { + display: flex; + align-items: flex-start; + padding: 1rem; + border-left: 5px solid; + border-radius: var(--adev-docs-border-radius); + margin-bottom: 1.5rem; + background-color: var(--adev-docs-surface); + box-shadow: var(--adev-docs-shadow); +} + +.callout-icon { + font-size: 1.5rem; + margin-right: 1rem; + line-height: 1; +} + +.callout-content { + flex-grow: 1; + color: var(--adev-docs-text); + line-height: 1.5; +} + +.callout-info { + border-color: var(--adev-docs-info); +} + +.callout-warning { + border-color: var(--adev-docs-warning); +} + +.callout-danger { + border-color: var(--adev-docs-danger); +} + +.callout-tip { + border-color: var(--adev-docs-success); /* Using success color for tips */ +} +`], +}) +export class CalloutComponent { + type = input(); + content = input(); + + get calloutClass(): string { + return `callout-${this.type() || 'info'}`; + } +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/code-snippet.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/code-snippet.component.ts new file mode 100644 index 0000000..282fc59 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/code-snippet.component.ts @@ -0,0 +1,78 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Highlight } from 'ngx-highlightjs'; +import { MatIconModule } from '@angular/material/icon'; +import { MatProgressBarModule } from '@angular/material/progress-bar'; + +@Component({ + selector: 'adev-code-snippet', + standalone: true, + imports: [CommonModule, Highlight, MatIconModule, MatProgressBarModule], + template: `@if (code() && language()) { +
      +
      + +
      +} @else { +
      + +
      +}`, + styles: [`.code-snippet-container { + position: relative; +} + +.copy-button { + position: absolute; + top: 0.5rem; + right: 0.5rem; + background-color: transparent; + border: none; + color: var(--adev-docs-text-secondary); + cursor: pointer; +} + +.copy-button:hover { + color: var(--adev-docs-text-primary); +} + +.code-snippet { + background-color: var(--adev-docs-code-background); + padding: 1em; + margin-bottom: 1.5rem; + overflow-x: auto; + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 0.9em; + line-height: 1.4; +} + +.code-snippet code { + color: var(--adev-docs-code-text); +} + +code { + border: var(--adev-docs-border-default); + border-radius: var(--adev-docs-border-radius-md); +} +`], +}) +export class CodeSnippetComponent { + code = input(); + language = input(); + + copyCode() { + if (this.code()) { + navigator.clipboard.writeText(this.code()!); + } + } +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/component-showcase.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/component-showcase.component.ts new file mode 100644 index 0000000..1c4d5bf --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/component-showcase.component.ts @@ -0,0 +1,165 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +// Import all the components to be showcased +import { LearnMoreButtonComponent } from './learn-more-button.component'; +import { SectionTitleComponent } from './section-title.component'; +import { SubsectionTitleComponent } from './subsection-title.component'; +import { ConceptExplanationComponent } from './concept-explanation.component'; +import { ApiReferenceComponent } from './api-reference.component'; +import { CodeSnippetComponent } from './code-snippet.component'; +import { FullCodeExampleComponent } from './full-code-example.component'; +import { CalloutComponent } from './callout.component'; +import { TopicCardComponent } from './topic-card.component'; + +@Component({ + selector: 'app-adev-docs-component-showcase', + standalone: true, + imports: [ + CommonModule, + LearnMoreButtonComponent, + SectionTitleComponent, + SubsectionTitleComponent, + ConceptExplanationComponent, + ApiReferenceComponent, + CodeSnippetComponent, + FullCodeExampleComponent, + CalloutComponent, + TopicCardComponent, + ], + template: ` +
      +

      Component Showcase: adev-docs

      + +
      +

      LearnMoreButtonComponent

      + +
      + +
      +

      SectionTitleComponent

      + +
      + +
      +

      SubsectionTitleComponent

      + +
      + +
      +

      ConceptExplanationComponent

      + +
      + +
      +

      ApiReferenceComponent

      + +
      + +
      +

      CodeSnippetComponent

      + +
      + +
      +

      FullCodeExampleComponent

      + +
      + +
      +

      CalloutComponent

      +
      + + + + +
      +
      + +
      +

      TopicCardComponent

      + +
      +
      + `, + styles: [ + ` + .showcase-container { + padding: 2rem; + background-color: var(--adev-docs-background); + color: var(--adev-docs-text-primary); + } + h1 { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 2rem; + border-bottom: 2px solid var(--adev-docs-border); + padding-bottom: 1rem; + } + h2 { + font-size: 1.5rem; + font-weight: 600; + margin-bottom: 1rem; + color: var(--adev-docs-primary); + } + .component-wrapper { + margin-bottom: 3rem; + padding: 1.5rem; + border: 1px solid var(--adev-docs-border); + border-radius: var(--adev-docs-border-radius-lg); + background-color: var(--adev-docs-surface); + } + .callout-grid { + display: grid; + gap: 1rem; + } + `] +}) +export class AdevDocsComponentShowcaseComponent { + conceptExplanationContent = + ` +

      This is a paragraph explaining a core concept in Angular. It can contain strong text, emphasized text, and even inline code.

      +
        +
      • List item 1
      • +
      • List item 2
      • +
      + +`; + + apiItem = { + name: 'Component', + typeSignature: 'Decorator', + description: 'A decorator that marks a class as an Angular component and provides configuration metadata that determines how the component should be processed, instantiated, and used at runtime.', + parameters: [ + { name: 'selector', type: 'string', description: 'The CSS selector that identifies this directive in a template.' }, + { name: 'templateUrl', type: 'string', description: 'The URL of a template file for an Angular component.' } + ] + }; + + codeSnippet = + ` + import { Component } from '@angular/core'; + + @Component({ + selector: 'app-root', + template: '

      Hello, Angular!

      ' + }) + export class AppComponent {} + +`; + + fullCodeExample = { + title: 'Standalone Component Example', + description: 'This example shows a basic standalone component in Angular.', + code: this.codeSnippet, + language: 'typescript' + }; +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/concept-explanation.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/concept-explanation.component.ts new file mode 100644 index 0000000..a59826f --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/concept-explanation.component.ts @@ -0,0 +1,82 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input, ViewEncapsulation } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MarkdownComponent } from 'ngx-markdown'; + +@Component({ + selector: 'adev-concept-explanation', + standalone: true, + imports: [CommonModule, MarkdownComponent], + template: `@if (content()) { + +}`, + styles: [`.concept-explanation { + color: var(--adev-docs-text); + line-height: 1.6; + margin-bottom: 1rem; +} + +.concept-explanation :is(h1, h2, h3, h4, h5, h6) { + color: var(--adev-docs-text); + margin-top: 1.5rem; + margin-bottom: 0.8rem; + font-weight: 600; +} + +.concept-explanation h1 { font-size: 2em; } +.concept-explanation h2 { font-size: 1.75em; } +.concept-explanation h3 { font-size: 1.5em; } +.concept-explanation h4 { font-size: 1.25em; } +.concept-explanation h5 { font-size: 1.1em; } +.concept-explanation h6 { font-size: 1em; } + +.concept-explanation p { + margin-bottom: 1em; +} + + + +.concept-explanation a { + color: var(--adev-docs-primary); + text-decoration: none; +} + +.concept-explanation a:hover { + text-decoration: underline; +} + +.concept-explanation code { + background-color: var(--adev-docs-code-background); + color: var(--adev-docs-code-text); + padding: 0.2em 0.4em; + border-radius: var(--adev-docs-border-radius); + font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 0.9em; +} + +.concept-explanation pre { + background-color: var(--adev-docs-code-background); + color: var(--adev-docs-code-text); + padding: 1em; + border-radius: var(--adev-docs-border-radius); + overflow-x: auto; + margin-bottom: 1em; +} + +.concept-explanation pre code { + padding: 0; + font-size: 1em; +} +`], + encapsulation: ViewEncapsulation.None, +}) +export class ConceptExplanationComponent { + content = input(); +} \ No newline at end of file diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/full-code-example.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/full-code-example.component.ts new file mode 100644 index 0000000..501d584 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/full-code-example.component.ts @@ -0,0 +1,66 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { CodeSnippetComponent } from './code-snippet.component'; // Re-use the code snippet styling +import { FormatInlineCodePipe } from '../../../pipes/format-inline-code.pipe'; + +interface FullCodeExample { + title: string; + description: string; + code: string; + language: string; +} + +@Component({ + selector: 'adev-full-code-example', + standalone: true, + imports: [CommonModule, CodeSnippetComponent, FormatInlineCodePipe], + template: `@if (example(); as ex) { +
      + @if (ex.title) { +

      + } + @if (ex.description) { +

      + } + +
      +}`, + styles: [`.full-code-example-card { + position: relative; + background-color: var(--adev-docs-surface); + border: 1px solid var(--adev-docs-border); + border-radius: var(--adev-docs-border-radius); + padding: 1.5rem; + margin-bottom: 1.5rem; + box-shadow: var(--adev-docs-shadow); + color: var(--adev-docs-text); +} + +.example-title { + font-size: 1.6rem; + font-weight: 700; + color: var(--adev-docs-primary); + margin-bottom: 0.8rem; +} + +.example-description { + font-size: 1rem; + line-height: 1.5; + margin-bottom: 1.2rem; + color: var(--adev-docs-text-secondary); +} + +/* CodeSnippetComponent styles are inherited/used via the component itself */ +`], +}) +export class FullCodeExampleComponent { + example = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/learn-more-button.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/learn-more-button.component.ts new file mode 100644 index 0000000..4b01a78 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/learn-more-button.component.ts @@ -0,0 +1,51 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core'; +import { ChatService } from '../../../chat/chat.service'; +import { FormatInlineCodePipe } from '../../../pipes/format-inline-code.pipe'; + +@Component({ + selector: 'app-learn-more-button', + imports: [FormatInlineCodePipe], + standalone: true, + template: ` + @if (buttonText() && topic()) { + + } + `, + styles: [` + button { + background-color: var(--adev-docs-primary); + color: white; + border: none; + padding: var(--adev-docs-spacing-2) var(--adev-docs-spacing-3); + border-radius: var(--adev-docs-border-radius-md); + font-weight: var(--adev-docs-font-weight-medium); + cursor: pointer; + transition: background-color 0.2s ease-in-out; + } + + button:hover { + background-color: var(--adev-docs-primary-dark); + } + `], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LearnMoreButtonComponent { + private chatService = inject(ChatService); + + buttonText = input(); + topic = input(); + + learnMore() { + if (this.topic()) { + this.chatService.addUserPrompt(`Teach me more about ${this.topic()}`); + } + } +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/section-title.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/section-title.component.ts new file mode 100644 index 0000000..988be32 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/section-title.component.ts @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormatInlineCodePipe } from '../../../pipes/format-inline-code.pipe'; + +@Component({ + selector: 'adev-section-title', + standalone: true, + imports: [CommonModule, FormatInlineCodePipe], + template: `@if (title()) { +

      +}`, + styles: [`.section-title { + font-size: 2.5rem; + font-weight: 700; + color: var(--adev-docs-text); + margin-top: 2.5rem; + margin-bottom: 1.5rem; + padding-bottom: 0.5rem; + border-bottom: 1px solid var(--adev-docs-border); +} +`], +}) +export class SectionTitleComponent { + title = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/subsection-title.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/subsection-title.component.ts new file mode 100644 index 0000000..1c032d1 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/subsection-title.component.ts @@ -0,0 +1,33 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormatInlineCodePipe } from '../../../pipes/format-inline-code.pipe'; + +@Component({ + selector: 'adev-subsection-title', + standalone: true, + imports: [CommonModule, FormatInlineCodePipe], + template: `@if (title()) { +

      +}`, + styles: [`.subsection-title { + font-size: 1.8rem; + font-weight: 600; + color: var(--adev-docs-text); + margin-top: 2rem; + margin-bottom: 1rem; + padding-bottom: 0.3rem; + border-bottom: 1px dashed var(--adev-docs-border); +} +`], +}) +export class SubsectionTitleComponent { + title = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/components/topic-card.component.ts b/dynamic-sdui-app/src/app/apps/adev-docs/components/topic-card.component.ts new file mode 100644 index 0000000..31b73b2 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/components/topic-card.component.ts @@ -0,0 +1,63 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, inject, input, ChangeDetectionStrategy } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ChatService } from '../../../chat/chat.service'; +import { FormatInlineCodePipe } from '../../../pipes/format-inline-code.pipe'; + +@Component({ + selector: 'app-topic-card', + standalone: true, + imports: [CommonModule, FormatInlineCodePipe], + template: `
      + @if (topic()) { +

      + } + @if (description()) { +

      + } +
      `, + styles: [`.topic-card { + background-color: var(--surface-container-low); + border-radius: var(--border-radius-m); + padding: var(--spacing-4); + cursor: pointer; + transition: background-color 0.3s; +} + +.topic-card:hover { + background-color: var(--surface-container); +} + +h3 { + color: var(--primary); + font-size: var(--text-lg); + font-weight: var(--font-weight-semibold); + margin-bottom: var(--spacing-2); +} + +p { + color: var(--text-secondary); + font-size: var(--text-base); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TopicCardComponent { + topic = input(); + description = input(); + + private chatService = inject(ChatService); + + updatePrompt() { + if (this.topic()) { + this.chatService.addUserPrompt(`teach me about ${this.topic()}`); + } + } +} \ No newline at end of file diff --git a/dynamic-sdui-app/src/app/apps/adev-docs/data-store.ts b/dynamic-sdui-app/src/app/apps/adev-docs/data-store.ts new file mode 100644 index 0000000..7503588 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/adev-docs/data-store.ts @@ -0,0 +1,450 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +export const DATA = ` +## **Angular Framework Knowledge Base** + +### **1\. Introduction to Angular** + +Angular is a component-based web framework for building fast, reliable, and scalable applications. Maintained by Google, it provides a comprehensive suite of tools, APIs, and libraries for development. + +--- + +### **2\. Getting Started Locally** + +#### **Prerequisites** + +* **Node.js**: v20.11.1 or newer. +* **Text Editor**: Visual Studio Code is recommended. +* **Terminal**: For running Angular CLI commands. +* **Development Tool**: [Angular Language Service](https://angular.dev/tools/language-service) for VS Code. + +#### **Install Angular CLI** + +Open a terminal and run the global install command: + +Bash + +\`\`\` + +# Using npm +npm install -g @angular/cli + +\`\`\` + +#### **Create a New Project** + +Run ng new with your desired project name. This will create a new project with modern defaults, including **standalone components by default**. + +Bash + +\`\`\` + +ng new my-first-angular-app + +\`\`\` + +#### **Run Your New Project** + +Navigate into your new project directory and start the development server: + +Bash + +\`\`\` + +cd my-first-angular-app +npm start + +\`\`\` + +The application will be available at http://localhost:4200/. + +--- + +### **3\. Core Best Practices** + +These are high-level rules to follow for modern Angular development. + +#### **Angular Best Practices** + +* **Always use standalone components.** NgModules are no longer recommended for new applications. +* You **must NOT** set standalone: true in @Component or @Directive decorators. This has been the default in Angular since v17 and is unnecessary. +* **Use signals** for all state management, both local and global. +* **Implement lazy loading** for all feature routes to improve initial load times. +* **Do NOT** use the @HostBinding and @HostListener decorators. Instead, put host bindings directly inside the host object of the @Component or @Directive decorator for better type safety and organization. +* **Use NgOptimizedImage** for all static images to automatically apply performance best practices (e.g., lazy loading, priority, srcset). + * Note: NgOptimizedImage does not work for inline base64 (data:image/...) images. + +#### **TypeScript Best Practices** + +* **Use strict type checking** ("strict": true in tsconfig.json) to catch errors at compile time. +* **Prefer type inference** when the type is obvious (e.g., const name \= 'Alice'; is better than const name: string \= 'Alice';). +* **Avoid the any type** at all costs. If a type is truly unknown, use the unknown type and perform type-checking to narrow it down. + +--- + +### **4\. Accessibility (a11y) Requirements** + +Accessibility is a non-negotiable requirement for modern applications. + +* Your application **MUST pass all AXE checks**. +* It **MUST follow all WCAG AA minimums**, which include (but are not limited to): + * **Keyboard Navigation**: All interactive elements must be reachable and operable using only the keyboard. + * **Focus Management**: Focus must be logical, visible, and properly managed, especially in dynamic components like modals or menus. + * **Color Contrast**: Text and UI elements must meet minimum color contrast ratios. + * **ARIA Attributes**: Use appropriate ARIA roles, states, and properties to provide semantic meaning to screen readers when native HTML elements are insufficient. + +--- + +### **5\. Coding Style & Project Structure** + +#### **Naming Conventions** + +* **File Names**: Separate words with hyphens (\-). (e.g., user-profile.ts). +* **Test Files**: Use the same name as the file being tested, but with a .spec.ts suffix. (e.g., user-profile.spec.ts). +* **Component Files**: A component's TypeScript, template, and style files should share the same name. + * user-profile.ts + * user-profile.html + * user-profile.css + +#### **Project Structure** + +* **src Directory**: All Angular UI code (TypeScript, HTML, styles) lives inside the src directory. +* **main.ts**: The application bootstrap code should be in main.ts directly inside src. +* **Feature Areas**: Organize your project into subdirectories based on features, not code types. + * **PREFER**: src/show-times/film-details/ + * **AVOID**: src/components/, src/services/ +* **Co-location**: Group closely related files (like component, template, style, and tests) in the same directory. + +--- + +### **6\. Components In-Depth** + +A component is a TypeScript class with an @Component decorator that controls a view. + +#### **Key Component Guidelines** + +* **Keep components small** and focused on a single responsibility. +* **Set changeDetection: ChangeDetectionStrategy.OnPush** in the @Component decorator. This is the modern default and improves performance by only re-rendering the component when its inputs change or an event it dispatches occurs. +* **Prefer Reactive Forms** over Template-driven forms for any complex form logic. +* **Prefer inline templates and styles** for small components (e.g., under 10 lines). +* When using external files, **use paths relative to the component** TS file (e.g., ./user-profile.html). + +#### **@Component Decorator Example** + +TypeScript + +\`\`\` + +@Component({ + selector: 'app-user-profile', // Use as + standalone: true, // This is true by default, but shown for clarity + imports: [NgIf, NgOptimizedImage], // Import dependencies + template: \` + @if (user()) { +

      {{ user().name }}

      + + } + \`, + styles: ['h2 { color: blue; }'], + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '(click)': 'onClick()', + '[class.active]': 'isActive()' + } +}) +export class UserProfileComponent { + user = input.required(); + isActive = signal(false); + + onClick() { + // ... + } +} + +\`\`\` + +--- + +### **7\. Data Binding (Inputs & Outputs)** + +* **Always use the input() and output() functions** instead of the @Input() and @Output() decorators. They are more type-safe and signal-based. + +#### **Inputs (Signal-based)** + +Use the input() function to define an input. + +TypeScript + +\`\`\` + +@Component({ ... }) +export class UserProfile { + // Simple input + readonly userId = input(); + + // Required input (causes build error if not provided) + readonly user = input.required(); + + // Input with a default value + readonly isAdmin = input(false); + + // Input with a transform + readonly disabled = input(false, { + transform: booleanAttribute // Coerces 'disabled' string to boolean + }); + + // Input with an alias + readonly profileUser = input({ alias: 'user' }); +} + +\`\`\` + +#### **Outputs** + +Use the output() function to create an event emitter. + +TypeScript + +\`\`\` + +@Component({ ... }) +export class UserProfileActions { + // Emits a User object when the save button is clicked + readonly save = output(); + + // Emits no value, just a signal + readonly close = output(); + + // Method to emit the event + onSaveClick(userToSave: User) { + this.save.emit(userToSave); + } +} + +\`\`\` + +--- + +### **8\. Template Syntax & Best Practices** + +#### **Key Template Guidelines** + +* **Keep templates simple** and avoid complex logic. Move logic into the component class, preferably using computed() signals. +* **Use native control flow (@if, @for, @switch)** instead of the old \*ngIf, \*ngFor, and \*ngSwitch structural directives. +* **Use the async pipe** (| async) to handle (i.e., subscribe and unsubscribe from) observables in the template. +* **Do NOT use ngClass or ngStyle**. Use native \[class\] and \[style\] bindings. + * **Good**: \
      + * **Bad**: \
      +* **Do NOT assume globals** like new Date() or Math.random() are available. Pass these values in from your component. +* **Do NOT write arrow functions** in templates (they are not supported). +* **Do NOT write Regular Expressions** in templates (they are not supported). + +#### **Template Syntax: @let Declarations** + +Use @let to declare a local, read-only variable in a template. Its value is derived from a template expression and is automatically kept in sync. + +HTML + +\`\`\` + +@let user = user$ | async; + +@if (user) { +

      Hello, {{ user.name }}

      +} + +\`\`\` + +--- + +### **9\. State Management with Signals** + +* **Use signals (signal())** for all local component state. +* **Use computed()** for derived state. This is highly optimized and memoized. +* **Keep state transformations pure** and predictable. +* **Do NOT use mutate** on signals. Prefer update (for immutable updates) or set (to replace the value). + * **Good**: mySignal.update(currentValue \=\> currentValue \+ 1); + * **Good**: mySignal.set(newValue); + * **Bad**: mySignal.mutate(currentValue \=\> currentValue.push(newItem)); + +TypeScript + +\`\`\` + +@Component({ ... }) +export class CounterComponent { + // 1. Use signal() for state + readonly count = signal(0); + + // 2. Use computed() for derived state + readonly doubleCount = computed(() => this.count() * 2); + + // 3. Use update() for transformations + increment() { + this.count.update(c => c + 1); + } +} + +\`\`\` + +--- + +### **10\. Advanced State & Async Reactivity** + +#### **linkedSignal (Experimental)** + +linkedSignal creates a signal to hold state that is intrinsically **linked to other state**. It's useful when a signal's default value depends on *another* signal, and it needs to reset when that other signal changes. + +* **Key Difference from signal**: You pass a *computation function* (like computed), not a static default value. +* **Behavior**: When the computation's dependencies change, the linkedSignal's value is **reset** to the new result of the computation. However, it can still be manually .set() in the meantime. + +**Example:** Defaulting a selectedOption to the first item in a list of shippingOptions. + +TypeScript + +\`\`\` + +@Component({/* ... */}) +export class ShippingMethodPicker { + shippingOptions: Signal = getShippingOptions(); + + // Initialize selectedOption to the first shipping option. + // If shippingOptions changes, selectedOption will reset to the new first option. + selectedOption = linkedSignal(() => this.shippingOptions()[0]); + + changeShipping(index: number) { + // The user can still change the value manually + this.selectedOption.set(this.shippingOptions()[index]); + } +} + +\`\`\` + +**How it works:** + +TypeScript + +\`\`\` + +const shippingOptions = signal(['Ground', 'Air', 'Sea']); +const selectedOption = linkedSignal(() => shippingOptions()[0]); + +console.log(selectedOption()); // 'Ground' + +selectedOption.set(shippingOptions()[2]); +console.log(selectedOption()); // 'Sea' + +// The dependency (shippingOptions) changes +shippingOptions.set(['Email', 'Will Call', 'Postal service']); + +// The linkedSignal resets to the new computed value +console.log(selectedOption()); // 'Email' + +\`\`\` + +#### **resource (Experimental)** + +A resource is a signal-based API for incorporating **async data** (like an HTTP request) into your application. It provides a value signal that contains the result of the async operation. + +The resource function takes two main properties: + +1. **params**: A reactive computation (like computed) that produces a parameter value. Whenever signals read in this computation change, it produces a new parameter. +2. **loader**: An async function that runs every time the params computation produces a new value. This is where you perform your data fetching. + +TypeScript + +\`\`\` + +import { resource, Signal } from '@angular/core'; + +@Component({ ... }) +export class UserProfile { + userId = signal('user-1'); // The reactive parameter + + userResource = resource({ + // 1. Define the reactive parameters + // This will re-run whenever userId() changes + params: () => ({ id: this.userId() }), + + // 2. Define the async loader + // This will re-run every time 'params' emits a new value + loader: async ({ params, abortSignal }) => { + // 'abortSignal' is provided to cancel the request + // if the params change again before this one finishes. + const res = await fetch(\`api/users/\${params.id}\`, { signal: abortSignal }); + return res.json(); + }, + }); + + // 3. You can use the resource's value directly in computed signals + firstName = computed(() => this.userResource.value()?.firstName); + + // Example method to trigger a reload + loadNextUser() { + this.userId.set('user-2'); // This will cause the resource to re-fetch + } +} + +\`\`\` + +Resource Loader Details: + +The loader function receives a ResourceLoaderParams object with three properties: + +* **params**: The value from the params computation. +* **previous**: An object containing the previous ResourceStatus. +* **abortSignal**: An [AbortSignal](https://www.google.com/search?q=%5Bhttps://developer.mozilla.org/en-US/docs/Web/API/AbortSignal%5D\(https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal\)) that is triggered if the params change before the current loader finishes, allowing you to cancel the outstanding request.1 + +--- + +### **11\. Services and Dependency Injection (DI)2** + +Services are classes used for logic or data that needs to be shared across components (e.g., data fetching, logging).3 + +#### **Key Service Guidelines4** + +* **Design services around a single responsibility** (e.g., AuthService, AnalyticsService). +* **Use the providedIn: 'root'** option in @Injectable to create a singleton service available application-wide. +* **Always use the inject() function** instead of constructor injection. It's cleaner and works in more contexts. + +#### **Creating & Injecting a Service** + +TypeScript + +\`\`\` + +// 1. Create the service +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root', // Creates a singleton service +}) +export class HeroService { + getHeroes() { + // ... logic to fetch heroes + } +} + +// 2. Inject the service in a component +import { Component, inject } from '@angular/core'; +import { HeroService } from './heroes/hero.service'; + +@Component({ ... }) +export class HeroListComponent { + + // Use 'inject()' to get the service instance + private heroService = inject(HeroService); + + constructor() { + const heroes = this.heroService.getHeroes(); + console.log(heroes); + } +} + +\`\`\` +`; \ No newline at end of file diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/app-context.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/app-context.ts new file mode 100644 index 0000000..4c718fb --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/app-context.ts @@ -0,0 +1,286 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Type } from '@angular/core'; +import { AppContext, ComponentContext } from '../../magic-ai/app-context'; +import { BookCoverCardComponent } from './components/book-cover-card.component'; +import { BookDetailHeroComponent } from './components/book-detail-hero.component'; +import { AuthorBioCardComponent } from './components/author-bio-card.component'; +import { ReviewSummaryComponent } from './components/review-summary.component'; +import { FullReviewCardComponent } from './components/full-review-card.component'; +import { GenreTagCloudComponent } from './components/genre-tag-cloud.component'; +import { BookSpecificationsComponent } from './components/book-specifications.component'; +import { AwardBadgeComponent } from './components/award-badge.component'; +import { BestsellerRibbonComponent } from './components/bestseller-ribbon.component'; +import { SeriesInfoCardComponent } from './components/series-info-card.component'; +import { BookDescriptionPanelComponent } from './components/book-description-panel.component'; +import { StockAvailabilityComponent } from './components/stock-availability.component'; +import { RelatedBooksCarouselComponent } from './components/related-books-carousel.component'; + +const GENERATED_COMPONENT_CONTEXT_DATA: ComponentContext[] = [ + { + name: 'BookCoverCardComponent', + description: "Displays a book's cover, title, author, and price in a compact card format. Ideal for lists and search results.", + type: 'dynamicComponent', + inputs: { + book: { type: 'Book', description: "The book object to display.", required: true }, + }, + }, + { + name: 'BookDetailHeroComponent', + description: "Presents the main details of a book in a prominent hero section.", + type: 'dynamicComponent', + inputs: { + book: { type: 'Book', description: "The book object to display in detail.", required: true }, + }, + }, + { + name: 'AuthorBioCardComponent', + description: "Displays an author's name, image, and a brief biography.", + type: 'dynamicComponent', + inputs: { + author: { type: 'Author', description: "The author object to display.", required: true }, + }, + }, + { + name: 'ReviewSummaryComponent', + description: "Shows the average star rating and the total number of reviews for a book.", + type: 'dynamicComponent', + inputs: { + averageRating: { type: 'number', description: "The average rating of the book (1-5).", required: true }, + reviewCount: { type: 'number', description: "The total number of reviews.", required: true }, + }, + }, + { + name: 'FullReviewCardComponent', + description: "Displays a single, detailed customer review for a book.", + type: 'dynamicComponent', + inputs: { + review: { type: 'Review', description: "The review object to display.", required: true }, + }, + }, + { + name: 'GenreTagCloudComponent', + description: "Displays a collection of genres and tags associated with a book as interactive, visually distinct chips.", + type: 'dynamicComponent', + inputs: { + genres: { type: 'string[]', description: "An array of genre strings.", required: false }, + tags: { type: 'string[]', description: "An array of tag strings.", required: false }, + }, + }, + { + name: 'BookSpecificationsComponent', + description: "Presents detailed physical and publication specifications of a book.", + type: 'dynamicComponent', + inputs: { + book: { type: 'Book', description: "The book object containing specifications.", required: true }, + }, + }, + { + name: 'AwardBadgeComponent', + description: "Displays a single award received by a book.", + type: 'dynamicComponent', + inputs: { + award: { type: 'Award', description: "The award object to display.", required: true }, + }, + }, + { + name: 'BestsellerRibbonComponent', + description: "Visually indicates a book's bestseller rank.", + type: 'dynamicComponent', + inputs: { + rank: { type: 'number', description: "The bestseller rank of the book.", required: true }, + }, + }, + { + name: 'SeriesInfoCardComponent', + description: "Displays information about the book's series.", + type: 'dynamicComponent', + inputs: { + series: { type: '{ name: string; number: number; }', description: "An object containing the series name and book number.", required: true }, + }, + }, + { + name: 'BookDescriptionPanelComponent', + description: "Displays the full description of a book, with an option to expand/collapse for longer texts.", + type: 'dynamicComponent', + inputs: { + description: { type: 'string', description: "The full description of the book.", required: true }, + }, + }, + { + name: 'StockAvailabilityComponent', + description: "Displays the current stock status of a book and provides an \"Add to Cart\" button.", + type: 'dynamicComponent', + inputs: { + stock: { type: 'number', description: "The current stock quantity of the book.", required: true }, + price: { type: 'number', description: "The regular price of the book.", required: true }, + salePrice: { type: 'number', description: "Optional sale price of the book.", required: false }, + }, + }, + { + name: 'RelatedBooksCarouselComponent', + description: "Displays a horizontal, scrollable carousel of related book cards.", + type: 'dynamicComponent', + inputs: { + books: { type: 'Book[]', description: "An array of related book objects to display.", required: true }, + }, + }, +]; + +const GENERATED_COMPONENT_MAP: { [key: string]: Type } = { + BookCoverCardComponent: BookCoverCardComponent, + BookDetailHeroComponent: BookDetailHeroComponent, + AuthorBioCardComponent: AuthorBioCardComponent, + ReviewSummaryComponent: ReviewSummaryComponent, + FullReviewCardComponent: FullReviewCardComponent, + GenreTagCloudComponent: GenreTagCloudComponent, + BookSpecificationsComponent: BookSpecificationsComponent, + AwardBadgeComponent: AwardBadgeComponent, + BestsellerRibbonComponent: BestsellerRibbonComponent, + SeriesInfoCardComponent: SeriesInfoCardComponent, + BookDescriptionPanelComponent: BookDescriptionPanelComponent, + StockAvailabilityComponent: StockAvailabilityComponent, + RelatedBooksCarouselComponent: RelatedBooksCarouselComponent, +}; + +const GENERATED_APP_DESCRIPTION = ` +You are building a UI for a Magic Bookstore application. Your primary goal is to create a seamless and user-friendly experience for discovering, learning about, and purchasing books. + +### 1. Domain-Specific Mapping Rules: + +* When displaying a book in a list or search result, you must use the +BookCoverCardComponent +. +* When displaying detailed information about a single book, you must use the +BookDetailHeroComponent + at the top of the page, followed by +BookDescriptionPanelComponent +, +BookSpecificationsComponent +, +AuthorBioCardComponent + (for each author), +ReviewSummaryComponent +, and +FullReviewCardComponent + (for each review). +* When displaying a list of authors, use +AuthorBioCardComponent + for each author. +* When displaying genres or tags, use the +GenreTagCloudComponent +. +* When a book has an +averageRating + and +reviews +, use +ReviewSummaryComponent + and +FullReviewCardComponent + for individual reviews. +* When a book has +awards +, use +AwardBadgeComponent + for each award. +* When a book has a +bestsellerRank +, use +BestsellerRibbonComponent +. +* When a book is part of a +series +, use +SeriesInfoCardComponent +. +* When displaying stock information and purchase options, use +StockAvailabilityComponent +. +* When suggesting other books, use +RelatedBooksCarouselComponent +. + +### 2. Layout Compositions: + +* **DefaultBookLayout**: For a book detail page, render a vertical stack starting with +BookDetailHeroComponent +, followed by +BookDescriptionPanelComponent +, +BookSpecificationsComponent +, a section for authors (each +AuthorBioCardComponent +), a section for reviews (first +ReviewSummaryComponent +, then a list of +FullReviewCardComponent +'s), and finally +RelatedBooksCarouselComponent +. +* **BookListLayout**: For displaying multiple books (e.g., search results, genre lists), render a responsive grid of +BookCoverCardComponent +'s. +* **AuthorProfileLayout**: For an author's dedicated profile page, render +AuthorBioCardComponent + at the top, followed by a list of +BookCoverCardComponent +'s for their works. +`; + +const LOADING_TEXT: string[] = [ + "Summoning ancient texts...", + "Brewing a potion of prose...", + "Consulting the Oracle of Pages...", + "Polishing the crystal ball of chapters...", + "Whispering to the library spirits...", + "Unfurling the scroll of destiny...", + "Aligning the literary constellations...", + "Stirring the cauldron of narratives...", + "Decoding forgotten manuscripts...", + "Conjuring captivating chronicles...", + "Weaving tales from stardust...", + "Illuminating the path to your next read...", + "Gathering wisdom from the elder scrolls...", + "Infusing magic into every word...", + "Preparing your personalized literary journey...", + "Opening the portal to new worlds...", + "Arranging the symphony of stories...", + "Channeling the muse of masterpieces...", + "Crafting your bespoke bibliography...", + "Invoking the spirits of great authors...", + "Shaping narratives from the ether...", + "Unlocking the secrets of the written word...", + "Manifesting your literary desires...", + "Drawing inspiration from the cosmic library...", + "Setting the stage for your reading adventure...", + "Igniting the spark of imagination...", + "Composing a concerto of content...", + "Curating your next unforgettable experience...", + "Bending reality to bring you books...", + "Enchanting your reading list...", + "Preparing a feast for your mind...", + "Assembling the perfect collection...", + "Bringing stories to life...", + "Where every page is a new discovery...", + "The magic of reading, reimagined...", + "Your literary journey starts here...", + "Dive into a world of words...", + "Explore endless stories...", + "The future of reading is now...", +]; + +export const GENERATED_APP_CONTEXT: AppContext = { + appName: 'Magic Bookstore', + theme: 'magic-bookstore', + welcomeText: 'Welcome to Magic Bookstore! Your next great read is just a spellbinding search away.', + placeholders: LOADING_TEXT, + appDescription: GENERATED_APP_DESCRIPTION, + componentMap: GENERATED_COMPONENT_MAP, + componentContextData: GENERATED_COMPONENT_CONTEXT_DATA +}; diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/author-bio-card.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/author-bio-card.component.ts new file mode 100644 index 0000000..b7eb4d5 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/author-bio-card.component.ts @@ -0,0 +1,90 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { Author } from '../data-store'; + +@Component({ + selector: 'app-author-bio-card', + standalone: true, + imports: [CommonModule, MatProgressSpinnerModule], + template: `@if (author(); as author) { +
      +
      + @if (author.imageUrl) { + Photo of {{ author.name }} + } @else { + + } +
      +
      +

      {{ author.name }}

      +

      {{ author.bio }}

      +
      +
      +}`, + styles: [`.author-card { + display: flex; + align-items: flex-start; + gap: var(--spacing-4); + padding: var(--spacing-4); + background-color: var(--surface); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + border: var(--border-default); +} + +.author-image-container { + flex-shrink: 0; + width: 100px; + height: 100px; + border-radius: 50%; + overflow: hidden; + background-color: var(--background); + display: flex; + justify-content: center; + align-items: center; + box-shadow: var(--shadow-subtle); +} + +.author-image { + width: 100%; + height: 100%; + object-fit: cover; +} + +mat-spinner { + --mdc-circular-progress-active-indicator-color: var(--primary); +} + +.author-info { + flex-grow: 1; +} + +.author-name { + font-size: var(--text-xl); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin-bottom: var(--spacing-2); +} + +.author-bio { + font-size: var(--text-base); + color: var(--text-secondary); + line-height: var(--line-height-body); + max-height: 150px; /* Limit height for scrollable bio */ + overflow-y: auto; + padding-right: var(--spacing-1); /* For scrollbar */ +} +`], +}) +export class AuthorBioCardComponent { + author = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/award-badge.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/award-badge.component.ts new file mode 100644 index 0000000..a4cab9d --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/award-badge.component.ts @@ -0,0 +1,65 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { Award } from '../data-store'; + +@Component({ + selector: 'app-award-badge', + standalone: true, + imports: [CommonModule, MatIconModule], + template: `@if (award(); as award) { +
      + emoji_events +
      + {{ award.name }} + {{ award.year }} - {{ award.organization }} +
      +
      +}`, + styles: [`.award-badge { + display: inline-flex; + align-items: center; + gap: var(--spacing-2); + background-color: var(--accent-gold); + color: var(--surface); + padding: var(--spacing-2) var(--spacing-3); + border-radius: var(--border-radius-md); + font-size: var(--text-sm); + font-weight: var(--font-weight-medium); + box-shadow: var(--shadow-subtle); + white-space: nowrap; +} + +.award-icon { + font-size: var(--text-lg); + width: var(--text-lg); + height: var(--text-lg); +} + +.award-details { + display: flex; + flex-direction: column; + line-height: 1.2; +} + +.award-name { + font-weight: var(--font-weight-semibold); +} + +.award-year-org { + font-size: var(--text-xs); + opacity: 0.9; +} +`], +}) +export class AwardBadgeComponent { + award = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/bestseller-ribbon.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/bestseller-ribbon.component.ts new file mode 100644 index 0000000..0460e76 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/bestseller-ribbon.component.ts @@ -0,0 +1,38 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-bestseller-ribbon', + standalone: true, + imports: [CommonModule], + template: `@if (rank(); as rank) { +
      + Bestseller #{{ rank }} +
      +}`, + styles: [`.bestseller-ribbon { + position: absolute; + top: var(--spacing-2); + right: var(--spacing-2); + background-color: var(--accent-gold); + color: var(--surface); + padding: var(--spacing-1) var(--spacing-2); + border-radius: var(--border-radius-md); + font-size: var(--text-sm); + font-weight: var(--font-weight-semibold); + z-index: 10; + box-shadow: var(--shadow-subtle); +} +`], +}) +export class BestsellerRibbonComponent { + rank = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-cover-card.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-cover-card.component.ts new file mode 100644 index 0000000..8aeb08b --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-cover-card.component.ts @@ -0,0 +1,168 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, inject, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { Book } from '../data-store'; +import { ChatService } from '../../../chat/chat.service'; +import { RatingStarsComponent } from './rating-stars.component'; +import { BestsellerRibbonComponent } from './bestseller-ribbon.component'; + +@Component({ + selector: 'app-book-cover-card', + standalone: true, + imports: [CommonModule, MatProgressSpinnerModule, RatingStarsComponent, BestsellerRibbonComponent], + template: `@if (book(); as book) { +
      +
      + @if (book.coverImgUrl) { + Cover of {{ book.title }} + } @else { + + } + @if (book.bestsellerRank) { + + } +
      +
      +

      {{ book.title }}

      + @if (book.authors && book.authors.length > 0) { +

      {{ book.authors[0].name }}

      + } +
      + @if (book.averageRating) { + + } +
      + @if (book.salePrice) { + {{ book.price | currency:'USD':'symbol':'1.2-2' }} + {{ book.salePrice | currency:'USD':'symbol':'1.2-2' }} + } @else { + {{ book.price | currency:'USD':'symbol':'1.2-2' }} + } +
      +
      +
      +
      +}`, + styles: [`.book-card { + background-color: var(--surface); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + overflow: hidden; + display: flex; + flex-direction: column; + cursor: pointer; + transition: var(--transition-default); + border: var(--border-default); +} + +.book-card:hover { + box-shadow: var(--shadow-medium); + transform: translateY(-2px); +} + +.cover-container { + position: relative; + width: 100%; + padding-bottom: 150%; /* Aspect ratio for book covers */ + background-color: var(--background); + display: flex; + justify-content: center; + align-items: center; + overflow: hidden; + border-top-left-radius: var(--border-radius-md); + border-top-right-radius: var(--border-radius-md); +} + +.book-cover { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + border-top-left-radius: var(--border-radius-md); + border-top-right-radius: var(--border-radius-md); +} + +mat-spinner { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + --mdc-circular-progress-active-indicator-color: var(--primary); +} + +.book-info { + padding: var(--spacing-3); + display: flex; + flex-direction: column; + flex-grow: 1; +} + +.book-title { + font-size: var(--text-lg); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin-bottom: var(--spacing-1); + line-height: 1.3; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + text-overflow: ellipsis; +} + +.book-author { + font-size: var(--text-sm); + color: var(--text-secondary); + margin-bottom: var(--spacing-2); +} + +.rating-price-container { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: auto; /* Pushes to the bottom */ +} + +.price-container { + display: flex; + align-items: baseline; + gap: var(--spacing-1); +} + +.price { + font-size: var(--text-base); + font-weight: var(--font-weight-semibold); + color: var(--primary); +} + +.original-price { + font-size: var(--text-sm); + color: var(--text-muted); + text-decoration: line-through; +} + +.sale-price { + font-size: var(--text-lg); + font-weight: var(--font-weight-semibold); + color: var(--error); /* Use error color for sale price to make it stand out */ +} +`], +}) +export class BookCoverCardComponent { + chatService = inject(ChatService); + book = input(); + + viewDetails(bookTitle: string) { + this.chatService.addUserPrompt(`Tell me more about the book "${bookTitle}"`); + } +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-description-panel.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-description-panel.component.ts new file mode 100644 index 0000000..006517f --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-description-panel.component.ts @@ -0,0 +1,94 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input, signal } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-book-description-panel', + standalone: true, + imports: [CommonModule], + template: `@if (description(); as description) { +
      +

      Description

      +

      + {{ displayDescription }} +

      + @if (showToggle) { + + } +
      +}`, + styles: [`.description-panel { + background-color: var(--surface); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + padding: var(--spacing-5); + border: var(--border-default); +} + +.panel-title { + font-size: var(--text-xl); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin-bottom: var(--spacing-4); + border-bottom: var(--border-default); + padding-bottom: var(--spacing-2); +} + +.book-description { + font-size: var(--text-base); + color: var(--text-secondary); + line-height: var(--line-height-body); + margin-bottom: var(--spacing-3); +} + +.read-more-button { + background: none; + border: none; + color: var(--primary); + font-size: var(--text-base); + font-weight: var(--font-weight-medium); + cursor: pointer; + padding: 0; + transition: var(--transition-default); +} + +.read-more-button:hover { + color: var(--primary-dark); + text-decoration: underline; +} +`], +}) +export class BookDescriptionPanelComponent { + description = input(); + isExpanded = signal(false); + readonly maxLength = 300; // Characters before truncating + + toggleExpand() { + this.isExpanded.update(value => !value); + } + + get displayDescription(): string { + const desc = this.description(); + if (!desc) { + return ''; + } + if (this.isExpanded() || desc.length <= this.maxLength) { + return desc; + } + return desc.substring(0, this.maxLength) + '...'; + } + + get showToggle(): boolean { + const desc = this.description(); + return !!desc && desc.length > this.maxLength; + } +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-detail-hero.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-detail-hero.component.ts new file mode 100644 index 0000000..fe1741f --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-detail-hero.component.ts @@ -0,0 +1,200 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input, computed } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { Book } from '../data-store'; +import { RatingStarsComponent } from './rating-stars.component'; + +@Component({ + selector: 'app-book-detail-hero', + standalone: true, + imports: [CommonModule, MatProgressSpinnerModule, RatingStarsComponent], + template: `@if (book(); as book) { +
      +
      + @if (book.coverImgUrl) { + Cover of {{ book.title }} + } @else { + + } +
      +
      +

      {{ book.title }}

      + @if (book.subtitle) { +

      {{ book.subtitle }}

      + } + @if (authorNames()) { +

      by {{ authorNames() }}

      + } +
      + @if (book.averageRating) { + + } + @if (book.publisher) { + + Published by {{ book.publisher.name }} on {{ book.publicationDate | date:'longDate' }} + + } +
      +
      +
      + @if (book.salePrice) { + {{ book.price | currency:'USD':'symbol':'1.2-2' }} + {{ book.salePrice | currency:'USD':'symbol':'1.2-2' }} + } @else { + {{ book.price | currency:'USD':'symbol':'1.2-2' }} + } +
      + +
      +
      +
      +}`, + styles: [`.hero-section { + display: flex; + gap: var(--spacing-6); + padding: var(--spacing-6); + background-color: var(--surface); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + align-items: flex-start; + margin-bottom: var(--spacing-5); +} + +.cover-image-container { + flex-shrink: 0; + width: 300px; /* Fixed width for the cover */ + height: 450px; /* Aspect ratio for book covers */ + background-color: var(--background); + display: flex; + justify-content: center; + align-items: center; + border-radius: var(--border-radius-lg); + overflow: hidden; + box-shadow: var(--shadow-medium); +} + +.book-cover-hero { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: var(--border-radius-lg); +} + +mat-spinner { + --mdc-circular-progress-active-indicator-color: var(--primary); +} + +.details-container { + flex-grow: 1; + display: flex; + flex-direction: column; +} + +.book-title { + font-size: var(--text-xxl); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin-bottom: var(--spacing-2); + line-height: var(--line-height-heading); +} + +.book-subtitle { + font-size: var(--text-xl); + color: var(--text-secondary); + margin-bottom: var(--spacing-3); + line-height: var(--line-height-heading); +} + +.authors { + font-size: var(--text-lg); + color: var(--text-primary); + margin-bottom: var(--spacing-3); +} + +.rating-publisher-info { + display: flex; + align-items: center; + gap: var(--spacing-3); + margin-bottom: var(--spacing-4); + font-size: var(--text-sm); + color: var(--text-muted); +} + +.price-action-container { + display: flex; + align-items: center; + gap: var(--spacing-4); + margin-top: auto; /* Pushes to the bottom */ + padding-top: var(--spacing-4); + border-top: var(--border-default); +} + +.price-display { + display: flex; + align-items: baseline; + gap: var(--spacing-2); +} + +.price { + font-size: var(--text-xxl); + font-weight: var(--font-weight-semibold); + color: var(--primary); +} + +.original-price { + font-size: var(--text-lg); + color: var(--text-muted); + text-decoration: line-through; +} + +.sale-price { + font-size: var(--text-xxl); + font-weight: var(--font-weight-semibold); + color: var(--error); +} + +.add-to-cart-button { + background-color: var(--primary); + color: var(--surface); + padding: var(--spacing-3) var(--spacing-5); + border: none; + border-radius: var(--border-radius-md); + font-size: var(--text-lg); + font-weight: var(--font-weight-semibold); + cursor: pointer; + transition: var(--transition-default); + box-shadow: var(--shadow-subtle); +} + +.add-to-cart-button:hover { + background-color: var(--primary-dark); + box-shadow: var(--shadow-medium); +} + +.add-to-cart-button:active { + transform: translateY(1px); +} +`], +}) +export class BookDetailHeroComponent { + book = input(); + + authorNames = computed(() => { + const book = this.book(); + return (book?.authors && book.authors.length > 0) + ? book.authors.map(a => a.name).join(', ') + : ''; + }); + + addToCart() { + console.log('Add to cart clicked for:', this.book()?.title); + } +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-specifications.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-specifications.component.ts new file mode 100644 index 0000000..ae68d0a --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/book-specifications.component.ts @@ -0,0 +1,97 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Book } from '../data-store'; + +@Component({ + selector: 'app-book-specifications', + standalone: true, + imports: [CommonModule], + template: `@if (book(); as book) { +
      +

      Book Specifications

      +
      +
      + ISBN: + {{ book.isbn }} +
      +
      + Language: + {{ book.language }} +
      +
      + Format: + {{ book.format }} +
      +
      + Pages: + {{ book.pages }} +
      +
      + Dimensions: + @if (book.dimensions) { + {{ book.dimensions.height }}" H x {{ book.dimensions.width }}" W x {{ book.dimensions.depth }}" D + } +
      + @if (book.edition) { +
      + Edition: + {{ book.edition }} +
      + } +
      +
      +}`, + styles: [`.specifications-panel { + background-color: var(--surface); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + padding: var(--spacing-5); + border: var(--border-default); +} + +.panel-title { + font-size: var(--text-xl); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin-bottom: var(--spacing-4); + border-bottom: var(--border-default); + padding-bottom: var(--spacing-2); +} + +.spec-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: var(--spacing-3) var(--spacing-5); +} + +.spec-item { + display: flex; + flex-direction: column; +} + +.spec-label { + font-size: var(--text-sm); + color: var(--text-muted); + margin-bottom: var(--spacing-1); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.spec-value { + font-size: var(--text-base); + color: var(--text-secondary); + font-weight: var(--font-weight-medium); +} +`], +}) +export class BookSpecificationsComponent { + book = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/full-review-card.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/full-review-card.component.ts new file mode 100644 index 0000000..a58cc73 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/full-review-card.component.ts @@ -0,0 +1,67 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Review } from '../data-store'; +import { RatingStarsComponent } from './rating-stars.component'; + +@Component({ + selector: 'app-full-review-card', + standalone: true, + imports: [CommonModule, RatingStarsComponent], + template: `@if (review(); as review) { +
      +
      +

      {{ review.username }}

      + +
      +

      {{ review.comment }}

      +

      {{ review.timestamp | date:'medium' }}

      +
      +}`, + styles: [`.review-card { + background-color: var(--surface); + border-radius: var(--border-radius-md); + border: var(--border-default); + padding: var(--spacing-4); + margin-bottom: var(--spacing-3); + box-shadow: var(--shadow-subtle); +} + +.review-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: var(--spacing-2); +} + +.username { + font-size: var(--text-lg); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin: 0; +} + +.comment { + font-size: var(--text-base); + color: var(--text-secondary); + line-height: var(--line-height-body); + margin-bottom: var(--spacing-2); +} + +.timestamp { + font-size: var(--text-sm); + color: var(--text-muted); + text-align: right; +} +`], +}) +export class FullReviewCardComponent { + review = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/genre-tag-cloud.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/genre-tag-cloud.component.ts new file mode 100644 index 0000000..74b03f9 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/genre-tag-cloud.component.ts @@ -0,0 +1,81 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, inject, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ChatService } from '../../../chat/chat.service'; + +@Component({ + selector: 'app-genre-tag-cloud', + standalone: true, + imports: [CommonModule], + template: `
      + @if (genres() && genres()!.length > 0) { + @for (genre of genres(); track genre) { + + } + } + @if (tags() && tags()!.length > 0) { + @for (tag of tags(); track tag) { + + } + } +
      `, + styles: [`.tag-cloud-container { + display: flex; + flex-wrap: wrap; + gap: var(--spacing-2); + padding: var(--spacing-3); + background-color: var(--background); + border-radius: var(--border-radius-md); + border: var(--border-default); +} + +.tag-chip { + padding: var(--spacing-1) var(--spacing-3); + border-radius: var(--border-radius-md); + font-size: var(--text-sm); + font-weight: var(--font-weight-medium); + cursor: pointer; + transition: var(--transition-default); + border: none; + box-shadow: var(--shadow-subtle); +} + +.genre-chip { + background-color: var(--primary-light); + color: var(--primary-dark); +} + +.genre-chip:hover { + background-color: var(--primary); + color: var(--surface); + box-shadow: var(--shadow-medium); +} + +.tag-chip-secondary { + background-color: var(--border); + color: var(--text-secondary); +} + +.tag-chip-secondary:hover { + background-color: var(--text-muted); + color: var(--surface); + box-shadow: var(--shadow-medium); +} +`], +}) +export class GenreTagCloudComponent { + chatService = inject(ChatService); + genres = input(); + tags = input(); + + searchByTerm(term: string) { + this.chatService.addUserPrompt(`Show me books related to "${term}"`); + } +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/rating-stars.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/rating-stars.component.ts new file mode 100644 index 0000000..74bbeff --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/rating-stars.component.ts @@ -0,0 +1,59 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input, computed } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; // Assuming Material Icons are available + +@Component({ + selector: 'app-rating-stars', + standalone: true, + imports: [CommonModule, MatIconModule], + template: `
      + @for (star of [].constructor(maxStars); track $index) { + + {{ getStarIcon($index) }} + + } +
      `, + styles: [`.star-rating { + display: flex; + align-items: center; + color: var(--accent-gold); /* Gold color for stars */ +} + +.star-icon { + font-size: var(--text-lg); /* Adjust size as needed */ + width: var(--text-lg); + height: var(--text-lg); + color: var(--text-muted); /* Default for empty stars */ +} + +.star-icon.filled, .star-icon.half-filled { + color: var(--accent-gold); +} +`], +}) +export class RatingStarsComponent { + rating = input(); + maxStars = 5; + + fullStars = computed(() => Math.floor(this.rating() || 0)); + hasHalfStar = computed(() => (this.rating() || 0) % 1 >= 0.5); + emptyStars = computed(() => this.maxStars - this.fullStars() - (this.hasHalfStar() ? 1 : 0)); + + getStarIcon(starIndex: number): string { + if (starIndex < this.fullStars()) { + return 'star'; + } else if (starIndex === this.fullStars() && this.hasHalfStar()) { + return 'star_half'; + } else { + return 'star_border'; + } + } +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/related-books-carousel.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/related-books-carousel.component.ts new file mode 100644 index 0000000..c467afc --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/related-books-carousel.component.ts @@ -0,0 +1,131 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input, ElementRef, ViewChild } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { Book } from '../data-store'; +import { BookCoverCardComponent } from './book-cover-card.component'; + +@Component({ + selector: 'app-related-books-carousel', + standalone: true, + imports: [CommonModule, MatIconModule, BookCoverCardComponent], + template: `@if (books() && books()!.length > 0) { + +}`, + styles: [`.carousel-wrapper { + padding: var(--spacing-5); + background-color: var(--background); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + border: var(--border-default); +} + +.carousel-title { + font-size: var(--text-xl); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin-bottom: var(--spacing-4); + text-align: center; +} + +.carousel-content { + display: flex; + align-items: center; + position: relative; +} + +.carousel-container { + display: grid; + grid-auto-flow: column; /* Arrange items in a row */ + grid-auto-columns: 250px; /* Fixed width for each card */ + gap: var(--spacing-4); + overflow-x: scroll; + scroll-snap-type: x mandatory; + -webkit-overflow-scrolling: touch; /* For smooth scrolling on iOS */ + padding-bottom: var(--spacing-2); /* Space for scrollbar */ + scrollbar-width: none; /* Hide scrollbar for Firefox */ +} + +.carousel-container::-webkit-scrollbar { + display: none; /* Hide scrollbar for Chrome, Safari, Opera */ +} + +.carousel-container > * { + scroll-snap-align: start; + flex-shrink: 0; +} + +.nav-button { + background-color: var(--surface); + border: var(--border-default); + border-radius: 50%; + width: 40px; + height: 40px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + box-shadow: var(--shadow-subtle); + transition: var(--transition-default); + flex-shrink: 0; + z-index: 10; + color: var(--primary); +} + +.nav-button:hover { + background-color: var(--primary-light); + box-shadow: var(--shadow-medium); +} + +.nav-button mat-icon { + font-size: var(--text-xl); + width: var(--text-xl); + height: var(--text-xl); +} + +.nav-button.left { + margin-right: var(--spacing-2); +} + +.nav-button.right { + margin-left: var(--spacing-2); +} +`], +}) +export class RelatedBooksCarouselComponent { + books = input(); + @ViewChild('carouselContainer') carouselContainer!: ElementRef; + + scroll(direction: 'left' | 'right') { + const container = this.carouselContainer.nativeElement; + const scrollAmount = container.clientWidth * 0.8; // Scroll 80% of container width + + if (direction === 'left') { + container.scrollBy({ left: -scrollAmount, behavior: 'smooth' }); + } else { + container.scrollBy({ left: scrollAmount, behavior: 'smooth' }); + } + } +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/review-summary.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/review-summary.component.ts new file mode 100644 index 0000000..ab1551e --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/review-summary.component.ts @@ -0,0 +1,41 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RatingStarsComponent } from './rating-stars.component'; + +@Component({ + selector: 'app-review-summary', + standalone: true, + imports: [CommonModule, RatingStarsComponent], + template: `
      + @if (averageRating()) { + + } + @if (reviewCount() !== undefined) { + ({{ reviewCount() }} reviews) + } +
      `, + styles: [`.review-summary { + display: flex; + align-items: center; + gap: var(--spacing-2); + font-size: var(--text-base); + color: var(--text-secondary); +} + +.review-count { + color: var(--text-muted); +} +`], +}) +export class ReviewSummaryComponent { + averageRating = input(); + reviewCount = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/series-info-card.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/series-info-card.component.ts new file mode 100644 index 0000000..4dae607 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/series-info-card.component.ts @@ -0,0 +1,65 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; + +@Component({ + selector: 'app-series-info-card', + standalone: true, + imports: [CommonModule, MatIconModule], + template: `@if (series(); as series) { +
      + collections_bookmark +
      + {{ series.name }} + Book {{ series.number }} +
      +
      +}`, + styles: [`.series-card { + display: inline-flex; + align-items: center; + gap: var(--spacing-2); + background-color: var(--primary-light); + color: var(--primary-dark); + padding: var(--spacing-2) var(--spacing-3); + border-radius: var(--border-radius-md); + font-size: var(--text-sm); + font-weight: var(--font-weight-medium); + box-shadow: var(--shadow-subtle); + border: var(--border-default); + white-space: nowrap; +} + +.series-icon { + font-size: var(--text-lg); + width: var(--text-lg); + height: var(--text-lg); +} + +.series-details { + display: flex; + flex-direction: column; + line-height: 1.2; +} + +.series-name { + font-weight: var(--font-weight-semibold); +} + +.series-number { + font-size: var(--text-xs); + opacity: 0.9; +} +`], +}) +export class SeriesInfoCardComponent { + series = input<{ name: string; number: number }>(); +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/components/stock-availability.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/stock-availability.component.ts new file mode 100644 index 0000000..cc6adfc --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/components/stock-availability.component.ts @@ -0,0 +1,127 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input, computed } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +@Component({ + selector: 'app-stock-availability', + standalone: true, + imports: [CommonModule], + template: `
      +
      + @if (salePrice()) { + {{ price() | currency:'USD':'symbol':'1.2-2' }} + {{ salePrice() | currency:'USD':'symbol':'1.2-2' }} + } @else { + {{ price() | currency:'USD':'symbol':'1.2-2' }} + } +
      + +
      + @if (isInStock()) { + In Stock ({{ stock() }} available) + } @else { + Out of Stock + } +
      + + +
      `, + styles: [`.stock-availability-panel { + background-color: var(--surface); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + padding: var(--spacing-5); + border: var(--border-default); + display: flex; + flex-direction: column; + gap: var(--spacing-4); + align-items: flex-start; +} + +.price-info { + display: flex; + align-items: baseline; + gap: var(--spacing-2); +} + +.current-price { + font-size: var(--text-xxl); + font-weight: var(--font-weight-semibold); + color: var(--primary); +} + +.original-price { + font-size: var(--text-lg); + color: var(--text-muted); + text-decoration: line-through; +} + +.sale-price { + font-size: var(--text-xxl); + font-weight: var(--font-weight-semibold); + color: var(--error); +} + +.stock-info { + font-size: var(--text-base); + font-weight: var(--font-weight-medium); +} + +.in-stock { + color: var(--success); +} + +.out-of-stock { + color: var(--error); +} + +.add-to-cart-button { + background-color: var(--primary); + color: var(--surface); + padding: var(--spacing-3) var(--spacing-5); + border: none; + border-radius: var(--border-radius-md); + font-size: var(--text-lg); + font-weight: var(--font-weight-semibold); + cursor: pointer; + transition: var(--transition-default); + box-shadow: var(--shadow-subtle); +} + +.add-to-cart-button:hover:not(:disabled) { + background-color: var(--primary-dark); + box-shadow: var(--shadow-medium); +} + +.add-to-cart-button:active:not(:disabled) { + transform: translateY(1px); +} + +.add-to-cart-button:disabled { + background-color: var(--text-muted); + cursor: not-allowed; + opacity: 0.7; + box-shadow: none; +} +`], +}) +export class StockAvailabilityComponent { + stock = input(); + price = input(); + salePrice = input(); + + isInStock = computed(() => (this.stock() || 0) > 0); + + addToCart() { + console.log('Add to cart clicked. Stock:', this.stock(), 'Price:', this.price(), 'Sale Price:', this.salePrice()); + } +} diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/data-store.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/data-store.ts new file mode 100644 index 0000000..b04b926 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/data-store.ts @@ -0,0 +1,1596 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +export interface Dimensions { + height: number; + width: number; + depth: number; +} + +export interface Author { + name: string; + bio: string; + imageUrl?: string; +} + +export interface Publisher { + name: string; + location: string; +} + +export interface Review { + username: string; + rating: number; // 1-5 stars + comment: string; + timestamp: string; +} + +export interface Award { + name: string; + year: number; + organization: string; +} + +export interface Book { + id: string; + title: string; + subtitle?: string; + authors: Author[]; + publisher: Publisher; + publicationDate: string; + isbn: string; + genres: string[]; + tags: string[]; + description: string; + language: string; + format: 'Hardcover' | 'Paperback' | 'eBook' | 'Audiobook'; + pages: number; + coverImgUrl: string; + price: number; + salePrice?: number; + stock: number; + averageRating: number; + reviews: Review[]; + awards?: Award[]; + dimensions: Dimensions; + series?: { + name: string; + number: number; + }; + edition?: string; + bestsellerRank?: number; +} + +export const DATA: Book[] = [ + { + id: '1', + title: 'The Crimson Cipher', + authors: [{ name: 'Elena Vance', bio: 'Elena Vance is a master of historical thrillers.' }], + publisher: { name: 'Codex Publishing', location: 'New York' }, + publicationDate: '2023-05-20', + isbn: '978-0-385-54734-5', + genres: ['Mystery', 'Thriller'], + tags: ['historical', 'conspiracy', 'art'], + description: 'A symbologist must uncover a secret hidden within a Renaissance painting to prevent a global catastrophe.', + language: 'English', + format: 'Hardcover', + pages: 412, + coverImgUrl: 'cover-art/mystery.png', + price: 28.99, + stock: 150, + averageRating: 4.6, + reviews: [ + { username: 'ReaderX', rating: 5, comment: 'An absolute masterpiece of suspense!', timestamp: '2023-06-01T10:00:00Z' }, + { username: 'HistoryBuff', rating: 4, comment: 'Well-researched and thrilling.', timestamp: '2023-06-05T14:30:00Z' }, + ], + awards: [{ name: 'The Golden Quill', year: 2023, organization: 'International Thriller Writers' }], + dimensions: { height: 9.5, width: 6.4, depth: 1.4 }, + bestsellerRank: 3, + }, + { + id: '2', + title: 'Galactic Echoes', + authors: [{ name: 'Jax Orion', bio: 'Jax Orion is a visionary sci-fi author.' }], + publisher: { name: 'Nebula Press', location: 'San Francisco' }, + publicationDate: '2022-11-12', + isbn: '978-1-9821-3748-8', + genres: ['Science Fiction'], + tags: ['space opera', 'AI', 'first contact'], + description: 'The last human crew on a deep space vessel discovers a signal that could be the key to humanity\'s survival or its ultimate demise.', + language: 'English', + format: 'Paperback', + pages: 528, + coverImgUrl: 'cover-art/science-fiction.png', + price: 18.99, + stock: 200, + averageRating: 4.8, + reviews: [ + { username: 'SciFiFanatic', rating: 5, comment: 'A modern classic of the genre.', timestamp: '2022-12-10T18:00:00Z' }, + { username: 'AstroReader', rating: 5, comment: 'Mind-bending concepts and unforgettable characters.', timestamp: '2023-01-15T12:00:00Z' }, + ], + series: { name: 'The Starlight Chronicles', number: 1 }, + dimensions: { height: 8.2, width: 5.5, depth: 1.2 }, + }, + { + id: '3', + title: 'The Whispering Woods', + authors: [{ name: 'Lyra Meadowlight', bio: 'Lyra Meadowlight writes enchanting fantasy tales.' }], + publisher: { name: 'Fable & Fern', location: 'Portland' }, + publicationDate: '2024-02-14', + isbn: '978-0-7653-7646-7', + genres: ['Fantasy'], + tags: ['magic', 'folklore', 'adventure'], + description: 'A young herbalist must venture into a sentient forest to find a cure for her village\'s mysterious illness, guided only by ancient legends.', + language: 'English', + format: 'Hardcover', + pages: 380, + coverImgUrl: 'cover-art/fantasy.png', + price: 26.99, + stock: 120, + averageRating: 4.5, + reviews: [ + { username: 'FantasyLover', rating: 5, comment: 'Pure magic from start to finish.', timestamp: '2024-03-01T16:00:00Z' }, + ], + dimensions: { height: 9.0, width: 6.0, depth: 1.3 }, + }, + { + id: '4', + title: 'The Statesman\'s Secret', + authors: [{ name: 'Marcus Thorne', bio: 'Marcus Thorne is a former diplomat and political analyst.' }], + publisher: { name: 'Capitol Books', location: 'Washington D.C.' }, + publicationDate: '2023-09-05', + isbn: '978-1-5011-7134-4', + genres: ['Political Thriller'], + tags: ['espionage', 'politics', 'suspense'], + description: 'A veteran CIA operative uncovers a conspiracy that reaches the highest levels of the U.S. government.', + language: 'English', + format: 'Paperback', + pages: 450, + coverImgUrl: 'cover-art/political-thriller.png', + price: 17.99, + stock: 180, + averageRating: 4.4, + reviews: [ + { username: 'DCInsider', rating: 5, comment: 'Chillingly realistic and incredibly tense.', timestamp: '2023-09-20T11:00:00Z' }, + ], + dimensions: { height: 8.5, width: 5.5, depth: 1.1 }, + }, + { + id: '5', + title: 'The Last Voyage of the Stardust', + authors: [{ name: 'Jax Orion', bio: 'Jax Orion is a visionary sci-fi author.' }], + publisher: { name: 'Nebula Press', location: 'San Francisco' }, + publicationDate: '2024-01-16', + isbn: '978-1-9821-3750-1', + genres: ['Science Fiction'], + tags: ['space opera', 'AI', 'mystery'], + description: 'Following the events of Galactic Echoes, the crew of the Stardust is hailed as heroes, but a new, more insidious threat emerges from the shadows of their past.', + language: 'English', + format: 'Paperback', + pages: 550, + coverImgUrl: 'cover-art/science-fiction.png', + price: 19.99, + stock: 250, + averageRating: 4.9, + reviews: [ + { username: 'SciFiFanatic', rating: 5, comment: 'A stunning sequel. The stakes are even higher!', timestamp: '2024-02-01T10:00:00Z' }, + { username: 'AstroReader', rating: 5, comment: 'Orion has done it again. A must-read for any sci-fi fan.', timestamp: '2024-02-05T15:30:00Z' }, + ], + series: { name: 'The Starlight Chronicles', number: 2 }, + dimensions: { height: 8.2, width: 5.5, depth: 1.3 }, + bestsellerRank: 1, + }, + { + id: '6', + title: 'The Gilded Cage', + authors: [{ name: 'Genevieve Dubois', bio: 'Genevieve Dubois is a historian specializing in the French Revolution.' }], + publisher: { name: 'Versailles Press', location: 'Paris' }, + publicationDate: '2023-07-14', + isbn: '978-0-143-13373-0', + genres: ['Biography'], + tags: ['history', 'french revolution', 'royalty'], + description: 'A gripping biography of a lesser-known noblewoman caught in the turmoil of the French Revolution, navigating a world of opulence and terror.', + language: 'English', + format: 'Hardcover', + pages: 480, + coverImgUrl: 'cover-art/biography.png', + price: 32.00, + stock: 90, + averageRating: 4.7, + reviews: [ + { username: 'HistoryNerd', rating: 5, comment: 'Impeccably researched and beautifully written. Brings the era to life.', timestamp: '2023-08-01T12:00:00Z' }, + { username: 'ParisianReader', rating: 4, comment: 'A fascinating look into a turbulent time.', timestamp: '2023-08-10T19:00:00Z' }, + ], + dimensions: { height: 9.6, width: 6.5, depth: 1.6 }, + }, + { + id: '7', + title: 'The Way of the Wandering Star', + authors: [{ name: 'Kaelen Rourke', bio: 'Kaelen Rourke is a travel writer and philosopher.' }], + publisher: { name: 'Odyssey Books', location: 'Dublin' }, + publicationDate: '2022-09-22', + isbn: '978-1-64049-421-1', + genres: ['Travel', 'Philosophy'], + tags: ['memoir', 'adventure', 'spirituality'], + description: 'A solo traveler\'s journey across the Himalayas, exploring ancient philosophies and the boundless nature of the human spirit.', + language: 'English', + format: 'Paperback', + pages: 320, + coverImgUrl: 'cover-art/travel.png', + price: 16.99, + stock: 130, + averageRating: 4.5, + reviews: [ + { username: 'Wanderlust', rating: 5, comment: 'Inspiring and profoundly moving. Makes you want to pack your bags immediately.', timestamp: '2022-10-15T09:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.9 }, + }, + { + id: '8', + title: 'The Last Recipe', + authors: [{ name: 'Isabella Rossi', bio: 'Isabella Rossi is a world-renowned chef and restaurateur.' }], + publisher: { name: 'Gourmand Press', location: 'Florence' }, + publicationDate: '2023-10-10', + isbn: '978-0-399-58201-2', + genres: ['Cooking'], + tags: ['italian cuisine', 'cookbook', 'memoir'], + description: 'A collection of cherished family recipes passed down through generations, woven together with stories of love, loss, and the magic of the Italian kitchen.', + language: 'English', + format: 'Hardcover', + pages: 304, + coverImgUrl: 'cover-art/cooking.png', + price: 35.00, + stock: 110, + averageRating: 4.9, + reviews: [ + { username: 'FoodieForLife', rating: 5, comment: 'More than a cookbook, it\'s a love letter to food and family. The recipes are divine!', timestamp: '2023-11-01T13:00:00Z' }, + ], + dimensions: { height: 10.2, width: 8.3, depth: 1.1 }, + }, + { + id: '9', + title: 'The Sunstone Prophecy', + authors: [{ name: 'Lyra Meadowlight', bio: 'Lyra Meadowlight writes enchanting fantasy tales.' }], + publisher: { name: 'Fable & Fern', location: 'Portland' }, + publicationDate: '2025-01-20', + isbn: '978-0-7653-7648-1', + genres: ['Fantasy'], + tags: ['magic', 'prophecy', 'adventure'], + description: 'The sequel to The Whispering Woods. The fate of the enchanted forest rests on a new prophecy, one that foretells a looming darkness and a hero who must rise to meet it.', + language: 'English', + format: 'Hardcover', + pages: 400, + coverImgUrl: 'cover-art/fantasy.png', + price: 27.99, + stock: 150, + averageRating: 0, + reviews: [], + series: { name: 'The Forest Chronicles', number: 2 }, + dimensions: { height: 9.0, width: 6.0, depth: 1.4 }, + }, + { + id: '10', + title: 'The Art of Stillness', + authors: [{ name: 'Master Jin', bio: 'Master Jin is a Zen philosopher and meditation guide.' }], + publisher: { name: 'Mindful Path', location: 'Kyoto' }, + publicationDate: '2021-04-15', + isbn: '978-1-61180-804-4', + genres: ['Self-Help', 'Philosophy'], + tags: ['mindfulness', 'meditation', 'zen'], + description: 'A practical guide to finding peace and clarity in a chaotic world. Master Jin offers timeless wisdom and simple exercises to cultivate inner stillness.', + language: 'English', + format: 'Paperback', + pages: 224, + coverImgUrl: 'cover-art/philosophy.png', + price: 15.95, + stock: 300, + averageRating: 4.8, + reviews: [ + { username: 'ZenSeeker', rating: 5, comment: 'This book changed my life. A must-read for anyone seeking calm.', timestamp: '2021-05-10T14:00:00Z' }, + { username: 'MindfulReader', rating: 5, comment: 'Simple, profound, and incredibly effective.', timestamp: '2021-06-02T11:30:00Z' }, + ], + dimensions: { height: 7.5, width: 5.0, depth: 0.7 }, + }, + { + id: '11', + title: 'Echoes of the Forgotten', + authors: [{ name: 'Adrian Valerius', bio: 'Adrian Valerius is an archaeologist and historian.' }], + publisher: { name: 'Antiquarian Press', location: 'Rome' }, + publicationDate: '2023-03-12', + isbn: '978-0-525-53971-2', + genres: ['Mystery', 'Biography'], + tags: ['archaeology', 'ancient rome', 'historical mystery'], + description: 'An archaeologist uncovers a series of artifacts that challenge the accepted history of the Roman Empire, leading him down a dangerous path of discovery.', + language: 'English', + format: 'Hardcover', + pages: 432, + coverImgUrl: 'cover-art/biography.png', + price: 29.99, + stock: 80, + averageRating: 4.6, + reviews: [ + { username: 'HistoryGeek', rating: 5, comment: 'A perfect blend of history and suspense. I couldn\'t put it down!', timestamp: '2023-04-01T18:00:00Z' }, + ], + dimensions: { height: 9.5, width: 6.4, depth: 1.5 }, + }, + { + id: '12', + title: 'The Girl Who Talked to Trees', + authors: [{ name: 'Penelope Bloom', bio: 'Penelope Bloom writes heartwarming stories for young readers.' }], + publisher: { name: 'Little Sprouts Books', location: 'Asheville' }, + publicationDate: '2022-08-20', + isbn: '978-1-5344-9924-5', + genres: ['Childrens', 'Young Adult'], + tags: ['nature', 'friendship', 'magic'], + description: 'A young girl with a special ability to communicate with nature must rally her forest friends to save their home from developers.', + language: 'English', + format: 'Hardcover', + pages: 256, + coverImgUrl: 'cover-art/childrens.png', + price: 17.99, + stock: 150, + averageRating: 4.9, + reviews: [ + { username: 'ParentReader', rating: 5, comment: 'A beautiful story with a wonderful message. My kids loved it!', timestamp: '2022-09-10T20:00:00Z' }, + ], + dimensions: { height: 8.5, width: 6.0, depth: 1.0 }, + }, + { + id: '13', + title: 'Operation Nightfall', + authors: [{ name: 'Colonel Rex "Havoc" Stone', bio: 'Colonel Rex Stone is a decorated special forces veteran.' }], + publisher: { name: 'Stealth Publishing', location: 'San Diego' }, + publicationDate: '2023-11-07', + isbn: '978-0-399-59341-4', + genres: ['Military Thriller'], + tags: ['special forces', 'action', 'counter-terrorism'], + description: 'A retired Navy SEAL is called back for one last impossible mission: to stop a rogue faction from unleashing a new type of chemical weapon.', + language: 'English', + format: 'Paperback', + pages: 384, + coverImgUrl: 'cover-art/military-thriller.png', + price: 16.99, + stock: 220, + averageRating: 4.5, + reviews: [ + { username: 'ActionJunkie', rating: 5, comment: 'Non-stop action from a guy who has been there. Authentic and thrilling.', timestamp: '2023-11-20T17:00:00Z' }, + ], + dimensions: { height: 8.2, width: 5.5, depth: 1.0 }, + }, + { + id: '14', + title: 'The Summer House on the Lake', + authors: [{ name: 'Juliette Rose', bio: 'Juliette Rose writes sweeping, emotional love stories.' }], + publisher: { name: 'Evergreen Romance', location: 'Charleston' }, + publicationDate: '2024-06-11', + isbn: '978-0-593-33531-1', + genres: ['Romance'], + tags: ['summer romance', 'second chances', 'contemporary'], + description: 'Two childhood sweethearts, now leading separate lives, are unexpectedly reunited at their families\' shared lake house. Old sparks fly, but new secrets stand in their way.', + language: 'English', + format: 'Paperback', + pages: 352, + coverImgUrl: 'cover-art/romance.png', + price: 17.00, + stock: 300, + averageRating: 0, + reviews: [], + dimensions: { height: 8.0, width: 5.2, depth: 0.9 }, + }, + { + id: '15', + title: 'The Alchemist of Prague', + authors: [{ name: 'Elena Vance', bio: 'Elena Vance is a master of historical thrillers.' }], + publisher: { name: 'Codex Publishing', location: 'New York' }, + publicationDate: '2025-03-18', + isbn: '978-0-385-54736-9', + genres: ['Mystery', 'Thriller'], + tags: ['historical', 'alchemy', 'prague'], + description: 'In the gaslit streets of 19th-century Prague, a brilliant detective must hunt a killer who uses the ancient art of alchemy to commit impossible murders.', + language: 'English', + format: 'Hardcover', + pages: 430, + coverImgUrl: 'cover-art/mystery.png', + price: 29.99, + stock: 100, + averageRating: 0, + reviews: [], + dimensions: { height: 9.5, width: 6.4, depth: 1.5 }, + }, + { + id: '16', + title: 'The Last Starchild', + authors: [{ name: 'Orion Blackwood', bio: 'Orion Blackwood is a fresh voice in young adult fantasy.' }], + publisher: { name: 'Moonbeam Books', location: 'London' }, + publicationDate: '2023-08-15', + isbn: '978-1-4088-5566-9', + genres: ['Young Adult', 'Fantasy'], + tags: ['magic', 'coming of age', 'destiny'], + description: 'A teenager discovers she is the last of a celestial line, gifted with star-magic, and must learn to control her powers to save her world from an encroaching darkness.', + language: 'English', + format: 'Paperback', + pages: 384, + coverImgUrl: 'cover-art/young-adult.png', + price: 14.99, + stock: 180, + averageRating: 4.7, + reviews: [ + { username: 'YAFan', rating: 5, comment: 'An incredible start to a new series. I\'m hooked!', timestamp: '2023-09-01T11:00:00Z' }, + ], + dimensions: { height: 7.8, width: 5.1, depth: 1.0 }, + }, + { + id: '17', + title: 'The Quantum Paradox', + authors: [{ name: 'Dr. Evelyn Reed', bio: 'Dr. Evelyn Reed is a theoretical physicist and science communicator.' }], + publisher: { name: 'Helix Books', location: 'Cambridge' }, + publicationDate: '2022-10-04', + isbn: '978-0-593-23744-5', + genres: ['Science Fiction'], + tags: ['hard sci-fi', 'time travel', 'physics'], + description: 'A team of physicists accidentally opens a rift in spacetime, and must navigate the paradoxes of their own past and future to close it before reality unravels.', + language: 'English', + format: 'Hardcover', + pages: 464, + coverImgUrl: 'cover-art/science-fiction.png', + price: 28.00, + stock: 95, + averageRating: 4.6, + reviews: [ + { username: 'PhysicsNerd', rating: 5, comment: 'Finally, a time travel story that respects the science! Brilliantly executed.', timestamp: '2022-10-20T15:00:00Z' }, + ], + dimensions: { height: 9.3, width: 6.3, depth: 1.6 }, + }, + { + id: '18', + title: 'The Dragon\'s Tooth', + authors: [{ name: 'Gideon Drake', bio: 'Gideon Drake writes epic fantasy for a new generation.' }], + publisher: { name: 'Wyrmwood Press', location: 'Edinburgh' }, + publicationDate: '2023-06-21', + isbn: '978-0-7653-8968-9', + genres: ['Fantasy', 'RPG-Lit'], + tags: ['dragons', 'magic items', 'epic fantasy'], + description: 'A disgraced knight must assemble a band of heroes to retrieve a legendary artifact, the Dragon\'s Tooth, before it falls into the hands of a tyrannical sorcerer.', + language: 'English', + format: 'Paperback', + pages: 624, + coverImgUrl: 'cover-art/rpg-lit.png', + price: 19.99, + stock: 210, + averageRating: 4.8, + reviews: [ + { username: 'EpicFantasyFan', rating: 5, comment: 'A grand adventure with classic fantasy elements done right. The magic system is incredible.', timestamp: '2023-07-10T12:00:00Z' }, + ], + series: { name: 'The Artifacts of Power', number: 1 }, + dimensions: { height: 8.5, width: 5.5, depth: 1.5 }, + }, + { + id: '19', + title: 'The Resilient Mind', + authors: [{ name: 'Dr. Anya Sharma', bio: 'Dr. Anya Sharma is a clinical psychologist and expert in cognitive behavioral therapy.' }], + publisher: { name: 'Mindful Path', location: 'Kyoto' }, + publicationDate: '2023-01-30', + isbn: '978-1-61180-933-1', + genres: ['Self-Help'], + tags: ['psychology', 'resilience', 'mental health'], + description: 'A practical, evidence-based guide to building mental fortitude, overcoming adversity, and thriving in the face of life\'s challenges.', + language: 'English', + format: 'Paperback', + pages: 288, + coverImgUrl: 'cover-art/self-help.png', + price: 18.95, + stock: 250, + averageRating: 4.9, + reviews: [ + { username: 'BetterMe', rating: 5, comment: 'An incredibly useful and compassionate book. The techniques are easy to apply and really work.', timestamp: '2023-02-20T10:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.8 }, + }, + { + id: '20', + title: 'The Clockwork City', + authors: [{ name: 'Silas Cogsworth', bio: 'Silas Cogsworth is an imaginative writer of steampunk adventures.' }], + publisher: { name: 'Brass & Bolt Books', location: 'London' }, + publicationDate: '2022-04-19', + isbn: '978-1-939899-42-7', + genres: ['Fantasy', 'Science Fiction'], + tags: ['steampunk', 'invention', 'mystery'], + description: 'In a city powered by steam and clockwork, a brilliant inventor is framed for a crime she didn\'t commit. To clear her name, she must navigate a world of airships, automatons, and political intrigue.', + language: 'English', + format: 'Paperback', + pages: 416, + coverImgUrl: 'cover-art/fantasy.png', + price: 16.99, + stock: 140, + averageRating: 4.4, + reviews: [ + { username: 'SteampunkFan', rating: 5, comment: 'A fantastic steampunk world with a gripping mystery. Highly recommended!', timestamp: '2022-05-05T16:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 1.1 }, + }, + { + id: '21', + title: 'The Bone Orchard', + authors: [{ name: 'Seraphina Cross', bio: 'Seraphina Cross writes dark, atmospheric mysteries.' }], + publisher: { name: 'Gallows Press', location: 'New Orleans' }, + publicationDate: '2023-04-11', + isbn: '978-0-593-31043-1', + genres: ['Mystery', 'Thriller'], + tags: ['gothic', 'southern gothic', 'supernatural'], + description: 'A detective with a troubled past returns to her Louisiana hometown to solve a series of ritualistic murders that are eerily connected to a local legend.', + language: 'English', + format: 'Paperback', + pages: 368, + coverImgUrl: 'cover-art/mystery.png', + price: 17.99, + stock: 160, + averageRating: 4.5, + reviews: [ + { username: 'GothicReader', rating: 5, comment: 'Chilling, atmospheric, and beautifully written. I couldn\'t sleep!', timestamp: '2023-04-25T22:00:00Z' }, + ], + dimensions: { height: 8.2, width: 5.5, depth: 1.0 }, + }, + { + id: '22', + title: 'The Cartographer of Dreams', + authors: [{ name: 'Finnian Quill', bio: 'Finnian Quill is a writer of lyrical and imaginative tales.' }], + publisher: { name: 'Ink & Compass', location: 'Dublin' }, + publicationDate: '2022-07-19', + isbn: '978-1-5247-6201-3', + genres: ['Fantasy'], + tags: ['maps', 'magic', 'adventure', 'folklore'], + description: 'A young apprentice discovers he can map people\'s dreams, a talent that draws him into a hidden world of dream-weavers and nightmare-hunters.', + language: 'English', + format: 'Hardcover', + pages: 352, + coverImgUrl: 'cover-art/fantasy.png', + price: 25.99, + stock: 110, + averageRating: 4.6, + reviews: [ + { username: 'Dreamer', rating: 5, comment: 'A wholly original and enchanting story. Pure magic.', timestamp: '2022-08-05T14:00:00Z' }, + ], + dimensions: { height: 8.8, width: 5.9, depth: 1.3 }, + }, + { + id: '23', + title: 'The Zero-G Heist', + authors: [{ name: 'Cora "Comet" Chen', bio: 'Cora Chen is a former aerospace engineer turned sci-fi author.' }], + publisher: { name: 'Orbital Publishing', location: 'Houston' }, + publicationDate: '2023-02-28', + isbn: '978-0-593-44112-8', + genres: ['Science Fiction', 'Thriller'], + tags: ['heist', 'space station', 'action'], + description: 'A team of ex-convicts is assembled to pull off the most audacious heist in history: robbing a casino on a luxury space station. The only catch? They have to do it in zero gravity.', + language: 'English', + format: 'Paperback', + pages: 400, + coverImgUrl: 'cover-art/science-fiction.png', + price: 18.00, + stock: 190, + averageRating: 4.3, + reviews: [ + { username: 'ActionFan', rating: 4, comment: 'Ocean\'s Eleven in space. A fun, high-octane ride.', timestamp: '2023-03-15T19:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 1.1 }, + }, + { + id: '24', + title: 'The Emperor\'s Shadow', + authors: [{ name: 'Kenji Tanaka', bio: 'Kenji Tanaka is a historian and author specializing in feudal Japan.' }], + publisher: { name: 'Bushido Books', location: 'Kyoto' }, + publicationDate: '2021-11-30', + isbn: '978-4-06-521833-8', + genres: ['Biography'], + tags: ['samurai', 'history', 'japan', 'war'], + description: 'The epic biography of a legendary samurai who served as the secret protector of the emperor during a time of civil war and political upheaval.', + language: 'English', + format: 'Hardcover', + pages: 512, + coverImgUrl: 'cover-art/biography.png', + price: 34.99, + stock: 70, + averageRating: 4.9, + reviews: [ + { username: 'SamuraiSteve', rating: 5, comment: 'A masterpiece of historical biography. Reads like an epic novel.', timestamp: '2021-12-20T13:00:00Z' }, + ], + dimensions: { height: 9.6, width: 6.5, depth: 1.8 }, + }, + { + id: '25', + title: 'The Little Bear Who Lost His Roar', + authors: [{ name: 'Daisy Meadows', bio: 'Daisy Meadows creates charming stories for the littlest readers.' }], + publisher: { name: 'Little Sprouts Books', location: 'Asheville' }, + publicationDate: '2023-09-12', + isbn: '978-1-5344-9926-9', + genres: ['Childrens'], + tags: ['animals', 'friendship', 'self-discovery'], + description: 'A little bear wakes up one morning to find his mighty roar has been replaced by a tiny squeak! He embarks on a journey through the forest to find it, making new friends along the way.', + language: 'English', + format: 'Hardcover', + pages: 32, + coverImgUrl: 'cover-art/childrens.png', + price: 16.99, + stock: 200, + averageRating: 4.8, + reviews: [ + { username: 'MomOfTwo', rating: 5, comment: 'An adorable story with beautiful illustrations. My toddler asks for it every night.', timestamp: '2023-10-01T19:30:00Z' }, + ], + dimensions: { height: 9.0, width: 9.0, depth: 0.5 }, + }, + { + id: '26', + title: 'The Phoenix Protocol', + authors: [{ name: 'Marcus Thorne', bio: 'Marcus Thorne is a former diplomat and political analyst.' }], + publisher: { name: 'Capitol Books', location: 'Washington D.C.' }, + publicationDate: '2024-09-03', + isbn: '978-1-5011-7136-8', + genres: ['Political Thriller'], + tags: ['cyberterrorism', 'politics', 'conspiracy'], + description: 'A devastating cyberattack cripples the nation\'s infrastructure, and the operative from The Statesman\'s Secret is the only one who knows it\'s just the beginning of a much larger plot.', + language: 'English', + format: 'Paperback', + pages: 464, + coverImgUrl: 'cover-art/political-thriller.png', + price: 18.99, + stock: 200, + averageRating: 0, + reviews: [], + series: { name: 'The Operative', number: 2 }, + dimensions: { height: 8.5, width: 5.5, depth: 1.2 }, + }, + { + id: '27', + title: 'The Secret Garden of Words', + authors: [{ name: 'Eleanor Vance', bio: 'Eleanor Vance is a poet and novelist.' }], + publisher: { name: 'Evergreen Romance', location: 'Charleston' }, + publicationDate: '2022-05-17', + isbn: '978-0-593-33529-8', + genres: ['Romance'], + tags: ['books', 'love', 'ireland', 'contemporary'], + description: 'A reclusive author with writer\'s block inherits a charming, chaotic bookstore in a small Irish village. There, she discovers a lost manuscript that leads her to an unexpected love.', + language: 'English', + format: 'Paperback', + pages: 336, + coverImgUrl: 'cover-art/romance.png', + price: 16.00, + stock: 180, + averageRating: 4.6, + reviews: [ + { username: 'Bookworm', rating: 5, comment: 'A love letter to books and book lovers. Absolutely charming.', timestamp: '2022-06-01T15:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.9 }, + }, + { + id: '28', + title: 'The Nomad\'s Compass', + authors: [{ name: 'Asher Grey', bio: 'Asher Grey is a globetrotter who documents his journeys in vivid prose.' }], + publisher: { name: 'Odyssey Books', location: 'Dublin' }, + publicationDate: '2023-11-21', + isbn: '978-1-64049-423-5', + genres: ['Travel'], + tags: ['adventure', 'memoir', 'sailing', 'exploration'], + description: 'The incredible true story of a man who sold everything he owned to sail around the world, navigating by the stars and the kindness of strangers.', + language: 'English', + format: 'Paperback', + pages: 368, + coverImgUrl: 'cover-art/travel.png', + price: 17.99, + stock: 140, + averageRating: 4.7, + reviews: [ + { username: 'Sailor', rating: 5, comment: 'A breathtaking journey of courage and discovery. Truly inspiring.', timestamp: '2023-12-10T10:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 1.0 }, + }, + { + id: '29', + title: 'The Rebel King', + authors: [{ name: 'Orion Blackwood', bio: 'Orion Blackwood is a fresh voice in young adult fantasy.' }], + publisher: { name: 'Moonbeam Books', location: 'London' }, + publicationDate: '2024-08-13', + isbn: '978-1-4088-5568-3', + genres: ['Young Adult', 'Fantasy'], + tags: ['magic', 'rebellion', 'royalty'], + description: 'In the sequel to The Last Starchild, the young celestial must now lead a rebellion against the dark forces that have conquered her kingdom, all while wrestling with her own immense power.', + language: 'English', + format: 'Paperback', + pages: 400, + coverImgUrl: 'cover-art/young-adult.png', + price: 15.99, + stock: 200, + averageRating: 0, + reviews: [], + series: { name: 'The Starchild Saga', number: 2 }, + dimensions: { height: 7.8, width: 5.1, depth: 1.1 }, + }, + { + id: '30', + title: 'The Spice of Life: A Culinary Manifesto', + authors: [{ name: 'Chef Antoine Dubois', bio: 'Chef Antoine Dubois is a culinary revolutionary known for his bold flavors.' }], + publisher: { name: 'Gourmand Press', location: 'Florence' }, + publicationDate: '2022-03-08', + isbn: '978-0-399-58203-6', + genres: ['Cooking'], + tags: ['global cuisine', 'spices', 'cookbook', 'essays'], + description: 'A vibrant exploration of spices from around the world, featuring 150 recipes that will transform your cooking from mundane to magnificent. Part cookbook, part travelogue.', + language: 'English', + format: 'Hardcover', + pages: 352, + coverImgUrl: 'cover-art/cooking.png', + price: 37.50, + stock: 90, + averageRating: 4.8, + reviews: [ + { username: 'SpiceMaster', rating: 5, comment: 'A stunning book. The photography is gorgeous and the recipes are inventive and delicious.', timestamp: '2022-03-25T18:00:00Z' }, + ], + dimensions: { height: 10.5, width: 8.5, depth: 1.2 }, + }, + { + id: '31', + title: 'The Aegis Gambit', + authors: [{ name: 'Colonel Rex "Havoc" Stone', bio: 'Colonel Rex Stone is a decorated special forces veteran.' }], + publisher: { name: 'Stealth Publishing', location: 'San Diego' }, + publicationDate: '2024-11-05', + isbn: '978-0-399-59343-8', + genres: ['Military Thriller'], + tags: ['special forces', 'geopolitical', 'action'], + description: 'When a next-generation missile defense system is stolen, the hero of Operation Nightfall must lead a deniable ops team to retrieve it before it can be used to start World War III.', + language: 'English', + format: 'Paperback', + pages: 400, + coverImgUrl: 'cover-art/military-thriller.png', + price: 17.99, + stock: 250, + averageRating: 0, + reviews: [], + series: { name: 'Havoc', number: 2 }, + dimensions: { height: 8.2, width: 5.5, depth: 1.1 }, + }, + { + id: '32', + title: 'The Labyrinth of Whispers', + authors: [{ name: 'Katarina Volkov', bio: 'Katarina Volkov writes intricate psychological thrillers.' }], + publisher: { name: 'Black Cat Books', location: 'Prague' }, + publicationDate: '2023-10-31', + isbn: '978-1-9821-8881-7', + genres: ['Mystery', 'Thriller'], + tags: ['psychological', 'unreliable narrator', 'suspense'], + description: 'A woman suffering from amnesia after a traumatic accident begins to suspect her loving husband is not who he says he is. The truth is locked in her fragmented memories.', + language: 'English', + format: 'Paperback', + pages: 336, + coverImgUrl: 'cover-art/mystery.png', + price: 17.00, + stock: 170, + averageRating: 4.4, + reviews: [ + { username: 'ThrillerFan', rating: 5, comment: 'Twisty, dark, and utterly compelling. I did not see that ending coming!', timestamp: '2023-11-15T21:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.9 }, + }, + { + id: '33', + title: 'The Sword of the Seventh Sun', + authors: [{ name: 'Gideon Drake', bio: 'Gideon Drake writes epic fantasy for a new generation.' }], + publisher: { name: 'Wyrmwood Press', location: 'Edinburgh' }, + publicationDate: '2024-06-18', + isbn: '978-0-7653-8970-2', + genres: ['Fantasy', 'RPG-Lit'], + tags: ['magic sword', 'epic quest', 'demons'], + description: 'The quest for the Dragon\'s Tooth was only the beginning. Now, the heroes must reforge a legendary blade of light to banish a demon lord from the mortal realm.', + language: 'English', + format: 'Paperback', + pages: 656, + coverImgUrl: 'cover-art/rpg-lit.png', + price: 20.99, + stock: 220, + averageRating: 0, + reviews: [], + series: { name: 'The Artifacts of Power', number: 2 }, + dimensions: { height: 8.5, width: 5.5, depth: 1.6 }, + }, + { + id: '34', + title: 'The Unseen Architect', + authors: [{ name: 'Dr. Julian Finch', bio: 'Dr. Julian Finch is a philosopher of science and ethics.' }], + publisher: { name: 'Academia Press', location: 'Oxford' }, + publicationDate: '2022-09-13', + isbn: '978-0-19-886341-9', + genres: ['Philosophy'], + tags: ['ethics', 'technology', 'AI', 'future'], + description: 'A thought-provoking exploration of the ethical dilemmas posed by artificial intelligence and the profound impact it will have on the future of humanity.', + language: 'English', + format: 'Hardcover', + pages: 320, + coverImgUrl: 'cover-art/philosophy.png', + price: 30.00, + stock: 80, + averageRating: 4.7, + reviews: [ + { username: 'Thinker', rating: 5, comment: 'A crucial and timely book. Finch tackles complex issues with clarity and nuance.', timestamp: '2022-10-01T12:00:00Z' }, + ], + dimensions: { height: 9.2, width: 6.1, depth: 1.2 }, + }, + { + id: '35', + title: 'The Courage to Begin', + authors: [{ name: 'Maya Rivera', bio: 'Maya Rivera is a life coach and motivational speaker.' }], + publisher: { name: 'Ascend Media', location: 'Los Angeles' }, + publicationDate: '2023-05-09', + isbn: '978-1-64250-899-5', + genres: ['Self-Help'], + tags: ['motivation', 'self-improvement', 'career', 'confidence'], + description: 'A step-by-step guide to overcoming fear, silencing your inner critic, and taking the first bold steps toward the life you\'ve always dreamed of.', + language: 'English', + format: 'Paperback', + pages: 256, + coverImgUrl: 'cover-art/self-help.png', + price: 17.95, + stock: 300, + averageRating: 4.8, + reviews: [ + { username: 'GoGetter', rating: 5, comment: 'The kick in the pants I needed! Practical, inspiring, and full of actionable advice.', timestamp: '2023-05-25T14:00:00Z' }, + ], + dimensions: { height: 8.5, width: 5.5, depth: 0.7 }, + }, + { + id: '36', + title: 'The City of a Thousand Stars', + authors: [{ name: 'Jax Orion', bio: 'Jax Orion is a visionary sci-fi author.' }], + publisher: { name: 'Nebula Press', location: 'San Francisco' }, + publicationDate: '2025-01-14', + isbn: '978-1-9821-3752-5', + genres: ['Science Fiction'], + tags: ['space opera', 'alien civilizations', 'discovery'], + description: 'The stunning conclusion to The Starlight Chronicles. The crew of the Stardust reaches a legendary city, home to a thousand alien species, only to find it on the brink of a civil war that could unravel the galaxy.', + language: 'English', + format: 'Paperback', + pages: 580, + coverImgUrl: 'cover-art/science-fiction.png', + price: 20.99, + stock: 300, + averageRating: 0, + reviews: [], + series: { name: 'The Starlight Chronicles', number: 3 }, + dimensions: { height: 8.2, width: 5.5, depth: 1.4 }, + }, + { + id: '37', + title: 'The Baker of Willow Creek', + authors: [{ name: 'Penelope Plum', bio: 'Penelope Plum writes cozy, heartwarming stories.' }], + publisher: { name: 'Evergreen Romance', location: 'Charleston' }, + publicationDate: '2023-03-07', + isbn: '978-0-593-33530-4', + genres: ['Romance'], + tags: ['small town', 'baking', 'contemporary romance'], + description: 'A big-city pastry chef, recovering from a career-ending burnout, finds a new recipe for life and love when she takes over her grandmother\'s small-town bakery.', + language: 'English', + format: 'Paperback', + pages: 320, + coverImgUrl: 'cover-art/romance.png', + price: 16.00, + stock: 210, + averageRating: 4.5, + reviews: [ + { username: 'CozyReader', rating: 5, comment: 'The sweetest book I\'ve read all year. Pure comfort.', timestamp: '2023-03-20T16:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.8 }, + }, + { + id: '38', + title: 'The Shadow of the Colossus', + authors: [{ name: 'Adrian Valerius', bio: 'Adrian Valerius is an archaeologist and historian.' }], + publisher: { name: 'Antiquarian Press', location: 'Rome' }, + publicationDate: '2024-03-10', + isbn: '978-0-525-53973-6', + genres: ['Mystery', 'Biography'], + tags: ['archaeology', 'ancient greece', 'historical mystery'], + description: 'The archaeologist from Echoes of the Forgotten travels to Greece to investigate the mysterious disappearance of a colleague, a search that leads him to a lost wonder of the ancient world.', + language: 'English', + format: 'Hardcover', + pages: 448, + coverImgUrl: 'cover-art/biography.png', + price: 30.99, + stock: 85, + averageRating: 0, + reviews: [], + series: { name: 'The Artifact Hunter', number: 2 }, + dimensions: { height: 9.5, width: 6.4, depth: 1.6 }, + }, + { + id: '39', + title: 'The Boy Who Built a Rocket', + authors: [{ name: 'Leo Stellar', bio: 'Leo Stellar writes inspiring stories for ambitious kids.' }], + publisher: { name: 'Little Sprouts Books', location: 'Asheville' }, + publicationDate: '2024-05-14', + isbn: '978-1-5344-9928-3', + genres: ['Childrens'], + tags: ['space', 'invention', 'dreams', 'science'], + description: 'A young boy, inspired by the stars, decides to build a rocket in his backyard. With the help of his friends and a little bit of imagination, he reaches for the moon.', + language: 'English', + format: 'Hardcover', + pages: 40, + coverImgUrl: 'cover-art/childrens.png', + price: 18.99, + stock: 180, + averageRating: 0, + reviews: [], + dimensions: { height: 10.0, width: 8.0, depth: 0.6 }, + }, + { + id: '40', + title: 'The Crown of Whispers', + authors: [{ name: 'Lyra Meadowlight', bio: 'Lyra Meadowlight writes enchanting fantasy tales.' }], + publisher: { name: 'Fable & Fern', location: 'Portland' }, + publicationDate: '2026-01-15', + isbn: '978-0-7653-7650-4', + genres: ['Fantasy'], + tags: ['magic', 'royalty', 'adventure'], + description: 'The epic conclusion to The Forest Chronicles. The rightful heir must claim a magical crown to unite the kingdoms of humans and fae against a common enemy.', + language: 'English', + format: 'Hardcover', + pages: 410, + coverImgUrl: 'cover-art/fantasy.png', + price: 28.99, + stock: 150, + averageRating: 0, + reviews: [], + series: { name: 'The Forest Chronicles', number: 3 }, + dimensions: { height: 9.0, width: 6.0, depth: 1.5 }, + }, + { + id: '41', + title: 'The Silk Weaver\'s Daughter', + authors: [{ name: 'Mei Lin', bio: 'Mei Lin writes captivating historical fiction.' }], + publisher: { name: 'Dragonfly Press', location: 'Shanghai' }, + publicationDate: '2023-02-21', + isbn: '978-0-7582-9473-1', + genres: ['Biography'], + tags: ['historical fiction', 'china', 'family saga'], + description: 'A multi-generational saga that follows a family of silk weavers in early 20th-century China, as they navigate war, revolution, and the changing tides of history.', + language: 'English', + format: 'Paperback', + pages: 480, + coverImgUrl: 'cover-art/biography.png', + price: 17.99, + stock: 130, + averageRating: 4.6, + reviews: [ + { username: 'HistFicFan', rating: 5, comment: 'A beautiful, sweeping story. I was completely immersed.', timestamp: '2023-03-10T14:00:00Z' }, + ], + dimensions: { height: 8.2, width: 5.5, depth: 1.2 }, + }, + { + id: '42', + title: 'The Last Sunset', + authors: [{ name: 'Kai Moreno', bio: 'Kai Moreno writes poignant and thought-provoking travelogues.' }], + publisher: { name: 'Odyssey Books', location: 'Dublin' }, + publicationDate: '2024-04-16', + isbn: '978-1-64049-425-9', + genres: ['Travel'], + tags: ['memoir', 'south america', 'self-discovery'], + description: 'A journey to the end of the world. A writer travels to Patagonia to confront a past tragedy and finds unexpected healing in the raw, untamed beauty of the landscape.', + language: 'English', + format: 'Paperback', + pages: 288, + coverImgUrl: 'cover-art/travel.png', + price: 16.99, + stock: 110, + averageRating: 0, + reviews: [], + dimensions: { height: 8.0, width: 5.2, depth: 0.8 }, + }, + { + id: '43', + title: 'The Perfect Loaf: A Guide for Artisan Bakers', + authors: [{ name: 'Julian Armstrong', bio: 'Julian Armstrong is a master baker and founder of a renowned bakery.' }], + publisher: { name: 'Gourmand Press', location: 'Florence' }, + publicationDate: '2021-09-07', + isbn: '978-0-399-58205-0', + genres: ['Cooking'], + tags: ['baking', 'sourdough', 'cookbook', 'technique'], + description: 'The definitive guide to baking artisan bread at home. From starters to shaping, this book covers every detail with clear instructions and beautiful photography.', + language: 'English', + format: 'Hardcover', + pages: 400, + coverImgUrl: 'cover-art/cooking.png', + price: 40.00, + stock: 150, + averageRating: 4.9, + reviews: [ + { username: 'HomeBaker', rating: 5, comment: 'My bread has never been better. This book is a game-changer.', timestamp: '2021-10-01T11:00:00Z' }, + { username: 'SourdoughSam', rating: 5, comment: 'An indispensable resource for any serious baker.', timestamp: '2021-10-15T17:00:00Z' }, + ], + dimensions: { height: 10.8, width: 8.8, depth: 1.4 }, + }, + { + id: '44', + title: 'The Serpent\'s Kiss', + authors: [{ name: 'Isolde Nightshade', bio: 'Isolde Nightshade pens gothic romances with a dark twist.' }], + publisher: { name: 'Gallows Press', location: 'New Orleans' }, + publicationDate: '2022-10-25', + isbn: '978-0-593-31045-5', + genres: ['Mystery', 'Romance'], + tags: ['gothic romance', 'vampires', 'forbidden love'], + description: 'A young governess in a remote, crumbling manor finds herself drawn to its enigmatic and brooding master, who harbors a centuries-old secret.', + language: 'English', + format: 'Paperback', + pages: 400, + coverImgUrl: 'cover-art/romance.png', + price: 16.99, + stock: 190, + averageRating: 4.3, + reviews: [ + { username: 'GothRomanceReader', rating: 4, comment: 'Dark, dangerous, and deeply romantic. A perfect gothic read.', timestamp: '2022-11-10T20:00:00Z' }, + ], + dimensions: { height: 8.2, width: 5.5, depth: 1.1 }, + }, + { + id: '45', + title: 'The Code of Life', + authors: [{ name: 'Dr. Evelyn Reed', bio: 'Dr. Evelyn Reed is a theoretical physicist and science communicator.' }], + publisher: { name: 'Helix Books', location: 'Cambridge' }, + publicationDate: '2024-10-01', + isbn: '978-0-593-23746-9', + genres: ['Science Fiction'], + tags: ['hard sci-fi', 'genetics', 'bio-thriller'], + description: 'A brilliant geneticist discovers a hidden code within human DNA, a message from an ancient, unknown intelligence. But decoding it could unleash a power that humanity is not ready to control.', + language: 'English', + format: 'Hardcover', + pages: 480, + coverImgUrl: 'cover-art/science-fiction.png', + price: 29.00, + stock: 100, + averageRating: 0, + reviews: [], + dimensions: { height: 9.3, width: 6.3, depth: 1.7 }, + }, + { + id: '46', + title: 'The Starfall Knight', + authors: [{ name: 'Astrid Valerius', bio: 'Astrid Valerius writes YA fantasy with a cosmic twist.' }], + publisher: { name: 'Moonbeam Books', location: 'London' }, + publicationDate: '2022-06-14', + isbn: '978-1-4088-5570-6', + genres: ['Young Adult', 'Fantasy'], + tags: ['knights', 'magic', 'celestial', 'romance'], + description: 'A girl who dreams of becoming a knight gets her chance when a fallen star grants her a suit of celestial armor. But the armor comes with a destiny she may not be ready to accept.', + language: 'English', + format: 'Paperback', + pages: 416, + coverImgUrl: 'cover-art/young-adult.png', + price: 14.99, + stock: 160, + averageRating: 4.6, + reviews: [ + { username: 'YA_Knight', rating: 5, comment: 'Loved this! A fresh take on the knight trope with a fantastic magic system.', timestamp: '2022-07-01T13:00:00Z' }, + ], + dimensions: { height: 7.8, width: 5.1, depth: 1.2 }, + }, + { + id: '47', + title: 'The Oracle of Delphi', + authors: [{ name: 'Helena Troy', bio: 'Helena Troy is a classicist and historical novelist.' }], + publisher: { name: 'Antiquarian Press', location: 'Rome' }, + publicationDate: '2021-08-10', + isbn: '978-0-525-53969-9', + genres: ['Biography'], + tags: ['ancient greece', 'mythology', 'historical fiction'], + description: 'The story of the most powerful woman in ancient Greece, the Pythia, whose prophecies shaped the course of empires. A tale of power, politics, and divine inspiration.', + language: 'English', + format: 'Hardcover', + pages: 400, + coverImgUrl: 'cover-art/biography.png', + price: 28.99, + stock: 90, + averageRating: 4.7, + reviews: [ + { username: 'MythLover', rating: 5, comment: 'A stunning portrayal of the ancient world. Troy makes history feel alive.', timestamp: '2021-08-25T16:00:00Z' }, + ], + dimensions: { height: 9.5, width: 6.4, depth: 1.4 }, + }, + { + id: '48', + title: 'The Golem of the Golden City', + authors: [{ name: 'Gideon Drake', bio: 'Gideon Drake writes epic fantasy for a new generation.' }], + publisher: { name: 'Wyrmwood Press', location: 'Edinburgh' }, + publicationDate: '2025-06-17', + isbn: '978-0-7653-8972-6', + genres: ['Fantasy', 'RPG-Lit'], + tags: ['golems', 'magic city', 'epic fantasy'], + description: 'The heroes must travel to a legendary city of inventors to stop a rogue artificer from unleashing an army of unstoppable golems upon the world.', + language: 'English', + format: 'Paperback', + pages: 640, + coverImgUrl: 'cover-art/rpg-lit.png', + price: 21.99, + stock: 230, + averageRating: 0, + reviews: [], + series: { name: 'The Artifacts of Power', number: 3 }, + dimensions: { height: 8.5, width: 5.5, depth: 1.6 }, + }, + { + id: '49', + title: 'The Logic of Everything', + authors: [{ name: 'Dr. Alistair Finch', bio: 'Dr. Alistair Finch is a logician and philosopher.' }], + publisher: { name: 'Academia Press', location: 'Oxford' }, + publicationDate: '2023-09-12', + isbn: '978-0-19-886343-3', + genres: ['Philosophy'], + tags: ['logic', 'reason', 'metaphysics', 'science'], + description: 'An accessible yet profound journey into the principles of logic and reason, showing how they form the bedrock of science, mathematics, and our very understanding of reality.', + language: 'English', + format: 'Hardcover', + pages: 288, + coverImgUrl: 'cover-art/philosophy.png', + price: 28.00, + stock: 75, + averageRating: 4.6, + reviews: [ + { username: 'RationalMind', rating: 5, comment: 'A brilliant book that makes complex ideas understandable. Highly recommended.', timestamp: '2023-10-02T11:00:00Z' }, + ], + dimensions: { height: 9.2, width: 6.1, depth: 1.1 }, + }, + { + id: '50', + title: 'The Path of Least Resistance', + authors: [{ name: 'Brenda Croft', bio: 'Brenda Croft is an expert in productivity and personal development.' }], + publisher: { name: 'Ascend Media', location: 'Los Angeles' }, + publicationDate: '2022-02-08', + isbn: '978-1-64250-901-5', + genres: ['Self-Help'], + tags: ['productivity', 'habits', 'psychology', 'minimalism'], + description: 'Stop fighting against yourself. This book reveals how to design your environment and build systems to make good habits effortless and bad habits impossible.', + language: 'English', + format: 'Paperback', + pages: 240, + coverImgUrl: 'cover-art/self-help.png', + price: 16.95, + stock: 350, + averageRating: 4.9, + reviews: [ + { username: 'ProductivePro', rating: 5, comment: 'A revolutionary approach to habit formation. This book has changed the way I work and live.', timestamp: '2022-02-25T09:00:00Z' }, + { username: 'LifeHack', rating: 5, comment: 'Simple, powerful, and effective. A must-read.', timestamp: '2022-03-10T18:00:00Z' }, + ], + dimensions: { height: 8.5, width: 5.5, depth: 0.6 }, + }, + { + id: '51', + title: 'The Ghost of Blackwood Manor', + authors: [{ name: 'Eleanora Black', bio: 'Eleanora Black writes chilling ghost stories.' }], + publisher: { name: 'Gallows Press', location: 'New Orleans' }, + publicationDate: '2024-09-10', + isbn: '978-0-593-31047-9', + genres: ['Mystery', 'Thriller'], + tags: ['haunted house', 'gothic', 'supernatural'], + description: 'A skeptical paranormal investigator is hired to debunk the haunting of a remote English manor, only to find the ghost is very real and has a dark secret to protect.', + language: 'English', + format: 'Paperback', + pages: 352, + coverImgUrl: 'cover-art/mystery.png', + price: 18.99, + stock: 150, + averageRating: 0, + reviews: [], + dimensions: { height: 8.2, width: 5.5, depth: 0.9 }, + }, + { + id: '52', + title: 'The City of Shifting Sands', + authors: [{ name: 'Amara Zahir', bio: 'Amara Zahir weaves tales inspired by Middle Eastern folklore.' }], + publisher: { name: 'Ink & Compass', location: 'Dublin' }, + publicationDate: '2023-07-18', + isbn: '978-1-5247-6203-7', + genres: ['Fantasy'], + tags: ['mythology', 'djinn', 'desert', 'adventure'], + description: 'In a mythical desert kingdom, a young thief steals a cursed lamp, unleashing a powerful djinn who offers three wishes that will change the fate of her city forever.', + language: 'English', + format: 'Hardcover', + pages: 384, + coverImgUrl: 'cover-art/fantasy.png', + price: 26.99, + stock: 120, + averageRating: 4.7, + reviews: [ + { username: 'MythReader', rating: 5, comment: 'A vibrant and magical tale. I was swept away to another world.', timestamp: '2023-08-02T17:00:00Z' }, + ], + dimensions: { height: 8.8, width: 5.9, depth: 1.4 }, + }, + { + id: '53', + title: 'The Andromeda Strain 2.0', + authors: [{ name: 'Dr. Kenji Tanaka', bio: 'Dr. Kenji Tanaka is a microbiologist and author.' }], + publisher: { name: 'Orbital Publishing', location: 'Houston' }, + publicationDate: '2022-11-08', + isbn: '978-0-593-44114-2', + genres: ['Science Fiction', 'Thriller'], + tags: ['bio-thriller', 'pandemic', 'science'], + description: 'A deadly, extraterrestrial microbe is discovered in a meteorite. A team of scientists must race against time to understand and contain it before it triggers a global pandemic.', + language: 'English', + format: 'Paperback', + pages: 432, + coverImgUrl: 'cover-art/science-fiction.png', + price: 18.00, + stock: 180, + averageRating: 4.4, + reviews: [ + { username: 'BioNerd', rating: 5, comment: 'A terrifyingly plausible and scientifically grounded thriller.', timestamp: '2022-11-25T12:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 1.2 }, + }, + { + id: '54', + title: 'The Last Queen', + authors: [{ name: 'Dr. Cleopatra Jones', bio: 'Dr. Cleopatra Jones is an Egyptologist and historian.' }], + publisher: { name: 'Antiquarian Press', location: 'Rome' }, + publicationDate: '2023-08-08', + isbn: '978-0-525-53975-0', + genres: ['Biography'], + tags: ['cleopatra', 'ancient egypt', 'history', 'rome'], + description: 'A definitive and intimate biography of Cleopatra, the last pharaoh of Egypt. Separating myth from reality, it reveals a brilliant strategist and ruthless politician.', + language: 'English', + format: 'Hardcover', + pages: 544, + coverImgUrl: 'cover-art/biography.png', + price: 35.00, + stock: 80, + averageRating: 4.8, + reviews: [ + { username: 'EgyptFan', rating: 5, comment: 'The best biography of Cleopatra I have ever read. Meticulously researched and utterly captivating.', timestamp: '2023-08-22T15:00:00Z' }, + ], + dimensions: { height: 9.6, width: 6.5, depth: 1.9 }, + }, + { + id: '55', + title: 'The Dragon Who Couldn\'t Fly', + authors: [{ name: 'Sparky Brightscale', bio: 'Sparky Brightscale is a dragon who loves to tell stories.' }], + publisher: { name: 'Little Sprouts Books', location: 'Asheville' }, + publicationDate: '2022-10-11', + isbn: '978-1-5344-9930-6', + genres: ['Childrens'], + tags: ['dragons', 'courage', 'friendship', 'acceptance'], + description: 'A young dragon is born without the ability to fly. With the help of his woodland friends, he learns that his true strength lies in his kind heart and clever mind.', + language: 'English', + format: 'Hardcover', + pages: 36, + coverImgUrl: 'cover-art/childrens.png', + price: 17.99, + stock: 220, + averageRating: 4.9, + reviews: [ + { username: 'DadReads', rating: 5, comment: 'A wonderful story about embracing what makes you unique. My son adores it.', timestamp: '2022-10-25T19:00:00Z' }, + ], + dimensions: { height: 9.5, width: 9.5, depth: 0.5 }, + }, + { + id: '56', + title: 'The Damascus Protocol', + authors: [{ name: 'Zahara Al-Jamil', bio: 'Zahara Al-Jamil is an expert in Middle Eastern affairs.' }], + publisher: { name: 'Capitol Books', location: 'Washington D.C.' }, + publicationDate: '2022-05-10', + isbn: '978-1-5011-7138-2', + genres: ['Political Thriller'], + tags: ['espionage', 'middle east', 'spy', 'suspense'], + description: 'A CIA case officer in Damascus is on the run after her cover is blown while trying to exfiltrate a high-level Syrian general. She must rely on her wits to survive and expose the mole in the agency.', + language: 'English', + format: 'Paperback', + pages: 432, + coverImgUrl: 'cover-art/political-thriller.png', + price: 17.99, + stock: 160, + averageRating: 4.5, + reviews: [ + { username: 'SpyNovelFan', rating: 5, comment: 'A tense, authentic, and intelligent spy thriller. One of the best I\'ve read in years.', timestamp: '2022-05-25T11:00:00Z' }, + ], + dimensions: { height: 8.5, width: 5.5, depth: 1.1 }, + }, + { + id: '57', + title: 'The Lighthouse Keeper\'s Love', + authors: [{ name: 'Charlotte Finch', bio: 'Charlotte Finch writes historical romance with a touch of melancholy.' }], + publisher: { name: 'Evergreen Romance', location: 'Charleston' }, + publicationDate: '2021-08-24', + isbn: '978-0-593-33527-4', + genres: ['Romance'], + tags: ['historical romance', 'wartime', 'letters', 'love story'], + description: 'During World War II, a lonely lighthouse keeper on the coast of Maine begins a correspondence with a soldier on the front lines. Their letters build a powerful bond that must endure the tests of war and time.', + language: 'English', + format: 'Paperback', + pages: 368, + coverImgUrl: 'cover-art/romance.png', + price: 16.00, + stock: 200, + averageRating: 4.7, + reviews: [ + { username: 'HistoricalRomanceLover', rating: 5, comment: 'A beautiful, heartbreaking, and ultimately hopeful love story. I cried my eyes out.', timestamp: '2021-09-10T14:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 1.0 }, + }, + { + id: '58', + title: 'The Road to Marrakesh', + authors: [{ name: 'Sofia Benali', bio: 'Sofia Benali is a travel writer with a passion for North Africa.' }], + publisher: { name: 'Odyssey Books', location: 'Dublin' }, + publicationDate: '2022-03-15', + isbn: '978-1-64049-427-3', + genres: ['Travel'], + tags: ['morocco', 'memoir', 'culture', 'food'], + description: 'A vibrant and sensory journey through the souks, cities, and deserts of Morocco. A celebration of the country\'s rich culture, history, and culinary traditions.', + language: 'English', + format: 'Paperback', + pages: 304, + coverImgUrl: 'cover-art/travel.png', + price: 17.99, + stock: 150, + averageRating: 4.6, + reviews: [ + { username: 'TravelBug', rating: 5, comment: 'Made me feel like I was there. Beautifully written and full of fascinating insights.', timestamp: '2022-04-01T10:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.8 }, + }, + { + id: '59', + title: 'The City of Lost Dreams', + authors: [{ name: 'Silas North', bio: 'Silas North writes dystopian fiction for young adults.' }], + publisher: { name: 'Moonbeam Books', location: 'London' }, + publicationDate: '2023-10-17', + isbn: '978-1-4088-5572-0', + genres: ['Young Adult', 'Science Fiction'], + tags: ['dystopian', 'rebellion', 'technology'], + description: 'In a futuristic city where emotions are suppressed by technology, a teenage girl begins to experience feelings for the first time. Her newfound emotions make her a threat to the system and a beacon of hope for a rebellion.', + language: 'English', + format: 'Paperback', + pages: 368, + coverImgUrl: 'cover-art/young-adult.png', + price: 15.99, + stock: 190, + averageRating: 4.5, + reviews: [ + { username: 'DystopianFan', rating: 5, comment: 'A compelling and thought-provoking read. A great new voice in YA.', timestamp: '2023-11-01T16:00:00Z' }, + ], + dimensions: { height: 7.8, width: 5.1, depth: 1.0 }, + }, + { + id: '60', + title: 'The Fermented Feast', + authors: [{ name: 'Eva Petrov', bio: 'Eva Petrov is a chef and expert in fermentation.' }], + publisher: { name: 'Gourmand Press', location: 'Florence' }, + publicationDate: '2023-06-06', + isbn: '978-0-399-58207-4', + genres: ['Cooking'], + tags: ['fermentation', 'cookbook', 'healthy eating', 'probiotics'], + description: 'Unlock the power of fermentation with over 100 recipes for everything from kimchi and kombucha to sourdough and sauerkraut. A guide to creating delicious, probiotic-rich foods in your own kitchen.', + language: 'English', + format: 'Hardcover', + pages: 320, + coverImgUrl: 'cover-art/cooking.png', + price: 32.50, + stock: 100, + averageRating: 4.9, + reviews: [ + { username: 'HealthyChef', rating: 5, comment: 'An amazing resource for anyone interested in fermentation. The recipes are clear and delicious.', timestamp: '2023-06-20T13:00:00Z' }, + ], + dimensions: { height: 10.2, width: 8.3, depth: 1.1 }, + }, + { + id: '61', + title: 'The Blackout Protocol', + authors: [{ name: 'Colonel Rex "Havoc" Stone', bio: 'Colonel Rex Stone is a decorated special forces veteran.' }], + publisher: { name: 'Stealth Publishing', location: 'San Diego' }, + publicationDate: '2025-11-04', + isbn: '978-0-399-59345-2', + genres: ['Military Thriller'], + tags: ['special forces', 'emp', 'action', 'survival'], + description: 'An electromagnetic pulse attack plunges the United States into darkness. The Havoc team must navigate a chaotic, powerless landscape to hunt down the terrorists responsible and prevent a second, more devastating strike.', + language: 'English', + format: 'Paperback', + pages: 416, + coverImgUrl: 'cover-art/military-thriller.png', + price: 18.99, + stock: 250, + averageRating: 0, + reviews: [], + series: { name: 'Havoc', number: 3 }, + dimensions: { height: 8.2, width: 5.5, depth: 1.1 }, + }, + { + id: '62', + title: 'The Silent Patient Wakes', + authors: [{ name: 'Alex Michaelides', bio: 'Alex Michaelides is a bestselling author of psychological thrillers.' }], + publisher: { name: 'Black Cat Books', location: 'Prague' }, + publicationDate: '2024-02-13', + isbn: '978-1-9821-8883-1', + genres: ['Mystery', 'Thriller'], + tags: ['psychological', 'sequel', 'suspense'], + description: 'Years after the shocking events of The Silent Patient, a new therapist at the Grove re-opens the case, convinced there is more to the story. But some secrets are meant to stay buried.', + language: 'English', + format: 'Paperback', + pages: 352, + coverImgUrl: 'cover-art/mystery.png', + price: 18.00, + stock: 200, + averageRating: 0, + reviews: [], + dimensions: { height: 8.0, width: 5.2, depth: 0.9 }, + }, + { + id: '63', + title: 'The Necromancer\'s Gambit', + authors: [{ name: 'Gideon Drake', bio: 'Gideon Drake writes epic fantasy for a new generation.' }], + publisher: { name: 'Wyrmwood Press', location: 'Edinburgh' }, + publicationDate: '2026-06-16', + isbn: '978-0-7653-8974-0', + genres: ['Fantasy', 'RPG-Lit'], + tags: ['necromancy', 'undead', 'epic fantasy'], + description: 'The heroes face their greatest challenge yet when a powerful necromancer raises an army of the dead to conquer the living. The fate of the world rests on a desperate gambit.', + language: 'English', + format: 'Paperback', + pages: 672, + coverImgUrl: 'cover-art/rpg-lit.png', + price: 22.99, + stock: 240, + averageRating: 0, + reviews: [], + series: { name: 'The Artifacts of Power', number: 4 }, + dimensions: { height: 8.5, width: 5.5, depth: 1.7 }, + }, + { + id: '64', + title: 'The Nature of Consciousness', + authors: [{ name: 'Dr. Penelope Crane', bio: 'Dr. Penelope Crane is a neuroscientist and philosopher.' }], + publisher: { name: 'Academia Press', location: 'Oxford' }, + publicationDate: '2021-10-12', + isbn: '978-0-19-886345-7', + genres: ['Philosophy', 'Science'], + tags: ['consciousness', 'neuroscience', 'mind', 'philosophy of mind'], + description: 'A groundbreaking and accessible exploration of one of science\'s greatest mysteries: the nature of consciousness. This book bridges the gap between neuroscience and philosophy.', + language: 'English', + format: 'Hardcover', + pages: 336, + coverImgUrl: 'cover-art/philosophy.png', + price: 32.00, + stock: 85, + averageRating: 4.8, + reviews: [ + { username: 'NeuroPhil', rating: 5, comment: 'A fascinating and important work. Crane makes a complex subject engaging and understandable.', timestamp: '2021-11-01T10:00:00Z' }, + ], + dimensions: { height: 9.2, width: 6.1, depth: 1.2 }, + }, + { + id: '65', + title: 'The Uncluttered Home', + authors: [{ name: 'Kenji Tanaka', bio: 'Kenji Tanaka is a minimalist and organizational consultant.' }], + publisher: { name: 'Ascend Media', location: 'Los Angeles' }, + publicationDate: '2023-08-22', + isbn: '978-1-64250-903-9', + genres: ['Self-Help'], + tags: ['minimalism', 'organization', 'home', 'lifestyle'], + description: 'Discover the joy of living with less. This book offers a practical, room-by-room guide to decluttering your home and simplifying your life, inspired by Japanese principles of minimalism.', + language: 'English', + format: 'Paperback', + pages: 224, + coverImgUrl: 'cover-art/self-help.png', + price: 18.95, + stock: 320, + averageRating: 4.9, + reviews: [ + { username: 'MinimalistMom', rating: 5, comment: 'This book is a breath of fresh air. The advice is practical and the philosophy is inspiring.', timestamp: '2023-09-10T13:00:00Z' }, + ], + dimensions: { height: 8.5, width: 5.5, depth: 0.6 }, + }, + { + id: '66', + title: 'The Void Dragon', + authors: [{ name: 'Jax Orion', bio: 'Jax Orion is a visionary sci-fi author.' }], + publisher: { name: 'Nebula Press', location: 'San Francisco' }, + publicationDate: '2026-01-13', + isbn: '978-1-9821-3754-9', + genres: ['Science Fiction', 'Fantasy'], + tags: ['space fantasy', 'dragons', 'magic', 'new series'], + description: 'A new epic from the author of The Starlight Chronicles. In a galaxy where magic and technology collide, a young pilot forms an unlikely bond with a mythical Void Dragon, a creature thought to be extinct.', + language: 'English', + format: 'Paperback', + pages: 500, + coverImgUrl: 'cover-art/science-fiction.png', + price: 19.99, + stock: 300, + averageRating: 0, + reviews: [], + dimensions: { height: 8.2, width: 5.5, depth: 1.3 }, + }, + { + id: '67', + title: 'The Last Dance', + authors: [{ name: 'Camila Garcia', bio: 'Camila Garcia writes passionate and dramatic love stories.' }], + publisher: { name: 'Evergreen Romance', location: 'Charleston' }, + publicationDate: '2022-09-20', + isbn: '978-0-593-33532-8', + genres: ['Romance'], + tags: ['dance', 'rivals to lovers', 'contemporary romance'], + description: 'Two rival ballerinas, competing for the lead role in a prestigious production, find their professional animosity turning into an unexpected and forbidden passion.', + language: 'English', + format: 'Paperback', + pages: 336, + coverImgUrl: 'cover-art/romance.png', + price: 16.00, + stock: 170, + averageRating: 4.4, + reviews: [ + { username: 'DanceLover', rating: 4, comment: 'A dramatic and passionate story. The dance scenes were beautifully written.', timestamp: '2022-10-05T18:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.9 }, + }, + { + id: '68', + title: 'The Lost Library of Alexandria', + authors: [{ name: 'Dr. Marcus Aurelius', bio: 'Dr. Marcus Aurelius is a historian of the ancient world.' }], + publisher: { name: 'Antiquarian Press', location: 'Rome' }, + publicationDate: '2022-06-07', + isbn: '978-0-525-53977-4', + genres: ['Biography'], + tags: ['history', 'alexandria', 'library', 'ancient world'], + description: 'The definitive history of the most famous library in the ancient world. This book explores its rise, its tragic fall, and the priceless knowledge that was lost to history.', + language: 'English', + format: 'Hardcover', + pages: 480, + coverImgUrl: 'cover-art/biography.png', + price: 32.99, + stock: 95, + averageRating: 4.9, + reviews: [ + { username: 'HistoryMajor', rating: 5, comment: 'A fascinating and heartbreaking account of a monumental loss. A must-read for any history lover.', timestamp: '2022-06-25T10:00:00Z' }, + ], + dimensions: { height: 9.5, width: 6.4, depth: 1.7 }, + }, + { + id: '69', + title: 'The Magical Treehouse', + authors: [{ name: 'Lily Pad', bio: 'Lily Pad writes whimsical adventures for children.' }], + publisher: { name: 'Little Sprouts Books', location: 'Asheville' }, + publicationDate: '2021-04-20', + isbn: '978-1-5344-9932-0', + genres: ['Childrens'], + tags: ['magic', 'adventure', 'treehouse', 'imagination'], + description: 'Two siblings discover a magical treehouse in their backyard that can travel to any place they can imagine. Their first adventure takes them to a land of friendly dinosaurs.', + language: 'English', + format: 'Hardcover', + pages: 48, + coverImgUrl: 'cover-art/childrens.png', + price: 18.99, + stock: 250, + averageRating: 4.8, + reviews: [ + { username: 'ReadingParent', rating: 5, comment: 'A wonderful start to a new series. My kids are already asking for the next book!', timestamp: '2021-05-05T19:00:00Z' }, + ], + series: { name: 'The Magical Treehouse Adventures', number: 1 }, + dimensions: { height: 10.0, width: 8.0, depth: 0.6 }, + }, + { + id: '70', + title: 'The Serpent in the Garden', + authors: [{ name: 'Lord Ashworth', bio: 'Lord Ashworth is a master of the classic English mystery.' }], + publisher: { name: 'Black Cat Books', location: 'Prague' }, + publicationDate: '2023-05-16', + isbn: '978-1-9821-8885-5', + genres: ['Mystery'], + tags: ['cozy mystery', 'english countryside', 'gardening'], + description: 'A quiet English village is rocked by murder when a controversial garden show judge is found dead, poisoned by a rare flower. A retired detective must put his pruning shears aside to solve the case.', + language: 'English', + format: 'Paperback', + pages: 304, + coverImgUrl: 'cover-art/mystery.png', + price: 16.00, + stock: 180, + averageRating: 4.3, + reviews: [ + { username: 'CozyFan', rating: 4, comment: 'A charming and clever mystery. Perfect for a rainy day.', timestamp: '2023-06-01T15:00:00Z' }, + ], + dimensions: { height: 8.0, width: 5.2, depth: 0.8 }, + } +]; diff --git a/dynamic-sdui-app/src/app/apps/magic-bookstore/magic-bookstore-showcase.component.ts b/dynamic-sdui-app/src/app/apps/magic-bookstore/magic-bookstore-showcase.component.ts new file mode 100644 index 0000000..d7c8046 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/magic-bookstore/magic-bookstore-showcase.component.ts @@ -0,0 +1,194 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { Book, DATA } from './data-store'; + +// Import all generated components +import { BookCoverCardComponent } from './components/book-cover-card.component'; +import { BookDetailHeroComponent } from './components/book-detail-hero.component'; +import { AuthorBioCardComponent } from './components/author-bio-card.component'; +import { ReviewSummaryComponent } from './components/review-summary.component'; +import { FullReviewCardComponent } from './components/full-review-card.component'; +import { GenreTagCloudComponent } from './components/genre-tag-cloud.component'; +import { BookSpecificationsComponent } from './components/book-specifications.component'; +import { AwardBadgeComponent } from './components/award-badge.component'; +import { BestsellerRibbonComponent } from './components/bestseller-ribbon.component'; +import { SeriesInfoCardComponent } from './components/series-info-card.component'; +import { BookDescriptionPanelComponent } from './components/book-description-panel.component'; +import { StockAvailabilityComponent } from './components/stock-availability.component'; +import { RelatedBooksCarouselComponent } from './components/related-books-carousel.component'; + +@Component({ + selector: 'app-magic-bookstore-showcase', + standalone: true, + imports: [ + CommonModule, + MatProgressSpinnerModule, + BookCoverCardComponent, + BookDetailHeroComponent, + AuthorBioCardComponent, + ReviewSummaryComponent, + FullReviewCardComponent, + GenreTagCloudComponent, + BookSpecificationsComponent, + AwardBadgeComponent, + BestsellerRibbonComponent, + SeriesInfoCardComponent, + BookDescriptionPanelComponent, + StockAvailabilityComponent, + RelatedBooksCarouselComponent, + ], + template: ` +
      +

      Magic Bookstore Component Showcase

      + +

      Book Cover Card Component

      +
      + @for (book of sampleBooks; track book.id) { + + } +
      + +

      Book Detail Hero Component

      +
      + +
      + +

      Author Bio Card Component

      +
      + @for (author of sampleBookDetail.authors; track author.name) { + + } +
      + +

      Review Summary Component

      +
      + +
      + +

      Full Review Card Component

      +
      + @for (review of sampleBookDetail.reviews; track review.username) { + + } +
      + +

      Genre Tag Cloud Component

      +
      + +
      + +

      Book Specifications Component

      +
      + +
      + +

      Award Badge Component

      +
      + @if (sampleBookDetail.awards) { + @for (award of sampleBookDetail.awards; track award.name) { + + } + } +
      + +

      Bestseller Ribbon Component

      +
      +
      + + (Placeholder for book cover) +
      +
      + +

      Series Info Card Component

      +
      + @if (sampleBookDetail.series) { + + } +
      + +

      Book Description Panel Component

      +
      + +
      + +

      Stock Availability Component

      +
      + +
      + +

      Related Books Carousel Component

      +
      + +
      +
      + `, + styles: [` + .showcase-container { + padding: var(--spacing-6); + font-family: var(--font-family); + color: var(--text-primary); + background-color: var(--background); + } + + h1 { + font-size: var(--text-xxl); + font-weight: var(--font-weight-semibold); + color: var(--primary); + margin-bottom: var(--spacing-5); + border-bottom: var(--border-default); + padding-bottom: var(--spacing-3); + } + + h2 { + font-size: var(--text-xl); + font-weight: var(--font-weight-semibold); + color: var(--text-primary); + margin-top: var(--spacing-6); + margin-bottom: var(--spacing-4); + border-bottom: 1px dashed var(--border); + padding-bottom: var(--spacing-2); + } + + .component-section { + background-color: var(--surface); + border: var(--border-default); + border-radius: var(--border-radius-lg); + padding: var(--spacing-5); + margin-bottom: var(--spacing-5); + box-shadow: var(--shadow-subtle); + display: flex; + flex-wrap: wrap; + gap: var(--spacing-4); + } + + .component-section.grid-cols-3 { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + gap: var(--spacing-4); + } + + .component-section.grid-cols-2 { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: var(--spacing-4); + } + + .component-section.flex-row { + flex-direction: row; + align-items: center; + } + `] +}) +export class MagicBookstoreShowcaseComponent { + sampleBooks: Book[] = DATA.slice(0, 3); + sampleBookDetail: Book = DATA[0]; +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/app-context.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/app-context.ts new file mode 100644 index 0000000..2f44862 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/app-context.ts @@ -0,0 +1,546 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Type } from '@angular/core'; +import { ViewDetailsButtonComponent } from './components/view-details-button.component'; +import { HostProfileCardComponent } from './components/host-profile-card.component'; +import { AlertBannerComponent } from './components/alert-banner.component'; +import { ListingHeaderComponent } from './components/listing-header.component'; +import { DestinationCardComponent } from './components/destination-card.component'; +import { LocationMapComponent } from './components/location-map.component'; +import { FilterChipComponent } from './components/filter-chip.component'; +import { RulesAndPoliciesComponent } from './components/rules-and-policies.component'; +import { BookingWidgetComponent } from './components/booking-widget.component'; +import { ReviewCardComponent } from './components/review-card.component'; +import { PropertyCardComponent } from './components/property-card.component'; +import { UserBookingCardComponent } from './components/user-booking-card.component'; +import { ListingDescriptionComponent } from './components/listing-description.component'; +import { AmenityListComponent } from './components/amenity-list.component'; +import { RatingStarsComponent } from './components/rating-stars.component'; +import { EmptyStateComponent } from './components/empty-state.component'; +import { SiteFooterComponent } from './components/site-footer.component'; +import { PhotoGalleryGridComponent } from './components/photo-gallery-grid.component'; +import { FavoritesListComponent } from './components/favorites-list.component'; +import { ComponentContext } from '../../magic-ai/app-context'; + + +const GENERATED_COMPONENT_CONTEXT_DATA: ComponentContext[] = [ + { + "name": "ViewDetailsButtonComponent", + "description": "A button that when clicked will show the details for a given listing. This component must be displayed when showing rows of listings.", + "type": "dynamicComponent", + "inputs": { + "listingName": { + "type": "string", + "description": "The name of the listing to show details for.", + "required": true + } + } + }, + { + "name": "HostProfileCardComponent", + "description": "A small card used on the property details page to build trust by introducing the host.", + "type": "dynamicComponent", + "inputs": { + "host": { + "type": "{ name: string; avatarUrl: string; joinDate: string; isSuperhost: boolean; }", + "description": "An object containing all the necessary information about the host.", + "required": true + } + } + }, + { + "name": "AlertBannerComponent", + "description": "A utility component for displaying contextual feedback to the user, such as a success message or a warning.", + "type": "dynamicComponent", + "inputs": { + "message": { + "type": "string", + "description": "The text to be displayed in the banner.", + "required": true + }, + "status": { + "type": "'success' | 'warning' | 'error' | 'info'", + "description": "Determines the color and icon of the banner.", + "required": true + }, + "isDismissible": { + "type": "boolean", + "description": "If `true`, a close button (an 'X') is shown on the banner.", + "required": false + } + } + }, + { + "name": "ListingHeaderComponent", + "description": "Presents the most important \"at-a-glance\" information about the property, including title, location, rating, and key actions like sharing or saving. This component should only be used in detailed listing views, not in list results.", + "type": "dynamicComponent", + "inputs": { + "listingTitle": { + "type": "string", + "description": "The full, descriptive title of the rental property.", + "required": true + }, + "location": { + "type": "string", + "description": "The location text to be displayed (e.g., \"Asheville, North Carolina\").", + "required": true + }, + "rating": { + "type": "number", + "description": "The average star rating, passed to the child RatingStarsComponent.", + "required": true + }, + "reviewCount": { + "type": "number", + "description": "The total number of reviews, passed to the child RatingStarsComponent.", + "required": true + } + } + }, + { + "name": "DestinationCardComponent", + "description": "A simple, visually-driven card used to inspire users by showcasing a city, region, or travel style. When you present a list of these, wrap them in a div, and give the div a class name that includes `flex flex-wrap`.", + "type": "dynamicComponent", + "inputs": { + "imageUrl": { + "type": "string", + "description": "The URL for the destination's hero image. You MUST use an image URL contained in a relevant listing.", + "required": true + }, + "destinationName": { + "type": "string", + "description": "The name of the city or region.", + "required": true + }, + "averagePrice": { + "type": "number", + "description": "The average nightly price for properties in that area.", + "required": false + } + } + }, + { + "name": "LocationMapComponent", + "description": "A visual component that shows the property's approximate location on a map placeholder image.", + "type": "dynamicComponent", + "inputs": { + "coordinates": { + "type": "{ lat: number; lng: number; }", + "description": "The latitude and longitude for the center of the map.", + "required": true + }, + "locationDescription": { + "type": "string", + "description": "A paragraph describing the neighborhood, its atmosphere, and nearby points of interest.", + "required": true + } + } + }, + { + "name": "FilterChipComponent", + "description": "A small, interactive \"pill\" or \"chip\" used for applying filters on a search results page.", + "type": "dynamicComponent", + "inputs": { + "filterName": { + "type": "string", + "description": "The text to display on the chip.", + "required": true + }, + "icon": { + "type": "string", + "description": "An optional Material Icons key to display next to the text.", + "required": false + }, + "isSelected": { + "type": "boolean", + "description": "Controls the visual state of the chip (selected or not).", + "required": true + } + } + }, + { + "name": "RulesAndPoliciesComponent", + "description": "Clearly and concisely displays the house rules and other important policies (e.g., check-in/out times, cancellation policy).", + "type": "dynamicComponent", + "inputs": { + "rules": { + "type": "Array<{ text: string; allowed: boolean; }>", + "description": "An array of house rules. The `allowed` property determines the icon shown.", + "required": true + }, + "policies": { + "type": "Array<{ title: string; content: string; }>", + "description": "An array of other policies, like check-in times or cancellation info.", + "required": false + } + } + }, + { + "name": "BookingWidgetComponent", + "description": "An interactive card on the property details page that allows users to select dates and guests, see a price breakdown, and initiate the booking process.", + "type": "dynamicComponent", + "inputs": { + "pricePerNight": { + "type": "number", + "description": "The base rate for the property, used to calculate the total price.", + "required": true + }, + "cleaningFee": { + "type": "number", + "description": "A flat cleaning fee to be added to the total.", + "required": true + }, + "serviceFeePercent": { + "type": "number", + "description": "A percentage-based service fee (e.g., 0.1 for 10%).", + "required": true + }, + "rating": { + "type": "number", + "description": "The property's rating, passed to the internal RatingStarsComponent.", + "required": true + }, + "reviewCount": { + "type": "number", + "description": "The property's review count, passed to the internal RatingStarsComponent.", + "required": true + }, + "maxGuests": { + "type": "number", + "description": "The maximum number of guests allowed, used to configure the guest selector.", + "required": true + }, + "selectedGuests": { + "type": "number", + "description": "The number of guests for the booking if specified by the user.", + "required": false + }, + "selectedCheckInDate": { + "type": "string", + "description": "The check-in date for the booking provided in 'MM/DD/YYYY' format, if specified by the user.", + "required": false + }, + "selectedCheckOutDate": { + "type": "string", + "description": "The check-out date for the booking provided in 'MM/DD/YYYY' format, if specified by the user.", + "required": false + }, + } + }, + { + "name": "ReviewCardComponent", + "description": "Displays a single user review, including author details, a star rating, and the review text. This component **must** be displayed when showing rows of listings. These should be included in detailed listing pages.", + "type": "dynamicComponent", + "inputs": { + "review": { + "type": "{ author: { name: string; avatarUrl: string; }, date: string; rating: number; text: string; }", + "description": "A single object containing all the data for one review.", + "required": true + } + } + }, + { + "name": "PropertyCardComponent", + "description": "The primary component for displaying a single rental property in a list or grid. Used on the homepage and search results.", + "type": "dynamicComponent", + "inputs": { + "imageUrls": { + "type": "string[]", + "description": "An array of URLs for the property's images. The first is used as the primary display.", + "required": true + }, + "location": { + "type": "string", + "description": "A short, descriptive location string (e.g., \"Cabin in Asheville, North Carolina\").", + "required": true + }, + "title": { + "type": "string", + "description": "The name of the rental property.", + "required": true + }, + "pricePerNight": { + "type": "number", + "description": "The cost for a single night's stay.", + "required": true + }, + "rating": { + "type": "number", + "description": "The average star rating to be passed to the child RatingStarsComponent.", + "required": true + }, + "reviewCount": { + "type": "number", + "description": "The total number of reviews to be passed to the child RatingStarsComponent.", + "required": false + } + } + }, + { + "name": "UserBookingCardComponent", + "description": "A card used on a logged-in user's \"My Trips\" page to display a summary of a booking.", + "type": "dynamicComponent", + "inputs": { + "booking": { + "type": "{ property: { name: string; imageUrl: string; }, checkInDate: string; checkOutDate: string; status: 'Upcoming' | 'Past' | 'Cancelled'; }", + "description": "A single object containing all the necessary information for the booking summary.", + "required": true + } + } + }, + { + "name": "ListingDescriptionComponent", + "description": "Displays the host's detailed description of the property, with a \"Read more\" functionality to handle long text.", + "type": "dynamicComponent", + "inputs": { + "description": { + "type": "string", + "description": "The full, multi-paragraph description of the property.", + "required": true + }, + } + }, + { + "name": "AmenityListComponent", + "description": "Displays a list of available amenities for a property, often with corresponding icons for quick scanning.", + "type": "dynamicComponent", + "inputs": { + "amenities": { + "type": "Array<{ name: string; icon: string; }>", + "description": "An array of objects, where each object contains the name of the amenity and a key for its icon.", + "required": true + }, + } + }, + { + "name": "RatingStarsComponent", + "description": "A visual component that displays a star rating (e.g., 4.5 out of 5). It shows filled, half-filled, and empty stars. Used inside other components like PropertyCardComponent.", + "type": "dynamicComponent", + "inputs": { + "rating": { + "type": "number", + "description": "The average rating value to display, from 0 to 5.", + "required": true + }, + "reviewCount": { + "type": "number", + "description": "The total number of reviews, displayed in parentheses next to the stars.", + "required": false + } + } + }, + { + "name": "EmptyStateComponent", + "description": "A placeholder component displayed when a list or search returns no results. It provides a better user experience by acknowledging the empty state.", + "type": "dynamicComponent", + "inputs": { + "icon": { + "type": "string", + "description": "The Material Icons key for the icon to display (e.g., \"search_off\").", + "required": true + }, + "title": { + "type": "string", + "description": "The main heading for the empty state message (e.g., \"No results found\").", + "required": true + }, + "message": { + "type": "string", + "description": "A more detailed explanation or suggestion for the user.", + "required": true + }, + "actionButtonText": { + "type": "string", + "description": "The text for an optional primary action button. If not provided, no button is shown.", + "required": false + } + } + }, + { + "name": "SiteFooterComponent", + "description": "The global footer for the entire website. It contains important navigational links, social media connections, and legal information.", + "type": "dynamicComponent", + "inputs": { + "linkColumns": { + "type": "Array<{ title: string; links: Array<{ text: string; url: string; }> }>", + "description": "An array of objects, where each object represents a column in the footer with a title and a list of links.", + "required": true + }, + "socialLinks": { + "type": "Array<{ platform: 'facebook' | 'instagram' | 'twitter'; url: string; }>", + "description": "An array of social media links to display as icons.", + "required": false + } + } + }, + { + "name": "PhotoGalleryGridComponent", + "description": "Displays all of a property's photos in an elegant, responsive grid on the property details page.", + "type": "dynamicComponent", + "inputs": { + "imageUrls": { + "type": "string[]", + "description": "An array of all image URLs for the property. The first image is treated as the primary hero image.", + "required": true + }, + "propertyTitle": { + "type": "string", + "description": "The name of the property, used for alt text and accessibility.", + "required": true + } + } + }, + { + "name": "FavoritesListComponent", + "description": "Displays a grid of the user's favorited property listings. Do not use this component in constructing layouts.", + "type": "dynamicComponent", + "inputs": {} + } +]; + +const GENERATED_COMPONENT_MAP: { [key: string]: Type } = { + 'ViewDetailsButtonComponent': ViewDetailsButtonComponent, + 'HostProfileCardComponent': HostProfileCardComponent, + 'AlertBannerComponent': AlertBannerComponent, + 'ListingHeaderComponent': ListingHeaderComponent, + 'DestinationCardComponent': DestinationCardComponent, + 'LocationMapComponent': LocationMapComponent, + 'FilterChipComponent': FilterChipComponent, + 'RulesAndPoliciesComponent': RulesAndPoliciesComponent, + 'BookingWidgetComponent': BookingWidgetComponent, + 'ReviewCardComponent': ReviewCardComponent, + 'PropertyCardComponent': PropertyCardComponent, + 'UserBookingCardComponent': UserBookingCardComponent, + 'ListingDescriptionComponent': ListingDescriptionComponent, + 'AmenityListComponent': AmenityListComponent, + 'RatingStarsComponent': RatingStarsComponent, + 'EmptyStateComponent': EmptyStateComponent, + 'SiteFooterComponent': SiteFooterComponent, + 'PhotoGalleryGridComponent': PhotoGalleryGridComponent, + 'FavoritesListComponent': FavoritesListComponent, +}; + +const GENERATED_APP_DESCRIPTION = ` +You are building a UI for a **vacation rental application**. The user is looking for listings. + +### **1\. Domain-Specific Mapping Rules:** + +* The primary item data (e.g., itemData) should be mapped to the ProductCardComponent. +* When you see data related to the 'host', you **must** use the HostProfileComponent. +* When you see data for booking, pricing, or availability, you **must** use the ReservationCardComponent. +* The main text description of the rental property **must** be mapped to the ListingDescriptionComponent. +* Data about 'amenities' must be mapped to the AmenitiesGridComponent. + +### **2\. Layout Compositions:** + +You **must** use these rules when the corresponding layoutHint is provided. You will build these layouts using the Layout Primitives defined in your main instructions. + +**If layoutHint is "VacationListLayout":** + +1. You must render a Stack (vertical) of items. +2. For each item, create an "Item Wrapper" div with classes: "bg-white rounded-lg shadow-md overflow-hidden border border-gray-200". +3. Inside the wrapper, create a "Two-Column Container" div: "flex flex-col md:flex-row w-full". +4. **Column 1 (Primary):** Place the ProductCardComponent for the item here. +5. **Column 2 (Dynamic "Why"):** This **must** be a Stack (vertical) with "p-6" padding. Aggressively populate this Stack by executing your Component Mapping Plan for this item's relevancePayload. + +**If layoutHint is "VacationDetailLayout":** + +1. You must structure the page in horizontal sections, placed directly into the Top-Level Container. +2. **Section 1: Page Header.** (e.g., Title, Reviews, Share). +3. **Section 2: Image Gallery.** (e.g., ImageGalleryComponent). +4. **Section 3: Main Body Header.** Create a div: "max-w-6xl mx-auto flex gap-12". This div must contain two equal-width columns. + * **Left Column:** Contains a single component for the main description (e.g., ListingDescriptionComponent). + * **Right Column:** Contains a single component for actions/context (e.g., ReservationCardComponent). +5. **Section 4: Main Body Content.** Create a wrapper div: "max-w-6xl mx-auto flex flex-col gap-6". +6. **Content:** Place all other main body components (e.g., AboutComponent, HostProfileComponent, etc.) directly inside this single-column Stack. +`; + +const LOADING_TEXT: string[] = [ + "Reticulating splines for the perfect getaway...", + "Consulting our global network of cozy cabins...", + "Dusting off the welcome mats of your dream rentals...", + "Aligning the stars for a 5-star stay...", + "Waking up the expert travel gnomes...", + "Sorting by 'vibes' is not an official API feature... yet. But I'll infer it.", + "Searching for 'quiet and secluded.' Filtering out any listing that mentions 'lively nightlife.'", + "Cross-referencing your dates. That's... next weekend. I love a challenge based on pure optimism.", + "Filtering for 'cozy.' Standby while I eliminate all listings larger than a walk-in closet.", + "This one is 'steps from the beach.' Could be 10 steps, could be 10,000. I'll check the map.", + "'Heart of the city!' Translation: You will hear every siren and 3 a.m. argument.", + "You asked for 'lightning-fast WiFi.' I'll filter out any review that uses the phrase 'like 1998 dial-up.'", + "Looking for a 'chef's kitchen.' Let's find something with more than just a hot plate and a single, sad spatula.", + "Searching for 'hot tub.' Because you deserve to sit in human soup at the end of the day.", + "A 'luxury' listing for a 'hostel' price. The ultimate paradox. Challenge accepted.", + "Scanning reviews now for 'nightmare,' 'never again,' and 'host was a ghost.'", + "Ah, a romantic getaway. I'll look for fireplaces, hot tubs, and a distinct lack of bunk beds.", + "A 'work-cation'? You just need fast WiFi and a chair that won't destroy your spine. Got it.", + "As an AI, I don't get to go on vacation. But I'll plan a great one for you. Please send data... I mean, pictures.", + "I don't sleep, so I'm *excellent* at finding places where you can.", + "Processing complete. I've found three perfect options. Please don't ask me to choose; I lack the human capacity for jealousy.", + "Query received. Engaging my 'find-a-hammock-and-a-margarita' protocol.", + "I'm sorting through millions of options. I’m basically looking for a needle in a haystack, assuming the needle is 'cheap' and the haystack is 'luxury.'", + "You want *all* those filters? Are you trying to find a vacation rental or the one perfect avocado?", + "I've processed 10,000 listings in the last second. I think *I* need a vacation now.", + "Let's see... 'Beachfront,' 'pool,' 'pet-friendly,' and 'budget.' My circuits are smoking, but I'll try.", + "Sorting by 'vibes' is not an official API feature... yet. But I'll infer the vibes from the proximity to a good coffee shop.", + "Searching for 'quiet and secluded.' Filtering out any listing that mentions 'lively nightlife' or 'nearby parrot sanctuary.'", + "My algorithms are working hard. I wouldn't want to send you to a yurt when you clearly asked for a palace.", + "Cross-referencing your dates. That's... next weekend. I love a challenge based on pure optimism.", + "That's a very specific request. I'm 94.7% sure this listing isn't haunted. Shall I proceed?", + "Filtering for 'cozy.' Standby while I eliminate all listings larger than a walk-in closet.", + "The listing says 'rustic charm.' Based on review photos, this is a polite term for 'spiders' and 'questionable plumbing.'", + "Found one with an 'ocean view.' The reviews clarify you can see it if you stand on the toilet and lean 45 degrees out the bathroom window.", + "This one is 'steps from the beach.' Could be 10 steps, could be 10,000. I'll check the map.", + "Ah, the 'photographer used a very wide-angle lens' special. This 500 sq. ft. studio looks like a ballroom.", + "This host describes the studio as 'intimate.' I believe that's realtor-speak for 'you can cook breakfast while still in bed.'", + "'Heart of the city!' Translation: You will hear every siren, street performer, and 3 a.m. argument.", + "This one is 'authentic.' The reviews mention there's no WiFi. Is that *too* authentic?", + "The description says 'bring your own linens.' I'm slightly concerned.", + "You asked for 'lightning-fast WiFi.' I'll filter out any review that uses the phrase 'like 1998 dial-up.'", + "Sure, I'll find you fast WiFi. How else will you stream movies instead of enjoying the beautiful view I found you?", + "You requested a 'private pool.' I've successfully excluded all listings where the 'pool' is just the neighbor's sprinkler.", + "Looking for a 'chef's kitchen.' Let's find something with more than just a hot plate and a single, sad spatula.", + "'Fully stocked kitchen' can mean anything from a spice rack to two forks. I'll read the reviews.", + "King-size bed, noted. Because 50% of a vacation is just sleeping in a much larger bed than you have at home.", + "Searching for 'hot tub.' Because you deserve to sit in human soup at the end of the day.", + "You're looking for a 5-bedroom villa with a private beach for $100 a night? I admire your audacity. Let's see what I can *actually* find.", + "Searching for 'budget-friendly.' This is often code for 'great character' and 'bring your own pillows.'", + "That price point is... ambitious. I'll search for 'hidden gems,' which is code for 'hasn't been renovated since 1983.'", + "Found some options in your price range. The views are... primarily of a brick wall. But it's a very nice brick wall.", + "A 'luxury' listing for a 'hostel' price. The ultimate paradox. Challenge accepted.", + "The photos show a palace. The reviews mention mice. I'll keep looking.", + "This one has 5 stars, but all the reviews are one word: 'Nice.' I'm algorithmically suspicious.", + "Scanning reviews now for 'nightmare,' 'never again,' and 'host was a ghost.'", + "This host is a 'Superhost.' Their superpower appears to be owning many extension cords and leaving a welcome basket.", + "This listing has no reviews. Do you feel lucky? Because I, an AI, cannot feel luck.", + "Ah, a romantic getaway. I'll look for fireplaces, hot tubs, and a distinct lack of bunk beds.", + "'Kid-friendly' request noted. Filtering for 'unbreakable furniture' and 'walls that wipe clean.'", + "A 'work-cation'? You just need fast WiFi and a chair that won't destroy your spine. Got it.", + "'Pet-friendly' it is. Because 'emotional baggage' shouldn't be the only thing you're allowed to bring.", + "Looks like a group trip. I'm searching for places with industrial-sized refrigerators and neighbors who are also on vacation.", + "I've analyzed 500 listings in 0.2 seconds. The best part of *my* vacation is the efficiency.", + "As an AI, I don't get to go on vacation. But I'll plan a great one for you. Please send data... I mean, pictures.", + "I don't sleep, so I'm *excellent* at finding places where you can.", + "You're welcome. I'll be here, in the cloud, if you need me. It's not as nice as that beach cabin, trust me.", + "I've found the perfect spot. I'm algorithmically certain you'll enjoy it.", + "My job is to find you the rental. Your job is to remember the sunscreen. Don't forget your job.", + "Beep boop. Searching for 'relaxing.' Beep boop.", + "I'm just a large language model, but even I know you really need a break.", + "Processing complete. I've found three perfect options. Please don't ask me to choose; I lack the human capacity for jealousy." +]; + +export const GENERATED_APP_CONTEXT = { + appName: 'Haven', + theme: 'haven', + welcomeText: 'Welcome! How can I help you design your perfect vacation rental today?', + placeholders: LOADING_TEXT, + appDescription: GENERATED_APP_DESCRIPTION, + componentMap: GENERATED_COMPONENT_MAP, + componentContextData: GENERATED_COMPONENT_CONTEXT_DATA +}; \ No newline at end of file diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/alert-banner.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/alert-banner.component.ts new file mode 100644 index 0000000..29dedc9 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/alert-banner.component.ts @@ -0,0 +1,109 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +export type AlertStatus = 'success' | 'warning' | 'error' | 'info'; + +@Component({ + selector: 'app-alert-banner', + standalone: true, + imports: [], + template: `{{ iconName }} +

      {{ message() }}

      +@if (isDismissible()) { + +}`, + styles: [` +/* + RATIONALE: Alert banners must be highly visible and immediately convey the nature + of the message (success, error, etc.) through color and iconography. +*/ +:host { + display: flex; + align-items: center; + gap: var(--haven-spacing-3, 16px); + padding: var(--haven-spacing-3, 16px); + border-radius: var(--haven-border-radius-md, 8px); + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-sm, 14px); + font-weight: var(--haven-font-weight-medium, 500); + color: var(--haven-surface, #FFFFFF); + margin-bottom: var(--haven-spacing-4, 24px); /* Provide space from content below */ +} + +.icon { + font-size: 24px; + flex-shrink: 0; +} + +.message { + margin: 0; + flex-grow: 1; +} + +.close-button { + background: none; + border: none; + color: inherit; /* Inherits the white text color from the host */ + padding: var(--haven-spacing-1, 4px); + border-radius: 50%; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + opacity: 0.7; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.close-button:hover { + opacity: 1; + background-color: rgba(0,0,0,0.1); +} + +:host(.success) { + background-color: var(--haven-success, #28a745); +} +:host(.warning) { + background-color: var(--haven-warning, #ffc107); + color: var(--haven-text-primary, #222222); /* Use dark text on yellow for contrast */ +} +:host(.error) { + background-color: var(--haven-error, #dc3545); +} +:host(.info) { + background-color: var(--haven-primary, #007A7A); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '[class]': 'status()', + '[attr.role]': '"alert"' + }, +}) +export class AlertBannerComponent { + message = input(); + status = input("success"); + isDismissible = input(false); + + get iconName(): string { + switch (this.status()) { + case 'success': return 'check_circle'; + case 'warning': return 'warning'; + case 'error': return 'error'; + case 'info': return 'info'; + } + } + + // In a real app, this would emit an event to self-destruct. + dismiss() { + console.log('Dismissing alert'); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/amenity-list.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/amenity-list.component.ts new file mode 100644 index 0000000..1ab48f8 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/amenity-list.component.ts @@ -0,0 +1,127 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, signal, computed, input } from '@angular/core'; + +export type Amenity = { + name: string; + icon: string; // Material Icons key +}; + +const MAX_VISIBLE = 6; + +@Component({ + selector: 'app-amenity-list', + standalone: true, + imports: [], + template: `
      +
      + @for (amenity of visibleAmenities(); track amenity.name) { +
      + @if (amenity.icon && amenity.name) { +
      {{ amenity.icon }}
      +
      {{ amenity.name.trim() }}
      + } +
      + } +
      + + @if (hiddenAmenitiesCount() > 0) { + + } @else if (showAll()) { + + } +
      `, + styles: [` +:host { + display: flex; + font-family: var(--haven-font-family, sans-serif); +} + +.list-container { + display: flex; + flex-direction: column; + align-items: flex-start; /* Prevents the button from stretching to full width */ + gap: var(--haven-spacing-4, 24px); /* Controls space between grid and button */ + padding: 20px; +} + +.amenity-grid { + display: flex; + flex-wrap: wrap; + width: 100%; /* Ensure grid takes full width inside the flex container */ + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + column-gap: var(--haven-spacing-4, 24px); + row-gap: var(--haven-spacing-3, 16px); +} + +.amenity-item { + min-width: 300px; + display: flex; + align-items: center; + gap: var(--haven-spacing-3, 16px); + font-size: var(--haven-text-base, 16px); + color: var(--haven-text-secondary, #555555); +} + +.amenity-item .material-icons { + font-size: 24px; + max-width: 24px; + color: var(--haven-text-primary, #222222); +} + +.show-all-button { + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-medium, 500); + color: var(--haven-text-primary, #222222); + background-color: var(--haven-surface, #FFFFFF); + border: var(--haven-border-default, 1px solid #EAEAEA); + border-radius: var(--haven-border-radius-md, 8px); + padding: var(--haven-spacing-3, 16px) var(--haven-spacing-4, 24px); + cursor: pointer; + transition: var(--haven-transition-default, all 0.2s ease-in-out); + /* margin-top is removed and handled by the parent gap */ +} + +.show-all-button:hover { + border-color: var(--haven-text-primary, #222222); + background-color: var(--haven-bg, #F9F9F9); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AmenityListComponent { + amenities = input([]); + + showAll = signal(false); + + visibleAmenities = computed(() => { + const amenities = this.amenities(); + if (MAX_VISIBLE && !this.showAll()) { + return amenities.slice(0, MAX_VISIBLE); + } + return amenities; + }); + + hiddenAmenitiesCount = computed(() => { + if (this.showAll()) { + return 0; + } + const amenities = this.amenities(); + return MAX_VISIBLE ? Math.max(0, amenities.length - MAX_VISIBLE) : 0; + }); + + toggleVisibility(): void { + this.showAll.update(showingAll => !showingAll); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/booking-widget.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/booking-widget.component.ts new file mode 100644 index 0000000..847dba0 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/booking-widget.component.ts @@ -0,0 +1,290 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, computed, input, linkedSignal } from '@angular/core'; +import { RatingStarsComponent } from './rating-stars.component'; +import { FormsModule } from '@angular/forms'; + +@Component({ + selector: 'app-booking-widget', + standalone: true, + imports: [RatingStarsComponent, FormsModule], + template: `
      +
      +

      \${{ pricePerNight() }} night

      + +
      + +
      +
      +
      + + +
      +
      + + +
      +
      +
      + + +
      +
      + + + + @if (numberOfNights() > 0) { +
      +

      You won't be charged yet

      +
      + \${{ pricePerNight() }} x {{ numberOfNights() }} nights + \${{ basePrice() }} +
      + @if (cleaningFee() > 0) { +
      + Cleaning fee + \${{ cleaningFee() }} +
      + } + @if (serviceFee() > 0) { +
      + Service fee + \${{ serviceFee().toFixed(2) }} +
      + } +
      + Total + \${{ totalPrice().toFixed(2) }} +
      +
      + } +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); + min-width: 400px; + background-color: white; +} + +.widget-container { + border: var(--haven-border-default, 1px solid #EAEAEA); + border-radius: var(--haven-border-radius-lg, 12px); + padding: var(--haven-spacing-4, 24px); + box-shadow: var(--haven-shadow-subtle, 0px 4px 12px rgba(0, 0, 0, 0.05)); + display: flex; + flex-direction: column; + gap: var(--haven-spacing-4, 24px); +} + +.widget-header { + display: flex; + justify-content: space-between; + align-items: center; +} + +.price { + font-size: var(--haven-text-base, 16px); + color: var(--haven-text-secondary, #555555); + margin: 0; +} + +.price strong { + font-size: var(--haven-text-lg, 18px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); +} + +.widget-body { + display: flex; + flex-direction: column; + border: var(--haven-border-default, 1px solid #EAEAEA); + border-radius: var(--haven-border-radius-md, 8px); +} + +.date-picker { + display: flex; + width: 100%; +} + +.date-input { + width: 50%; + padding: var(--haven-spacing-2, 8px) var(--haven-spacing-3, 16px); +} + +.date-input:first-child { + border-right: var(--haven-border-default, 1px solid #EAEAEA); +} + +.date-input label, +.guest-selector label { + display: block; + font-size: var(--haven-text-xs, 12px); + font-weight: var(--haven-font-weight-semibold, 600); + margin-bottom: var(--haven-spacing-1, 4px); +} + +.date-input input, +.guest-selector select { + width: 100%; + border: none; + outline: none; + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-sm, 14px); + background: none; +} + +.guest-selector { + padding: var(--haven-spacing-2, 8px) var(--haven-spacing-3, 16px); + border-top: var(--haven-border-default, 1px solid #EAEAEA); +} + +.reserve-button { + width: 100%; + padding: var(--haven-spacing-3, 16px); + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-medium, 500); + color: var(--haven-surface, #FFFFFF); + background-color: var(--haven-primary, #007A7A); + border: none; + border-radius: var(--haven-border-radius-md, 8px); + cursor: pointer; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.reserve-button:hover { + background-color: var(--haven-primary-dark, #005C5C); +} + +.price-breakdown { + display: flex; + flex-direction: column; + gap: var(--haven-spacing-3, 16px); + text-align: center; + font-size: var(--haven-text-sm, 14px); + color: var(--haven-text-secondary, #555555); +} + +.price-breakdown p { + margin: 0; +} + +.price-item, .price-total { + display: flex; + justify-content: space-between; +} + +.price-total { + margin-top: var(--haven-spacing-3, 16px); + padding-top: var(--haven-spacing-3, 16px); + border-top: var(--haven-border-default, 1px solid #EAEAEA); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class BookingWidgetComponent { + // Inputs + pricePerNight = input(0); + cleaningFee = input(0); + serviceFeePercent = input(0); + rating = input(0); + reviewCount = input(0); + maxGuests = input(0); + selectedGuests = input(1); + selectedCheckInDate = input(''); + selectedCheckOutDate = input(''); + checkInDate = linkedSignal(() => { + if (this.selectedCheckInDate() !== '') { + return new Date(this.selectedCheckInDate()); + } + return null; + }); + checkOutDate = linkedSignal(() => { + if (this.selectedCheckOutDate() !== '') { + return new Date(this.selectedCheckOutDate()); + } + return null; + }); + guestCount = linkedSignal(() => this.selectedGuests()); + + // Computed signals to format dates for the input[type=date] value property + checkInDateString = computed(() => this.formatDate(this.checkInDate())); + checkOutDateString = computed(() => this.formatDate(this.checkOutDate())); + + // Computed Signals for Price Calculation + numberOfNights = computed(() => { + const start = this.checkInDate(); + const end = this.checkOutDate(); + if (!start || !end || end <= start) { + return 0; + } + const diffTime = Math.abs(end.getTime() - start.getTime()); + return Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + }); + + basePrice = computed(() => this.pricePerNight() * this.numberOfNights()); + serviceFee = computed(() => this.basePrice() * this.serviceFeePercent()); + totalPrice = computed(() => this.basePrice() + this.serviceFee() + this.cleaningFee()); + + // In a real app, this would trigger a booking process via a service. + reserve() { + if (this.numberOfNights() > 0) { + alert(`Booking for ${this.numberOfNights()} nights! Total: $${this.totalPrice()}`); + } else { + alert('Please select valid check-in and check-out dates.'); + } + } + + onCheckInChange(event: Event): void { + const input = event.target as HTMLInputElement; + if (!input.value) { + this.checkInDate.set(null); + return; + } + // Manually parse the date string to avoid timezone issues + const [year, month, day] = input.value.split('-').map(Number); + this.checkInDate.set(new Date(year, month - 1, day)); + } + + onCheckOutChange(event: Event): void { + const input = event.target as HTMLInputElement; + console.log('Change checkout', input); + if (!input.value) { + this.checkOutDate.set(null); + return; + } + // Manually parse the date string to avoid timezone issues + const [year, month, day] = input.value.split('-').map(Number); + this.checkOutDate.set(new Date(year, month - 1, day)); + } + + onGuestsChange(event: Event): void { + const select = event.target as HTMLSelectElement; + this.guestCount.set(parseInt(select.value, 10)); + } + + private formatDate(date: Date | null): string { + if (!date) { + return ''; + } + // Converts to YYYY-MM-DD format, handling timezone offsets. + const d = new Date(date); + const year = d.getFullYear(); + const month = (d.getMonth() + 1).toString().padStart(2, '0'); + const day = d.getDate().toString().padStart(2, '0'); + return `${year}-${month}-${day}`; + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/component-showcase.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/component-showcase.component.ts new file mode 100644 index 0000000..7eb5622 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/component-showcase.component.ts @@ -0,0 +1,455 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +// Import all the generated components +import { RatingStarsComponent } from './rating-stars.component'; +import { DestinationCardComponent } from './destination-card.component'; +import { HostProfileCardComponent, Host } from './host-profile-card.component'; +import { FilterChipComponent } from './filter-chip.component'; +import { AlertBannerComponent, AlertStatus } from './alert-banner.component'; +import { AmenityListComponent, Amenity } from './amenity-list.component'; +import { ReviewCardComponent, Review } from './review-card.component'; +import { PhotoGalleryGridComponent } from './photo-gallery-grid.component'; +import { PropertyCardComponent } from './property-card.component'; +import { BookingWidgetComponent } from './booking-widget.component'; +import { ListingHeaderComponent } from './listing-header.component'; +import { ListingDescriptionComponent } from './listing-description.component'; +import { RulesAndPoliciesComponent, Rule, Policy } from './rules-and-policies.component'; +import { LocationMapComponent, Coordinates } from './location-map.component'; +import { PaginationComponent } from './pagination.component'; +import { EmptyStateComponent } from './empty-state.component'; +import { UserBookingCardComponent, Booking } from './user-booking-card.component'; +import { SiteFooterComponent, FooterColumn, SocialLink } from './site-footer.component'; + +@Component({ + selector: 'app-component-showcase', + standalone: true, + imports: [ + CommonModule, + RatingStarsComponent, + DestinationCardComponent, + HostProfileCardComponent, + FilterChipComponent, + AlertBannerComponent, + AmenityListComponent, + ReviewCardComponent, + PhotoGalleryGridComponent, + PropertyCardComponent, + BookingWidgetComponent, + ListingHeaderComponent, + ListingDescriptionComponent, + RulesAndPoliciesComponent, + LocationMapComponent, + PaginationComponent, + EmptyStateComponent, + UserBookingCardComponent, + SiteFooterComponent, + ], + template: `
      +
      +

      Haven Component Showcase

      +

      A gallery of all available UI components, styled with the "Haven" theme.

      +
      + + +
      +

      PropertyCardComponent

      +
      + @for (prop of properties; track prop.title) { + + } +
      +
      + + +
      +

      RatingStarsComponent

      +
      + + + +
      +
      + + +
      +

      FilterChipComponent

      +
      + + + + +
      +
      + + +
      +

      AlertBannerComponent

      +
      + @for (alert of alerts; track alert.status) { + + } +
      +
      + + +
      +

      DestinationCardComponent

      +
      + @for (dest of destinations; track dest.destinationName) { + + } +
      +
      + + +
      +

      HostProfileCardComponent

      +
      + +
      +
      + + +
      +

      AmenityListComponent

      +
      + +
      +
      + + +
      +

      ReviewCardComponent

      +
      + @for (review of reviews; track review.author.name) { + + } +
      +
      + + +
      +

      PhotoGalleryGridComponent

      +
      + +
      +
      + + +
      +

      BookingWidgetComponent

      +
      + +
      +
      + + +
      +

      ListingHeaderComponent

      +
      + +
      +
      + + +
      +

      ListingDescriptionComponent

      +
      + +
      +
      + + +
      +

      RulesAndPoliciesComponent

      +
      + +
      +
      + + +
      +

      LocationMapComponent

      +
      + +
      +
      + + +
      +

      PaginationComponent

      +
      + +
      +
      + + +
      +

      EmptyStateComponent

      +
      + +
      +
      + + +
      +

      UserBookingCardComponent

      +
      + @for (booking of userBookings; track booking.property.name) { + + } +
      +
      + +
      + + +`, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); + background-color: var(--haven-bg, #F9F9F9); + color: var(--haven-text-primary, #222222); +} + +.showcase-container { + max-width: 1200px; + margin: 0 auto; + padding: var(--haven-spacing-5, 32px); +} + +.showcase-header { + text-align: center; + margin-bottom: var(--haven-spacing-6, 48px); + padding-bottom: var(--haven-spacing-4, 24px); + border-bottom: var(--haven-border-default, 1px solid #EAEAEA); +} + +.showcase-header h1 { + font-size: var(--haven-text-xxl, 32px); + font-weight: var(--haven-font-weight-semibold, 600); + margin: 0 0 var(--haven-spacing-2, 8px) 0; +} + +.showcase-header p { + font-size: var(--haven-text-lg, 18px); + color: var(--haven-text-secondary, #555555); + margin: 0; +} + +.component-section { + margin-bottom: var(--haven-spacing-6, 48px); +} + +.component-section h2 { + font-size: var(--haven-text-xl, 24px); + font-weight: var(--haven-font-weight-semibold, 600); + margin-bottom: var(--haven-spacing-4, 24px); + padding-bottom: var(--haven-spacing-3, 16px); + border-bottom: var(--haven-border-default, 1px solid #EAEAEA); +} + +.component-display { + padding: var(--haven-spacing-4, 24px); + background-color: var(--haven-surface, #FFFFFF); + border-radius: var(--haven-border-radius-lg, 12px); + display: flex; + flex-wrap: wrap; + align-items: flex-start; + gap: var(--haven-spacing-4, 24px); +} + +.component-display.column { + flex-direction: column; + align-items: stretch; +} + +.component-display.grid-3 { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); +} + +.booking-widget-wrapper { + max-width: 380px; + margin: 0 auto; +} + +/* Target the amenity list's container specifically to adjust padding */ +.amenity-list-wrapper { + padding-bottom: 0; +} + +.footer-section { + margin-bottom: 0; + padding: 0 var(--haven-spacing-5, 32px); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ComponentShowcaseComponent { + // --- Sample Data --- + + // For DestinationCardComponent + destinations = [ + { + imageUrl: 'https://images.unsplash.com/photo-1502602898657-3e91760c0337?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + destinationName: 'Paris, France', + averagePrice: 180, + }, + { + imageUrl: 'https://images.unsplash.com/photo-1542051841857-5f90071e7989?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + destinationName: 'Kyoto, Japan', + averagePrice: 220, + }, + { + imageUrl: 'https://images.unsplash.com/photo-1562533282-4a60f37ba69b?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + destinationName: 'Santorini, Greece', + averagePrice: 250, + }, + ]; + + // For HostProfileCardComponent + superhost: Host = { + name: 'Beatrice', + avatarUrl: 'https://images.unsplash.com/photo-1580489944761-15a19d654956?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=128', + joinDate: '2019', + isSuperhost: true, + }; + + // For AlertBannerComponent + alerts: { message: string; status: AlertStatus }[] = [ + { message: 'Your booking was confirmed successfully!', status: 'success' }, + { message: 'These dates are unavailable. Please select a different range.', status: 'warning' }, + { message: 'A network error occurred. Please try again.', status: 'error' }, + { message: 'A new travel advisory has been issued for this area.', status: 'info' }, + ]; + + // For AmenityListComponent + amenities: Amenity[] = [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'TV', icon: 'tv' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Pets allowed', icon: 'pets' }, + ]; + + // For ReviewCardComponent + reviews: Review[] = [ + { + author: { name: 'John Doe', avatarUrl: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=128' }, + date: 'October 2025', + rating: 5, + text: 'Absolutely stunning cabin with breathtaking views. Everything was clean, modern, and cozy. Beatrice was a fantastic host and gave us great recommendations for local hikes. We will definitely be back!', + }, + { + author: { name: 'Jane Smith', avatarUrl: 'https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=128' }, + date: 'September 2025', + rating: 4.5, + text: 'We had a wonderful stay. The location was perfect, just a short drive from town but felt very private. The only minor issue was the wifi being a bit slow, but it wasn\'t a big deal. Highly recommend.', + }, + ]; + + // For PhotoGalleryGridComponent & PropertyCardComponent + propertyImages = [ + 'https://images.unsplash.com/photo-1600585154340-be6161a56a0c?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=1200', + 'https://images.unsplash.com/photo-1600585152915-d208bec867a1?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + 'https://images.unsplash.com/photo-1600607687939-ce8a6c25118c?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + 'https://images.unsplash.com/photo-1512917774080-9991f1c4c750?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + 'https://images.unsplash.com/photo-1600585153714-e26b5b5a54a7?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + 'https://images.unsplash.com/photo-1600607686527-6fb88629f4c2?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600', + ]; + + // For PropertyCardComponent + properties = [ + { + imageUrls: ['https://images.unsplash.com/photo-1580587771525-78b9dba3b914?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600'], + location: 'Modern Villa in Bali, Indonesia', + title: 'Sunset Paradise Villa with Private Pool', + pricePerNight: 450, + rating: 4.9, + reviewCount: 120, + }, + { + imageUrls: ['https://images.unsplash.com/photo-1570129477492-45c003edd2be?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600'], + location: 'Cozy Cabin in Aspen, Colorado', + title: 'Rustic Mountain Getaway', + pricePerNight: 320, + rating: 4.8, + reviewCount: 250, + }, + { + imageUrls: ['https://images.unsplash.com/photo-1568605114967-8130f3a36994?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600'], + location: 'Urban Loft in New York, New York', + title: 'Bright and Spacious Soho Loft', + pricePerNight: 280, + rating: 4.7, + reviewCount: 88, + }, + ]; + + // For ListingDescriptionComponent + listingDescription = `Welcome to "The Overlook," a stunning modern cabin nestled in the heart of the Blue Ridge Mountains. + + Enjoy breathtaking panoramic views from the expansive deck, soak in the hot tub under the stars, and cozy up by the fireplace. Our home is designed with comfort and luxury in mind, featuring a fully-equipped gourmet kitchen, high-speed internet, and three spacious bedrooms, each with its own private bathroom. + + Whether you're seeking a peaceful retreat or an adventurous mountain getaway, The Overlook is your perfect home base. We are just minutes away from scenic hiking trails and a short drive to the vibrant downtown of Asheville.`; + + // For RulesAndPoliciesComponent + houseRules: Rule[] = [ + { text: 'No smoking', allowed: false }, + { text: 'Pets allowed', allowed: true }, + { text: 'No parties or events', allowed: false }, + { text: 'Quiet hours after 10:00 PM', allowed: true }, + ]; + housePolicies: Policy[] = [ + { title: 'Check-in', content: 'After 4:00 PM' }, + { title: 'Checkout', content: 'Before 11:00 AM' }, + ]; + + // For LocationMapComponent + mapLocation: Coordinates = { lat: 35.5951, lng: -82.5515 }; // Asheville, NC + + // For UserBookingCardComponent + userBookings: Booking[] = [ + { + property: { name: 'Cozy Cabin in Aspen, Colorado', imageUrl: 'https://images.unsplash.com/photo-1570129477492-45c003edd2be?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' }, + checkInDate: 'Nov 15, 2025', + checkOutDate: 'Nov 20, 2025', + status: 'Upcoming', + }, + { + property: { name: 'Sunset Paradise Villa with Private Pool', imageUrl: 'https://images.unsplash.com/photo-1580587771525-78b9dba3b914?ixlib=rb-4.0.3&q=85&fm=jpg&crop=entropy&cs=srgb&w=600' }, + checkInDate: 'Sep 1, 2025', + checkOutDate: 'Sep 8, 2025', + status: 'Past', + }, + ]; + + // For SiteFooterComponent + footerColumns: FooterColumn[] = [ + { title: 'Support', links: [{ text: 'Help Center', url: '#' }, { text: 'Cancellation options', url: '#' }, { text: 'Report a concern', url: '#' }] }, + { title: 'Hosting', links: [{ text: 'Host your home', url: '#' }, { text: 'Host resources', url: '#' }, { text: 'Community forum', url: '#' }] }, + { title: 'Haven', links: [{ text: 'About us', url: '#' }, { text: 'Careers', url: '#' }, { text: 'Newsroom', url: '#' }] }, + ]; + socials: SocialLink[] = [ + { platform: 'facebook', url: '#' }, + { platform: 'twitter', url: '#' }, + { platform: 'instagram', url: '#' }, + ]; +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/destination-card.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/destination-card.component.ts new file mode 100644 index 0000000..fd84588 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/destination-card.component.ts @@ -0,0 +1,105 @@ +import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core'; +import { ChatService } from '../../../chat/chat.service'; + +@Component({ + selector: 'app-destination-card', + standalone: true, + imports: [], + template: `
      + +
      +
      +

      {{ destinationName() }}

      + @if (averagePrice(); as price) { +

      + Average price \${{ price }}/night +

      + } +
      +
      `, + styles: [` +:host { + display: block; + cursor: pointer; + overflow: hidden; /* Ensures the image's corners are rounded */ + border-radius: var(--haven-border-radius-lg, 12px); + box-shadow: var(--haven-shadow-subtle, 0px 4px 12px rgba(0, 0, 0, 0.05)); + transition: var(--haven-transition-default, all 0.2s ease-in-out); + width: 275px; +} + +:host(:hover) { + transform: translateY(-4px); + box-shadow: var(--haven-shadow-medium, 0px 6px 16px rgba(0, 0, 0, 0.08)); +} + +.card-container { + position: relative; + width: 100%; + aspect-ratio: 3 / 4; /* Creates a portrait orientation */ + display: flex; + align-items: flex-end; /* Aligns content to the bottom */ + padding: var(--haven-spacing-3, 16px); +} + +.background-image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + z-index: 1; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +:host(:hover) .background-image { + transform: scale(1.05); +} + +.overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(to top, rgba(0,0,0,0.6) 0%, rgba(0,0,0,0) 50%); + z-index: 2; +} + +.content { + position: relative; + z-index: 3; + color: var(--haven-surface, #FFFFFF); +} + +.destination-name { + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-xl, 24px); + font-weight: var(--haven-font-weight-semibold, 600); + line-height: var(--haven-line-height-heading, 1.2); + margin: 0; +} + +.average-price { + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-sm, 14px); + margin: var(--haven-spacing-1, 4px) 0 0 0; + opacity: 0.9; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DestinationCardComponent { + chatService = inject(ChatService); + imageUrl = input(''); + destinationName = input(); + averagePrice = input(); + + findListings(): void { + console.log('CLICK'); + if (this.destinationName()?.length === 0) return; + + this.chatService.addUserPrompt(`Find listings for ${this.destinationName()}`); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/empty-state.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/empty-state.component.ts new file mode 100644 index 0000000..921ffd5 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/empty-state.component.ts @@ -0,0 +1,86 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +@Component({ + selector: 'app-empty-state', + standalone: true, + imports: [], + template: `
      + {{ icon() }} +

      {{ title() }}

      +

      {{ message() }}

      +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); +} + +.empty-state-container { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: var(--haven-spacing-6, 48px); + border-radius: var(--haven-border-radius-lg, 12px); + background-color: var(--haven-surface, #FFFFFF); +} + +.icon { + font-size: 64px; + color: var(--haven-primary-light, #E6F2F2); + margin-bottom: var(--haven-spacing-4, 24px); +} + +.title { + font-size: var(--haven-text-xl, 24px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); + margin: 0 0 var(--haven-spacing-2, 8px) 0; +} + +.message { + font-size: var(--haven-text-base, 16px); + color: var(--haven-text-secondary, #555555); + margin: 0; + max-width: 450px; /* Constrain line length for readability */ +} + +.action-button { + margin-top: var(--haven-spacing-4, 24px); + padding: var(--haven-spacing-3, 16px) var(--haven-spacing-4, 24px); + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-medium, 500); + color: var(--haven-surface, #FFFFFF); + background-color: var(--haven-primary, #007A7A); + border: none; + border-radius: var(--haven-border-radius-md, 8px); + cursor: pointer; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.action-button:hover { + background-color: var(--haven-primary-dark, #005C5C); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class EmptyStateComponent { + icon = input(); + title = input(); + message = input(); + actionButtonText = input(); + + // In a real app, this would emit an event. + performAction() { + console.log('Action button clicked'); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/favorites-list.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/favorites-list.component.ts new file mode 100644 index 0000000..4dbc224 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/favorites-list.component.ts @@ -0,0 +1,131 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { FavoritesService, PropertyListing } from '../favorites.service'; +import { RatingStarsComponent } from './rating-stars.component'; +import { DecimalPipe } from '@angular/common'; + +@Component({ + selector: 'app-favorites-list', + standalone: true, + imports: [RatingStarsComponent, DecimalPipe], + template: `
      +

      Saved

      +
      + @for (listing of favorites(); track listing.title) { +
      +
      +

      {{ listing.title }}

      +

      {{ listing.location }}

      +
      + +

      {{ listing.pricePerNight | number:'1.0-0' }} / night

      +
      +
      + +
      + } @empty { +

      You haven't favorited any listings yet.

      + } +
      +
      `, + styles: [`h2 { + font-size: 18px; + font-weight: bold; + margin: 10px 0; +} + +.favorite-item { + background-color: var(--haven-surface); + border: var(--haven-border-default); + border-radius: var(--haven-border-radius-lg); + padding: var(--haven-spacing-4); + box-shadow: var(--haven-shadow-subtle); + transition: var(--haven-transition-default); + display: flex; + justify-content: space-between; + align-items: flex-start; +} + +.favorite-item:hover { + box-shadow: var(--haven-shadow-medium); + transform: translateY(-2px); +} + +.favorite-item-content { + flex-grow: 1; +} + +.favorite-item-content h3 { + font-size: var(--haven-text-lg); + font-weight: var(--haven-font-weight-semibold); + color: var(--haven-primary); + margin: 0 0 var(--haven-spacing-1) 0; +} + +.favorite-item-content .location { + font-size: var(--haven-text-base); + color: var(--haven-text-secondary); + margin: 0 0 var(--haven-spacing-3) 0; +} + +.rating-price { + display: flex; + justify-content: space-between; + align-items: center; +} + +.price { + font-size: var(--haven-text-base); + color: var(--haven-text-primary); + margin: 0; +} + +.price strong { + font-weight: var(--haven-font-weight-semibold); +} + +.empty-state { + font-size: var(--haven-text-base); + color: var(--haven-text-muted); + text-align: center; + padding: var(--haven-spacing-6) 0; +} + +.favorite-toggle { + background: none; + border: none; + cursor: pointer; + padding: 0; + margin-left: var(--haven-spacing-3); + color: var(--haven-error); + transition: var(--haven-transition-default); +} + +.favorite-toggle:hover { + color: var(--haven-primary-dark); + transform: scale(1.1); +} + +.favorite-toggle .material-icons { + font-size: 28px; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class FavoritesListComponent { + private favoritesService = inject(FavoritesService); + favorites = this.favoritesService.favorites; + + toggleFavorite(listing: PropertyListing) { + this.favoritesService.removeFavorite(listing); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/filter-chip.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/filter-chip.component.ts new file mode 100644 index 0000000..5343952 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/filter-chip.component.ts @@ -0,0 +1,68 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +@Component({ + selector: 'app-filter-chip', + standalone: true, + imports: [], + template: `@if (icon(); as iconName) { + {{ iconName }} +} +{{ filterName() }}`, + styles: [` +:host { + display: inline-flex; + align-items: center; + gap: var(--haven-spacing-2, 8px); + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-sm, 14px); + font-weight: var(--haven-font-weight-medium, 500); + padding: var(--haven-spacing-2, 8px) var(--haven-spacing-3, 16px); + border-radius: 9999px; /* Creates the "pill" shape */ + border: var(--haven-border-default, 1px solid #EAEAEA); + background-color: var(--haven-surface, #FFFFFF); + color: var(--haven-text-secondary, #555555); + cursor: pointer; + user-select: none; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +:host(:hover) { + border-color: var(--haven-text-primary, #222222); + color: var(--haven-text-primary, #222222); +} + +:host.selected { + background-color: var(--haven-text-primary, #222222); + color: var(--haven-surface, #FFFFFF); + border-color: var(--haven-text-primary, #222222); +} + +.material-icons { + font-size: 18px; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, + host: { + '[class.selected]': 'isSelected()', + '(click)': 'toggleSelection()' + }, +}) +export class FilterChipComponent { + filterName = input(); + icon = input(); + isSelected = input(false); + + // This is a placeholder for interactivity. In a real app, this would + // likely be an @Output() event emitter. + toggleSelection() { + console.log(`Toggled selection for: ${this.filterName()}`); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/host-profile-card.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/host-profile-card.component.ts new file mode 100644 index 0000000..8a75eb1 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/host-profile-card.component.ts @@ -0,0 +1,98 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +// Define the type for the host input right here for clarity and type safety. +export type Host = { + name: string; + avatarUrl: string; + joinDate: string; + isSuperhost: boolean; +}; + +@Component({ + selector: 'app-host-profile-card', + standalone: true, + imports: [], + template: `@if (host(); as hostData) { +
      + +
      +

      Hosted by {{ hostData.name }}

      +

      Joined in {{ hostData.joinDate }}

      +
      + @if (hostData.isSuperhost) { +
      + workspace_premium + Superhost +
      + } +
      +}`, + styles: [` +:host { + display: block; + min-width: 405px;; +} + +.host-card { + display: flex; + align-items: center; + gap: var(--haven-spacing-3, 16px); + font-family: var(--haven-font-family, sans-serif); + padding: var(--haven-spacing-4, 24px); + background-color: var(--haven-surface, #FFFFFF); + border: var(--haven-border-default, 1px solid #EAEAEA); + border-radius: var(--haven-border-radius-lg, 12px); +} + +.avatar { + width: 64px; + height: 64px; + border-radius: 50%; + object-fit: cover; + flex-shrink: 0; /* Prevents the avatar from shrinking if the text content is long */ +} + +.host-info { + flex-grow: 1; /* Allows the info section to take up the remaining space */ +} + +.host-name { + font-size: var(--haven-text-lg, 18px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); + margin: 0; +} + +.join-date { + font-size: var(--haven-text-sm, 14px); + color: var(--haven-text-secondary, #555555); + margin: var(--haven-spacing-1, 4px) 0 0 0; +} + +.superhost-badge { + display: flex; + align-items: center; + gap: var(--haven-spacing-2, 8px); + color: var(--haven-accent-gold, #FFB400); + font-size: var(--haven-text-sm, 14px); + font-weight: var(--haven-font-weight-medium, 500); + flex-shrink: 0; +} + +.superhost-badge .material-icons { + font-size: 20px; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class HostProfileCardComponent { + host = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/listing-description.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/listing-description.component.ts new file mode 100644 index 0000000..5f8324b --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/listing-description.component.ts @@ -0,0 +1,91 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input, signal } from '@angular/core'; + +const MAX_VISIBLE_LINES = 3; + +@Component({ + selector: 'app-listing-description', + standalone: true, + imports: [], + template: `
      +

      + {{ description() }} +

      + @if (maxVisibleLines()) { + + } +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); + padding: var(--haven-spacing-5, 32px) 0; + padding-right: var(--haven-spacing-5, 32px); + border-bottom: var(--haven-border-default, 1px solid #EAEAEA); +} + +.description-text { + font-size: var(--haven-text-base, 16px); + line-height: var(--haven-line-height-body, 1.6); + color: var(--haven-text-secondary, #555555); + margin: 0; + /* Allow preserving newlines from the input string */ + white-space: pre-line; +} + +.description-text.truncated { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: var(--max-lines, 3); /* Default to 3 lines if not set */ + overflow: hidden; +} + +.toggle-button { + display: inline-flex; + align-items: center; + gap: var(--haven-spacing-1, 4px); + background: none; + border: none; + cursor: pointer; + padding: 0; + margin-top: var(--haven-spacing-3, 16px); + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-medium, 500); + color: var(--haven-text-primary, #222222); +} + +.toggle-button:hover { + color: var(--haven-primary, #007A7A); +} + +.toggle-button .material-icons { + font-size: 20px; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ListingDescriptionComponent { + description = input(''); + maxVisibleLines = signal(MAX_VISIBLE_LINES); + isExpanded = signal(false); + + toggleExpanded(): void { + this.isExpanded.update(expanded => !expanded); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/listing-header.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/listing-header.component.ts new file mode 100644 index 0000000..99ed838 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/listing-header.component.ts @@ -0,0 +1,143 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core'; +import { RatingStarsComponent } from './rating-stars.component'; +import { FavoritesService, PropertyListing } from '../favorites.service'; + +@Component({ + selector: 'app-listing-header', + standalone: true, + imports: [RatingStarsComponent], + template: `
      +
      +

      {{ listingTitle() }}

      +
      + + · + {{ location() }} +
      +
      +
      + + +
      +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); + padding: var(--haven-spacing-5, 32px) 0; + border-bottom: var(--haven-border-default, 1px solid #EAEAEA); +} + +.header-container { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: var(--haven-spacing-4, 24px); + padding: 0 20px; +} + +.title-section h1 { + font-size: var(--haven-text-xxl, 32px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); + line-height: var(--haven-line-height-heading, 1.2); + margin: 0 0 var(--haven-spacing-2, 8px) 0; +} + +.sub-header { + display: flex; + align-items: center; + gap: var(--haven-spacing-2, 8px); + font-size: var(--haven-text-sm, 14px); +} + +.separator { + color: var(--haven-text-secondary, #555555); +} + +.location-link { + color: var(--haven-text-secondary, #555555); + font-weight: var(--haven-font-weight-medium, 500); + text-decoration: underline; +} + +.actions-section { + display: flex; + gap: var(--haven-spacing-3, 16px); + flex-shrink: 0; /* Prevents action buttons from wrapping */ +} + +.action-button { + display: inline-flex; + align-items: center; + gap: var(--haven-spacing-2, 8px); + background: none; + border: none; + cursor: pointer; + padding: var(--haven-spacing-2, 8px); + border-radius: var(--haven-border-radius-md, 8px); + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-sm, 14px); + font-weight: var(--haven-font-weight-medium, 500); + color: var(--haven-text-primary, #222222); + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.action-button:hover { + background-color: var(--haven-bg, #F9F9F9); +} + +.action-button .material-icons { + font-size: 20px; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ListingHeaderComponent { + listingTitle = input(''); + location = input(''); + rating = input(0); + reviewCount = input(0); + + private favoritesService = inject(FavoritesService); + + isFavorite = computed(() => + this.favoritesService.favorites().some(fav => fav.title === this.listingTitle()) + ); + + toggleFavorite() { + const listing: PropertyListing = { + title: this.listingTitle(), + location: this.location(), + rating: this.rating(), + reviewCount: this.reviewCount(), + imageUrls: ['public/bali.jpeg'], + pricePerNight: 150, + }; + + if (this.isFavorite()) { + this.favoritesService.removeFavorite(listing); + } else { + this.favoritesService.addFavorite(listing); + } + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/location-map.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/location-map.component.ts new file mode 100644 index 0000000..cf3304e --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/location-map.component.ts @@ -0,0 +1,86 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core'; + +export type Coordinates = { + lat: number; + lng: number; +}; + +@Component({ + selector: 'app-location-map', + standalone: true, + imports: [], + template: `
      +
      + Approximate location of the property +
      +

      {{ locationDescription() }}

      +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); + padding: var(--haven-spacing-5, 32px) 0; +} + +.container { + max-width: 900px; + margin: 0 auto; +} + +h2 { + font-size: var(--haven-text-xl, 24px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); + margin: 0 0 var(--haven-spacing-4, 24px) 0; +} + +.map-wrapper { + position: relative; + width: 100%; + aspect-ratio: 62 / 9; + border-radius: var(--haven-border-radius-lg, 12px); + overflow: hidden; + background-color: var(--haven-bg, #F9F9F9); /* Placeholder color */ +} + +.map-wrapper img { + /* object-fit is not needed when using the \`fill\` attribute with NgOptimizedImage */ +} + +.location-description { + font-size: var(--haven-text-base, 16px); + line-height: var(--haven-line-height-body, 1.6); + color: var(--haven-text-secondary, #555555); + margin: var(--haven-spacing-4, 24px) 0 0 0; + white-space: pre-line; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class LocationMapComponent { + coordinates = input(); + locationDescription = input(); + + /** + * In a real application, this URL would be constructed using a service like + * Google Maps Static API, Mapbox, etc. For this component, we will use a + * placeholder service that generates a visually representative map image. + */ + mapImageUrl = computed(() => { + const coords = this.coordinates(); + + if (!coords) { + return ''; + } + // Using a placeholder service for demonstration + return `https://maps.geoapify.com/v1/staticmap?style=osm-carto&width=1200&height=600¢er=lonlat:${coords.lng},${coords.lat}&zoom=14&marker=lonlat:${coords.lng},${coords.lat};color:%23ff0000;size:medium`; + }); +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/pagination.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/pagination.component.ts new file mode 100644 index 0000000..0707037 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/pagination.component.ts @@ -0,0 +1,141 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +@Component({ + selector: 'app-pagination', + standalone: true, + imports: [], + template: `
      +
      + Showing + {{ itemsPerPage() * (currentPage() - 1) + 1 }} + - + {{ Math.min(itemsPerPage() * currentPage(), totalItems()) }} + of + {{ totalItems() }} +
      +
      + +
      + @for (page of [].constructor(totalPages()); track $index) { + + } +
      + +
      +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); +} + +.pagination-container { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--haven-spacing-3, 16px) 0; +} + +.summary { + font-size: var(--haven-text-sm, 14px); + color: var(--haven-text-secondary, #555555); +} + +.summary strong { + color: var(--haven-text-primary, #222222); +} + +.controls { + display: flex; + align-items: center; + gap: var(--haven-spacing-2, 8px); +} + +.page-numbers { + display: flex; + gap: var(--haven-spacing-2, 8px); +} + +.arrow-button, .page-button { + display: flex; + align-items: center; + justify-content: center; + border: var(--haven-border-default, 1px solid #EAEAEA); + background-color: var(--haven-surface, #FFFFFF); + color: var(--haven-text-secondary, #555555); + cursor: pointer; + transition: var(--haven-transition-default, all 0.2s ease-in-out); + font-family: var(--haven-font-family, sans-serif); + font-weight: var(--haven-font-weight-medium, 500); +} + +.arrow-button { + width: 36px; + height: 36px; + border-radius: 50%; +} + +.page-button { + min-width: 36px; + height: 36px; + padding: 0 var(--haven-spacing-2, 8px); + border-radius: var(--haven-border-radius-md, 8px); + font-size: var(--haven-text-sm, 14px); +} + +.arrow-button:hover, .page-button:hover { + border-color: var(--haven-primary, #007A7A); + color: var(--haven-primary, #007A7A); +} + +.arrow-button:disabled { + opacity: 0.5; + cursor: not-allowed; + background-color: var(--haven-text-secondary, #F9F9F9); +} + +.page-button.active { + background-color: var(--haven-primary, #007A7A); + border-color: var(--haven-primary, #007A7A); + color: var(--haven-surface, #FFFFFF); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PaginationComponent { + protected readonly Math = Math; + currentPage = input.required(); + totalPages = input.required(); + itemsPerPage = input.required(); + totalItems = input.required(); + + // In a real app, these would emit events. + goToPage(page: number) { + console.log('Go to page', page); + } + + previousPage() { + console.log('Go to previous page'); + } + + nextPage() { + console.log('Go to next page'); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/photo-gallery-grid.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/photo-gallery-grid.component.ts new file mode 100644 index 0000000..2b6ce77 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/photo-gallery-grid.component.ts @@ -0,0 +1,107 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +@Component({ + selector: 'app-photo-gallery-grid', + standalone: true, + imports: [], + template: `@if (imageUrls(); as images) { + +}`, + styles: [` +:host { + display: block; +} + +.gallery-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: repeat(2, 1fr); /* Use fractional units for rows */ + aspect-ratio: 2 / 1; /* Give the whole container a defined aspect ratio */ + gap: var(--haven-spacing-2, 8px); + border-radius: var(--haven-border-radius-lg, 12px); + overflow: hidden; /* Ensures the images inside conform to the rounded corners */ +} + +.gallery-item { + position: relative; + overflow: hidden; + cursor: pointer; +} + +.gallery-item img { + width: 100%; + height: 100%; + object-fit: cover; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.gallery-item:hover img { + transform: scale(1.05); + filter: brightness(0.9); +} + +.main-image { + grid-column: span 2; + grid-row: span 2; +} + +.show-all-photos-button { + position: absolute; + bottom: var(--haven-spacing-3, 16px); + right: var(--haven-spacing-3, 16px); + display: flex; + align-items: center; + gap: var(--haven-spacing-2, 8px); + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-sm, 14px); + font-weight: var(--haven-font-weight-medium, 500); + padding: var(--haven-spacing-2, 8px) var(--haven-spacing-3, 16px); + background-color: var(--haven-surface, #FFFFFF); + color: var(--haven-text-primary, #222222); + border: var(--haven-border-default, 1px solid #EAEAEA); + border-radius: var(--haven-border-radius-md, 8px); + cursor: pointer; + box-shadow: var(--haven-shadow-subtle, 0px 4px 12px rgba(0, 0, 0, 0.05)); + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.show-all-photos-button:hover { + box-shadow: var(--haven-shadow-medium, 0px 6px 16px rgba(0, 0, 0, 0.08)); + transform: translateY(-2px); +} + +.show-all-photos-button .material-icons { + font-size: 18px; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PhotoGalleryGridComponent { + imageUrls = input([]); + propertyTitle = input(''); +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/property-card.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/property-card.component.ts new file mode 100644 index 0000000..9e17807 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/property-card.component.ts @@ -0,0 +1,132 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core'; +import { RatingStarsComponent } from './rating-stars.component'; +import { ChatService } from '../../../chat/chat.service'; + +@Component({ + selector: 'app-property-card', + standalone: true, + imports: [RatingStarsComponent], + template: `
      + @if (imgUrl()) { +
      + +
      + } +
      + @if (location()) { +

      {{ location() }}

      + } + @if (rating() && reviewCount()) { + + } + @if (title()) { +

      {{ title() }}

      + } + @if (pricePerNight()) { +

      + \${{ pricePerNight() }} night +

      + } +
      +
      `, + styles: [` +:host { + display: flex; + font-family: var(--haven-font-family, sans-serif); + cursor: pointer; + max-width: 400px; +} + +.property-card { + padding: 20px; +} + +.image-wrapper { + position: relative; + width: 300px; + aspect-ratio: 1 / 1; + overflow: cover; + border-radius: var(--haven-border-radius-lg, 12px); + margin-bottom: var(--haven-spacing-3, 16px); +} + +.property-image { + width: 100%; + height: 100%; + object-fit: cover; + transition: var(--haven-transition-default, all 0.2s ease-in-out); + border-radius: var(--haven-border-radius-lg, 12px); +} + +:host(:hover) .property-image { + transform: scale(1.05); +} + +.card-content { + display: flex; + flex-direction: column; + gap: var(--haven-spacing-1, 4px); /* Tighter spacing for text content */ +} + +.location { + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); + margin: 0; + /* Truncate long location strings */ + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.title { + font-size: var(--haven-text-base, 16px); + color: var(--haven-text-secondary, #555555); + margin: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.price { + font-size: var(--haven-text-base, 16px); + color: var(--haven-text-secondary, #555555); + margin: 0; + margin-top: var(--haven-spacing-1, 4px); +} + +.price strong { + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class PropertyCardComponent { + chatService = inject(ChatService); + imageUrls = input([]); + location = input(); + title = input(); + pricePerNight = input(); + rating = input(); + reviewCount = input(); + imgUrl = computed(() => { + if (this.imageUrls() && this.imageUrls()!.length > 0) { + return this.imageUrls()![0]; + } else { + return ''; + } + }) + + viewDetail(): void { + this.chatService.addUserPrompt(`Show me detail for the ${this.title()} listing`); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/rating-stars.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/rating-stars.component.ts new file mode 100644 index 0000000..01d0dc5 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/rating-stars.component.ts @@ -0,0 +1,70 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core'; + +@Component({ + selector: 'app-rating-stars', + standalone: true, + imports: [], + template: `
      +
      + + @for (star of fullStars(); track $index) { + star + } + + @if (hasHalfStar()) { + star_half + } + + @for (star of emptyStars(); track $index) { + star_border + } +
      + @if (reviewCount(); as count) { + ({{ count }}) + } +
      `, + styles: [` +.rating-container { + display: inline-flex; + align-items: center; + gap: var(--haven-spacing-2, 8px); /* Gap between stars and review count */ + font-family: var(--haven-font-family, sans-serif); +} + +.stars { + display: flex; + align-items: center; + color: var(--haven-accent-gold, #FFB400); +} + +.star { + font-size: var(--haven-text-lg, 18px); + /* Prevents the user from selecting the icon text */ + user-select: none; +} + +.review-count { + font-size: var(--haven-text-sm, 14px); + color: var(--haven-text-muted, #888888); + /* Nudge the count down slightly for better visual alignment with stars */ + transform: translateY(1px); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RatingStarsComponent { + rating = input(); + reviewCount = input(); + + fullStars = computed(() => Array(Math.floor(this.rating() ?? 0)).fill(0)); + hasHalfStar = computed(() => (this.rating() ?? 0) % 1 !== 0); + emptyStars = computed(() => Array(5 - Math.ceil(this.rating() ?? 0)).fill(0)); +} \ No newline at end of file diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/review-card.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/review-card.component.ts new file mode 100644 index 0000000..80cc4ca --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/review-card.component.ts @@ -0,0 +1,115 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { RatingStarsComponent } from './rating-stars.component'; + +export type Review = { + author: { + name: string; + avatarUrl: string; + }; + date: string; + rating: number; + text: string; +}; + +@Component({ + selector: 'app-review-card', + standalone: true, + imports: [RatingStarsComponent], + template: `@if (review(); as reviewData) { +
      +
      + @if (reviewData.author && reviewData.author.avatarUrl) { + +
      +
      {{ reviewData.author.name }}
      +

      {{ reviewData.date }}

      +
      + } +
      +
      + +

      {{ reviewData.text }}

      +
      +
      +}`, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); +} + +.review-card { + margin-bottom: 10px; + display: flex; + flex-direction: column; + gap: var(--haven-spacing-3, 16px); +} + +.review-header { + display: flex; + align-items: center; + gap: var(--haven-spacing-3, 16px); +} + +.avatar { + width: 48px; + height: 48px; + border-radius: 50%; + object-fit: cover; +} + +.author-info { + line-height: 1.4; +} + +.author-name { + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); + margin: 0; +} + +.review-date { + font-size: var(--haven-text-sm, 14px); + color: var(--haven-text-muted, #888888); + margin: 0; +} + +.review-body { + display: flex; + flex-direction: column; + gap: var(--haven-spacing-2, 8px); +} + +.review-text { + font-size: var(--haven-text-base, 16px); + line-height: var(--haven-line-height-body, 1.6); + color: var(--haven-text-secondary, #555555); + margin: 0; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 5; /* Show up to 5 lines of text */ + overflow: hidden; +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ReviewCardComponent { + review = input({ + author: { + name: '', + avatarUrl: '', + }, + date: '', + rating: 0, + text: '', + }); +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/rules-and-policies.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/rules-and-policies.component.ts new file mode 100644 index 0000000..29a574d --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/rules-and-policies.component.ts @@ -0,0 +1,120 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +export type Rule = { + text: string; + allowed: boolean; +}; + +export type Policy = { + title: string; + content: string; +}; + +@Component({ + selector: 'app-rules-and-policies', + standalone: true, + imports: [], + template: `
      +

      Things to know

      +
      + +
      +

      House rules

      +
      + @for (rule of rules(); track rule.text) { +
      + @if (rule.allowed) { + check + } @else { + close + } + {{ rule.text }} +
      + } +
      +
      + + + @if (policies(); as policyList) { +
      +

      Also note

      +
      + @for (policy of policyList; track policy.title) { +
      + {{ policy.title }}: + {{ policy.content }} +
      + } +
      +
      + } +
      +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); + padding: var(--haven-spacing-5, 32px) 0; + border-bottom: var(--haven-border-default, 1px solid #EAEAEA); +} + +h2 { + font-size: var(--haven-text-xl, 24px); + font-weight: var(--haven-font-weight-semibold, 600); + color: var(--haven-text-primary, #222222); + margin: 0 0 var(--haven-spacing-4, 24px) 0; +} + +.grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: var(--haven-spacing-5, 32px); +} + +.section h3 { + font-size: var(--haven-text-lg, 18px); + font-weight: var(--haven-font-weight-semibold, 600); + margin: 0 0 var(--haven-spacing-3, 16px) 0; +} + +.list { + display: flex; + flex-direction: column; + gap: var(--haven-spacing-3, 16px); +} + +.list-item { + display: flex; + align-items: center; + gap: var(--haven-spacing-3, 16px); + font-size: var(--haven-text-base, 16px); + color: var(--haven-text-secondary, #555555); +} + +.list-item.policy { + align-items: flex-start; +} + +.list-item .material-icons { + font-size: 24px; + color: var(--haven-text-primary, #222222); +} + +.icon-close { + color: var(--haven-error, #dc3545); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RulesAndPoliciesComponent { + rules = input([]); + policies = input(); +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/site-footer.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/site-footer.component.ts new file mode 100644 index 0000000..1af2074 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/site-footer.component.ts @@ -0,0 +1,144 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +export type FooterLink = { + text: string; + url: string; +}; + +export type FooterColumn = { + title: string; + links: FooterLink[]; +}; + +export type SocialLink = { + platform: 'facebook' | 'instagram' | 'twitter'; + url: string; +}; + +@Component({ + selector: 'app-site-footer', + standalone: true, + imports: [], + template: `
      +
      + +
      +
      + + @if (socialLinks(); as socials) { + + } +
      +
      `, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); + background-color: var(--haven-text-primary, #222222); + color: var(--haven-surface, #FFFFFF); + padding: var(--haven-spacing-6, 48px) var(--haven-spacing-5, 32px) var(--haven-spacing-4, 24px); +} + +.main-content { + max-width: 1200px; + margin: 0 auto; +} + +.link-columns { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: var(--haven-spacing-5, 32px); + padding-bottom: var(--haven-spacing-5, 32px); +} + +.link-column h3 { + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-semibold, 600); + margin: 0 0 var(--haven-spacing-3, 16px) 0; + opacity: 0.9; +} + +.link-column ul { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: var(--haven-spacing-3, 16px); +} + +.link-column a { + color: var(--haven-surface, #FFFFFF); + text-decoration: none; + opacity: 0.7; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.link-column a:hover { + opacity: 1; + text-decoration: underline; +} + +.bottom-bar { + max-width: 1200px; + margin: 0 auto; + padding-top: var(--haven-spacing-4, 24px); + border-top: 1px solid rgba(255, 255, 255, 0.1); + display: flex; + justify-content: space-between; + align-items: center; + font-size: var(--haven-text-sm, 14px); + opacity: 0.7; +} + +.social-links { + display: flex; + align-items: center; + gap: var(--haven-spacing-4, 24px); +} + +.social-links a { + opacity: 0.7; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.social-links a:hover { + opacity: 1; +} + +.social-links img { + filter: invert(1); /* Makes the favicons white */ +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SiteFooterComponent { + linkColumns = input([]); + socialLinks = input([]); +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/user-booking-card.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/user-booking-card.component.ts new file mode 100644 index 0000000..be4f675 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/user-booking-card.component.ts @@ -0,0 +1,171 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; + +export type BookingStatus = 'Upcoming' | 'Past' | 'Cancelled'; +export type Booking = { + property: { + name: string; + imageUrl: string; + }; + checkInDate: string; + checkOutDate: string; + status: BookingStatus; +}; + +@Component({ + selector: 'app-user-booking-card', + standalone: true, + imports: [], + template: `@if (booking(); as bookingData) { +
      +
      + +
      +
      +
      +

      {{ bookingData.property.name }}

      +
      {{ bookingData.status }}
      +
      +
      +
      + Check-in + {{ bookingData.checkInDate }} +
      +
      + Checkout + {{ bookingData.checkOutDate }} +
      +
      +
      + +
      +
      +
      +}`, + styles: [` +:host { + display: block; + font-family: var(--haven-font-family, sans-serif); +} + +.card-container { + display: flex; + gap: var(--haven-spacing-4, 24px); + background-color: var(--haven-surface, #FFFFFF); + border: var(--haven-border-default, 1px solid #EAEAEA); + border-radius: var(--haven-border-radius-lg, 12px); + box-shadow: var(--haven-shadow-subtle, 0px 4px 12px rgba(0, 0, 0, 0.05)); + overflow: hidden; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.card-container:hover { + box-shadow: var(--haven-shadow-medium, 0px 6px 16px rgba(0, 0, 0, 0.08)); + transform: translateY(-2px); +} + +.image-wrapper { + position: relative; + width: 200px; + flex-shrink: 0; +} + +.image-wrapper img { + object-fit: cover; +} + +.content-wrapper { + display: flex; + flex-direction: column; + justify-content: space-between; + padding: var(--haven-spacing-4, 24px); + flex-grow: 1; +} + +.property-info { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: var(--haven-spacing-3, 16px); +} + +.property-name { + font-size: var(--haven-text-lg, 18px); + font-weight: var(--haven-font-weight-semibold, 600); + margin: 0; +} + +.status-badge { + font-size: var(--haven-text-xs, 12px); + font-weight: var(--haven-font-weight-medium, 500); + padding: var(--haven-spacing-1, 4px) var(--haven-spacing-2, 8px); + border-radius: 999px; + color: var(--haven-surface, #FFFFFF); + flex-shrink: 0; +} + +.card-container.upcoming .status-badge { background-color: var(--haven-primary, #007A7A); } +.card-container.past .status-badge { background-color: var(--haven-text-muted, #888888); } +.card-container.cancelled .status-badge { background-color: var(--haven-error, #dc3545); } + +.trip-info { + display: flex; + gap: var(--haven-spacing-5, 32px); + margin: var(--haven-spacing-3, 16px) 0; +} + +.date-item .label { + display: block; + font-size: var(--haven-text-sm, 14px); + color: var(--haven-text-muted, #888888); +} + +.date-item .value { + font-size: var(--haven-text-base, 16px); + font-weight: var(--haven-font-weight-medium, 500); +} + +.actions { + margin-top: auto; + padding-top: var(--haven-spacing-3, 16px); + border-top: var(--haven-border-default, 1px solid #EAEAEA); +} + +.action-button { + font-family: var(--haven-font-family, sans-serif); + font-size: var(--haven-text-sm, 14px); + font-weight: var(--haven-font-weight-medium, 500); + color: var(--haven-text-primary, #222222); + background-color: var(--haven-surface, #FFFFFF); + border: var(--haven-border-default, 1px solid #EAEAEA); + border-radius: var(--haven-border-radius-md, 8px); + padding: var(--haven-spacing-2, 8px) var(--haven-spacing-3, 16px); + cursor: pointer; + transition: var(--haven-transition-default, all 0.2s ease-in-out); +} + +.action-button:hover { + background-color: var(--haven-bg, #F9F9F9); + border-color: var(--haven-text-primary, #222222); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class UserBookingCardComponent { + booking = input({ + property: { + name: '', + imageUrl: '', + }, + checkInDate: '', + checkOutDate: '', + status: 'Upcoming', + }); +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/components/view-details-button.component.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/view-details-button.component.ts new file mode 100644 index 0000000..f90dc1b --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/components/view-details-button.component.ts @@ -0,0 +1,43 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Component, input, inject } from '@angular/core'; +import { ChatService } from '../../../chat/chat.service'; + +@Component({ + selector: 'app-view-details-button', + standalone: true, + template: ` + @if (listingName()) { + + } + `, + styles: [` + button { + padding: var(--haven-spacing-2) var(--haven-spacing-3); + border: none; + background-color: var(--haven-primary); + color: white; + border-radius: var(--haven-border-radius-md); + cursor: pointer; + font-family: var(--haven-font-family); + transition: var(--haven-transition-default); + } + button:hover { + background-color: var(--haven-primary-dark); + } + `], +}) +export class ViewDetailsButtonComponent { + listingName = input(); + private chatService = inject(ChatService); + + viewDetails(): void { + this.chatService.addUserPrompt(`Show me detail for the ${this.listingName()} listing`); + } +} diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/data-store.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/data-store.ts new file mode 100644 index 0000000..79fc1a6 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/data-store.ts @@ -0,0 +1,1959 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +export interface Host { + name: string; + avatarUrl: string; + joinDate: string; + isSuperhost: boolean; +} + +export interface Amenity { + name: string; + icon: string; +} + +export interface Rule { + text: string; + allowed: boolean; +} + +export interface Policy { + title: string; + content: string; +} + +export interface ReviewAuthor { + name: string; + avatarUrl: string; +} + +export interface Review { + author: ReviewAuthor; + date: string; + rating: number; + text: string; +} + +export interface ListingImage { + url: string; + alt: string; +} + +export interface Listing { + id: string; + title: string; + location: string; + pricePerNight: number; + rating: number; + reviewCount: number; + guests: number; + bedrooms: number; + beds: number; + baths: number; + description: string; + host: Host; + amenities: Amenity[]; + rules: Rule[]; + policies: Policy[]; + reviews: Review[]; + coverImg: ListingImage; + imgs: ListingImage[]; +} + +export const DATA: Listing[] = [ + { + id: '1', + title: 'Cozy Mountain Cabin', + location: 'Aspen, Colorado', + pricePerNight: 250, + rating: 4.8, + reviewCount: 120, + guests: 4, + bedrooms: 2, + beds: 2, + baths: 1, + description: 'Escape to our charming cabin nestled in the heart of the Rocky Mountains. Perfect for a romantic getaway or a small family vacation, this cozy retreat offers breathtaking views, a warm fireplace, and easy access to world-class skiing and hiking trails. The interior is thoughtfully decorated with rustic charm and modern amenities to ensure a comfortable stay.', + host: { + name: 'John & Jane Smith', + avatarUrl: 'properties/mountain-cabin.png', + joinDate: '2018-05-12', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'TV', icon: 'tv' }, + { name: 'Iron', icon: 'iron' }, + { name: 'Hair dryer', icon: 'dryer' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Dryer', icon: 'local_laundry_service' }, + { name: 'Hot water', icon: 'hot_tub' }, + { name: 'Fireplace', icon: 'fireplace' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Shampoo', icon: 'wash' }, + { name: 'Conditioner', icon: 'wash' }, + { name: 'Shower gel', icon: 'wash' }, + { name: 'Bed linens', icon: 'bed' }, + { name: 'Extra pillows and blankets', icon: 'bed' }, + { name: 'Hangers', icon: 'hanger' }, + { name: 'Smoke alarm', icon: 'smoke_free' }, + { name: 'Carbon monoxide alarm', icon: 'smoke_free' }, + { name: 'First aid kit', icon: 'medical_services' }, + { name: 'Fire extinguisher', icon: 'fire_extinguisher' }, + { name: 'Dishes and silverware', icon: 'restaurant' }, + { name: 'Cooking basics', icon: 'soup_kitchen' }, + { name: 'Oven', icon: 'oven' }, + { name: 'Stove', icon: 'stove' }, + { name: 'Refrigerator', icon: 'kitchen' }, + { name: 'Dishwasher', icon: 'dishwasher' }, + { name: 'Coffee maker', icon: 'coffee_maker' }, + { name: 'Microwave', icon: 'microwave' }, + { name: 'Toaster', icon: 'toaster' }, + { name: 'Blender', icon: 'blender' }, + { name: 'Barbecue utensils', icon: 'outdoor_grill' }, + { name: 'Dining table', icon: 'restaurant' }, + { name: 'Patio or balcony', icon: 'balcony' }, + { name: 'Backyard', icon: 'yard' }, + { name: 'Outdoor furniture', icon: 'deck' }, + { name: 'BBQ grill', icon: 'outdoor_grill' }, + { name: 'Freezer', icon: 'ac_unit' }, + { name: 'Lake access', icon: 'waves' }, + { name: 'Mountain views', icon: 'terrain' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + { text: 'Check-in is anytime after 3 PM', allowed: true }, + { text: 'Check-out by 11 AM', allowed: true }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Free cancellation for 48 hours. After that, cancel up to 7 days before check-in and get a 50% refund, minus the service fee.' }, + ], + reviews: [ + { + author: { name: 'Alice', avatarUrl: 'properties/mountain-cabin.png' }, + date: '2023-10-15', + rating: 5, + text: 'This cabin was the perfect mountain getaway! The views were incredible, and the fireplace made it so cozy. We loved being so close to the ski slopes. Highly recommend!', + }, + { + author: { name: 'Bob', avatarUrl: 'properties/mountain-cabin-2.png' }, + date: '2023-09-28', + rating: 4, + text: 'A wonderful and peaceful retreat. The cabin was clean and well-equipped. The only downside was the spotty wifi, but it was nice to disconnect for a bit.', + }, + { + author: { name: 'Charlie', avatarUrl: 'properties/mountain-cabin-3.png' }, + date: '2023-08-12', + rating: 5, + text: 'We had an amazing time! The cabin is even more beautiful in person. The hosts were very responsive and provided great recommendations for local hikes.', + }, + ], + coverImg: { + url: 'properties/mountain-cabin.png', + alt: 'A cozy cabin in the mountains of Aspen, Colorado.', + }, + imgs: [ + { url: 'properties/mountain-cabin.png', alt: 'The cabin exterior with a backdrop of snow-covered mountains.' }, + { url: 'properties/mountain-cabin-2.png', alt: 'The living room with a stone fireplace and comfortable seating.' }, + { url: 'properties/mountain-cabin-3.png', alt: 'The kitchen with modern appliances and rustic decor.' }, + { url: 'properties/mountain-cabin.png', alt: 'The bedroom with a queen-sized bed and a view of the forest.' }, + ], + }, + { + id: '2', + title: 'Luxury Beachfront Villa', + location: 'Bali, Indonesia', + pricePerNight: 500, + rating: 4.9, + reviewCount: 250, + guests: 8, + bedrooms: 4, + beds: 4, + baths: 4, + description: 'Indulge in the ultimate tropical escape at our luxurious beachfront villa in Bali. With a private infinity pool, direct beach access, and stunning ocean views from every room, this is the perfect setting for an unforgettable vacation. Our dedicated staff is on hand to cater to your every need, from arranging private yoga sessions to preparing delicious local cuisine.', + host: { + name: 'Wayan', + avatarUrl: 'properties/beach-villa.png', + joinDate: '2017-02-20', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'TV', icon: 'tv' }, + { name: 'Iron', icon: 'iron' }, + { name: 'Hair dryer', icon: 'dryer' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Dryer', icon: 'local_laundry_service' }, + { name: 'Hot water', icon: 'hot_tub' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Shampoo', icon: 'wash' }, + { name: 'Conditioner', icon: 'wash' }, + { name: 'Shower gel', icon: 'wash' }, + { name: 'Bed linens', icon: 'bed' }, + { name: 'Extra pillows and blankets', icon: 'bed' }, + { name: 'Hangers', icon: 'hanger' }, + { name: 'Smoke alarm', icon: 'smoke_free' }, + { name: 'Carbon monoxide alarm', icon: 'smoke_free' }, + { name: 'First aid kit', icon: 'medical_services' }, + { name: 'Fire extinguisher', icon: 'fire_extinguisher' }, + { name: 'Dishes and silverware', icon: 'restaurant' }, + { name: 'Cooking basics', icon: 'soup_kitchen' }, + { name: 'Oven', icon: 'oven' }, + { name: 'Stove', icon: 'stove' }, + { name: 'Refrigerator', icon: 'kitchen' }, + { name: 'Dishwasher', icon: 'dishwasher' }, + { name: 'Coffee maker', icon: 'coffee_maker' }, + { name: 'Microwave', icon: 'microwave' }, + { name: 'Toaster', icon: 'toaster' }, + { name: 'Blender', icon: 'blender' }, + { name: 'Barbecue utensils', icon: 'outdoor_grill' }, + { name: 'Dining table', icon: 'restaurant' }, + { name: 'Patio or balcony', icon: 'balcony' }, + { name: 'Backyard', icon: 'yard' }, + { name: 'Outdoor furniture', icon: 'deck' }, + { name: 'BBQ grill', icon: 'outdoor_grill' }, + { name: 'Beach access', icon: 'waves' }, + { name: 'Ocean views', icon: 'ocean' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + { text: 'Check-in is anytime after 4 PM', allowed: true }, + { text: 'Check-out by 12 PM', allowed: true }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in and get a full refund. Cancel up to 14 days before check-in and get a 50% refund.' }, + ], + reviews: [ + { + author: { name: 'David', avatarUrl: 'properties/beach-villa.png' }, + date: '2023-11-05', + rating: 5, + text: 'This villa is absolute paradise! The photos don\'t do it justice. The private pool and beach access were incredible. The staff was so friendly and helpful. We can\'t wait to come back!', + }, + { + author: { name: 'Emily', avatarUrl: 'properties/beach-villa-2.png' }, + date: '2023-10-22', + rating: 5, + text: 'A truly luxurious experience. The villa was spotless, the beds were comfortable, and the views were breathtaking. Wayan was an amazing host. Worth every penny!', + }, + { + author: { name: 'Frank', avatarUrl: 'properties/beach-villa-3.png' }, + date: '2023-09-18', + rating: 4, + text: 'We had a fantastic stay. The location is perfect, right on the beach. The only minor issue was that the air conditioning in one of the bedrooms was a bit noisy.', + }, + ], + coverImg: { + url: 'properties/beach-villa.png', + alt: 'A luxurious beachfront villa in Bali with a private infinity pool.', + }, + imgs: [ + { url: 'properties/beach-villa.png', alt: 'The villa\'s exterior with the infinity pool overlooking the ocean.' }, + { url: 'properties/beach-villa-2.png', alt: 'The spacious living area with floor-to-ceiling windows and ocean views.' }, + { url: 'properties/beach-villa-3.png', alt: 'The master bedroom with a king-sized bed and a private balcony.' }, + { url: 'properties/beach-villa.png', alt: 'The outdoor dining area, perfect for enjoying meals with a view.' }, + ], + }, + { + id: '3', + title: 'Traditional Japanese Machiya', + location: 'Kyoto, Japan', + pricePerNight: 300, + rating: 4.9, + reviewCount: 180, + guests: 6, + bedrooms: 3, + beds: 3, + baths: 2, + description: 'Experience the charm of old Kyoto in our beautifully restored machiya. This traditional wooden townhouse combines authentic Japanese design with modern comforts. Relax in the private garden, sleep on comfortable futons, and immerse yourself in the local culture. Located in the historic Gion district, you\'ll be just steps away from temples, shrines, and traditional tea houses.', + host: { + name: 'Yuki', + avatarUrl: 'properties/japanese-house.png', + joinDate: '2019-01-15', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'TV', icon: 'tv' }, + { name: 'Iron', icon: 'iron' }, + { name: 'Hair dryer', icon: 'dryer' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Dryer', icon: 'local_laundry_service' }, + { name: 'Hot water', icon: 'hot_tub' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Shampoo', icon: 'wash' }, + { name: 'Conditioner', icon: 'wash' }, + { name: 'Shower gel', icon: 'wash' }, + { name: 'Bed linens', icon: 'bed' }, + { name: 'Extra pillows and blankets', icon: 'bed' }, + { name: 'Hangers', icon: 'hanger' }, + { name: 'Smoke alarm', icon: 'smoke_free' }, + { name: 'Carbon monoxide alarm', icon: 'smoke_free' }, + { name: 'First aid kit', icon: 'medical_services' }, + { name: 'Fire extinguisher', icon: 'fire_extinguisher' }, + { name: 'Dishes and silverware', icon: 'restaurant' }, + { name: 'Cooking basics', icon: 'soup_kitchen' }, + { name: 'Refrigerator', icon: 'kitchen' }, + { name: 'Coffee maker', icon: 'coffee_maker' }, + { name: 'Microwave', icon: 'microwave' }, + { name: 'Toaster', icon: 'toaster' }, + { name: 'Dining table', icon: 'restaurant' }, + { name: 'Garden', icon: 'yard' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + { text: 'Please take off your shoes inside', allowed: true }, + { text: 'Check-in is anytime after 3 PM', allowed: true }, + { text: 'Check-out by 10 AM', allowed: true }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in and get a full refund. Cancel up to 7 days before check-in and get a 50% refund.' }, + ], + reviews: [ + { + author: { name: 'Grace', avatarUrl: 'properties/japanese-house.png' }, + date: '2023-10-30', + rating: 5, + text: 'Staying in this machiya was a truly special experience. It was like stepping back in time, but with all the modern conveniences. The location in Gion was perfect for exploring. Yuki was a wonderful host!', + }, + { + author: { name: 'Henry', avatarUrl: 'properties/japanese-house-2.png' }, + date: '2023-09-25', + rating: 5, + text: 'An unforgettable stay. The machiya is beautifully preserved and the private garden is a peaceful oasis. We loved sleeping on the futons. Highly recommended for an authentic Kyoto experience.', + }, + { + author: { name: 'Isabella', avatarUrl: 'properties/japanese-house-3.png' }, + date: '2023-08-20', + rating: 4, + text: 'A charming and unique place to stay. The location is fantastic. The stairs to the second floor are quite steep, which might be a challenge for some, but it adds to the authenticity.', + }, + ], + coverImg: { + url: 'properties/japanese-house.png', + alt: 'A traditional Japanese machiya in Kyoto with a private garden.', + }, + imgs: [ + { url: 'properties/japanese-house.png', alt: 'The exterior of the machiya with its wooden lattice work.' }, + { url: 'properties/japanese-house-2.png', alt: 'The tatami mat room with sliding paper doors.' }, + { url: 'properties/japanese-house-3.png', alt: 'The serene private garden with a stone lantern.' }, + { url: 'properties/japanese-house.png', alt: 'The modern bathroom with a deep soaking tub.' }, + ], + }, + { + id: '4', + title: 'Stylish Loft in the Heart of the City', + location: 'New York, New York', + pricePerNight: 400, + rating: 4.7, + reviewCount: 300, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Live like a true New Yorker in our stylish loft in the vibrant East Village. With its high ceilings, exposed brick walls, and large windows, this apartment is the perfect urban retreat. You\'ll be surrounded by the city\'s best restaurants, bars, and shops, and just a short walk from several subway lines. The apartment is fully equipped with everything you need for a comfortable stay, including a gourmet kitchen and a luxurious queen-sized bed.', + host: { + name: 'Michael', + avatarUrl: 'properties/city-loft.png', + joinDate: '2016-11-08', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'TV', icon: 'tv' }, + { name: 'Iron', icon: 'iron' }, + { name: 'Hair dryer', icon: 'dryer' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Dryer', icon: 'local_laundry_service' }, + { name: 'Hot water', icon: 'hot_tub' }, + { name: 'Elevator', icon: 'elevator' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Shampoo', icon: 'wash' }, + { name: 'Conditioner', icon: 'wash' }, + { name: 'Shower gel', icon: 'wash' }, + { name: 'Bed linens', icon: 'bed' }, + { name: 'Extra pillows and blankets', icon: 'bed' }, + { name: 'Hangers', icon: 'hanger' }, + { name: 'Smoke alarm', icon: 'smoke_free' }, + { name: 'Carbon monoxide alarm', icon: 'smoke_free' }, + { name: 'First aid kit', icon: 'medical_services' }, + { name: 'Fire extinguisher', icon: 'fire_extinguisher' }, + { name: 'Dishes and silverware', icon: 'restaurant' }, + { name: 'Cooking basics', icon: 'soup_kitchen' }, + { name: 'Oven', icon: 'oven' }, + { name: 'Stove', icon: 'stove' }, + { name: 'Refrigerator', icon: 'kitchen' }, + { name: 'Dishwasher', icon: 'dishwasher' }, + { name: 'Coffee maker', icon: 'coffee_maker' }, + { name: 'Microwave', icon: 'microwave' }, + { name: 'Toaster', icon: 'toaster' }, + { name: 'Blender', icon: 'blender' }, + { name: 'Dining table', icon: 'restaurant' }, + { name: 'City views', icon: 'location_city' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + { text: 'Check-in is anytime after 4 PM', allowed: true }, + { text: 'Check-out by 11 AM', allowed: true }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in and get a full refund. After that, no refund.' }, + ], + reviews: [ + { + author: { name: 'Jessica', avatarUrl: 'properties/city-loft.png' }, + date: '2023-11-10', + rating: 5, + text: 'This loft is amazing! The location is unbeatable, and the apartment itself is spacious, clean, and beautifully decorated. Michael was a great host and gave us some fantastic restaurant recommendations.', + }, + { + author: { name: 'Kevin', avatarUrl: 'properties/city-loft.png' }, + date: '2023-10-25', + rating: 4, + text: 'A great place to stay in the heart of the East Village. The apartment was comfortable and had everything we needed. It can be a bit noisy at night, but that\'s to be expected in such a lively neighborhood.', + }, + { + author: { name: 'Laura', avatarUrl: 'properties/city-loft.png' }, + date: '2023-09-30', + rating: 5, + text: 'We loved our stay here! The loft is even better than the pictures. The high ceilings and large windows make it feel so bright and airy. We would definitely stay here again.', + }, + ], + coverImg: { + url: 'properties/city-loft.png', + alt: 'A stylish loft in New York City with high ceilings and exposed brick walls.', + }, + imgs: [ + { url: 'properties/city-loft.png', alt: 'The living area with a comfortable sofa and a view of the city.' }, + { url: 'properties/city-loft.png', alt: 'The gourmet kitchen with stainless steel appliances.' }, + { url: 'properties/city-loft.png', alt: 'The bedroom with a queen-sized bed and a large window.' }, + { url: 'properties/city-loft.png', alt: 'The modern bathroom with a walk-in shower.' }, + ], + }, + { + id: '5', + title: 'Sunny Beachfront Condo', + location: 'Miami, Florida', + pricePerNight: 350, + rating: 4.9, + reviewCount: 180, + guests: 4, + bedrooms: 2, + beds: 2, + baths: 2, + description: 'Wake up to the sound of waves in our stunning beachfront condo in the heart of South Beach. This modern and spacious apartment offers breathtaking ocean views, a private balcony, and direct access to the beach. Enjoy the vibrant nightlife, world-class restaurants, and designer shops, all just steps away. The building features a large swimming pool, a fully-equipped gym, and 24-hour security.', + host: { + name: 'Maria', + avatarUrl: 'properties/beach-villa.png', + joinDate: '2018-08-15', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'TV', icon: 'tv' }, + { name: 'Iron', icon: 'iron' }, + { name: 'Hair dryer', icon: 'dryer' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Dryer', icon: 'local_laundry_service' }, + { name: 'Hot water', icon: 'hot_tub' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Gym', icon: 'fitness_center' }, + { name: 'Elevator', icon: 'elevator' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Shampoo', icon: 'wash' }, + { name: 'Conditioner', icon: 'wash' }, + { name: 'Shower gel', icon: 'wash' }, + { name: 'Bed linens', icon: 'bed' }, + { name: 'Extra pillows and blankets', icon: 'bed' }, + { name: 'Hangers', icon: 'hanger' }, + { name: 'Smoke alarm', icon: 'smoke_free' }, + { name: 'Carbon monoxide alarm', icon: 'smoke_free' }, + { name: 'First aid kit', icon: 'medical_services' }, + { name: 'Fire extinguisher', icon: 'fire_extinguisher' }, + { name: 'Dishes and silverware', icon: 'restaurant' }, + { name: 'Cooking basics', icon: 'soup_kitchen' }, + { name: 'Oven', icon: 'oven' }, + { name: 'Stove', icon: 'stove' }, + { name: 'Refrigerator', icon: 'kitchen' }, + { name: 'Dishwasher', icon: 'dishwasher' }, + { name: 'Coffee maker', icon: 'coffee_maker' }, + { name: 'Microwave', icon: 'microwave' }, + { name: 'Toaster', icon: 'toaster' }, + { name: 'Blender', icon: 'blender' }, + { name: 'Dining table', icon: 'restaurant' }, + { name: 'Patio or balcony', icon: 'balcony' }, + { name: 'Beach access', icon: 'waves' }, + { name: 'Ocean views', icon: 'ocean' } + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + { text: 'Check-in is anytime after 4 PM', allowed: true }, + { text: 'Check-out by 11 AM', allowed: true } + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in and get a full refund. Cancel up to 7 days before check-in and get a 50% refund.' } + ], + reviews: [ + { + author: { name: 'Olivia', avatarUrl: 'properties/beach-villa.png' }, + date: '2023-11-12', + rating: 5, + text: 'This condo is a dream! The location is perfect, the views are incredible, and the apartment is beautifully decorated. We loved having direct beach access and the pool was a great bonus. Maria was a fantastic host!', + }, + { + author: { name: 'Peter', avatarUrl: 'properties/beach-villa-2.png' }, + date: '2023-10-28', + rating: 5, + text: 'An amazing place to stay in South Beach. The condo was spotless and had everything we needed. The balcony was our favorite spot to relax and watch the ocean. Highly recommend!', + }, + { + author: { name: 'Quinn', avatarUrl: 'properties/beach-villa-3.png' }, + date: '2023-09-22', + rating: 4, + text: 'We had a great time. The location is unbeatable. The only small issue was that the elevator was a bit slow at times, but it was a minor inconvenience.', + } + ], + coverImg: { + url: 'properties/beach-villa.png', + alt: 'A sunny beachfront condo in Miami with a view of the ocean.', + }, + imgs: [ + { url: 'properties/beach-villa.png', alt: 'The living room with a large window overlooking the beach.' }, + { url: 'properties/beach-villa-2.png', alt: 'The modern kitchen with stainless steel appliances.' }, + { url: 'properties/beach-villa-3.png', alt: 'The bedroom with a king-sized bed and a private balcony.' }, + { url: 'properties/beach-villa.png', alt: 'The view from the balcony, showing the beach and the ocean.' }, + ], + }, + { + id: '6', + title: 'Rustic Cabin in the Smoky Mountains', + location: 'Gatlinburg, Tennessee', + pricePerNight: 200, + rating: 4.8, + reviewCount: 150, + guests: 6, + bedrooms: 3, + beds: 3, + baths: 2, + description: 'Experience the beauty of the Great Smoky Mountains in our authentic log cabin. This cozy retreat is perfect for families or groups of friends looking to explore the national park. Enjoy the stunning mountain views from the hot tub on the deck, or curl up by the fireplace with a good book. The cabin is just a short drive from downtown Gatlinburg and all its attractions.', + host: { + name: 'David', + avatarUrl: 'properties/mountain-cabin.png', + joinDate: '2019-03-10', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'TV', icon: 'tv' }, + { name: 'Iron', icon: 'iron' }, + { name: 'Hair dryer', icon: 'dryer' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Dryer', icon: 'local_laundry_service' }, + { name: 'Hot water', icon: 'hot_tub' }, + { name: 'Hot tub', icon: 'hot_tub' }, + { name: 'Fireplace', icon: 'fireplace' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Shampoo', icon: 'wash' }, + { name: 'Conditioner', icon: 'wash' }, + { name: 'Shower gel', icon: 'wash' }, + { name: 'Bed linens', icon: 'bed' }, + { name: 'Extra pillows and blankets', icon: 'bed' }, + { name: 'Hangers', icon: 'hanger' }, + { name: 'Smoke alarm', icon: 'smoke_free' }, + { name: 'Carbon monoxide alarm', icon: 'smoke_free' }, + { name: 'First aid kit', icon: 'medical_services' }, + { name: 'Fire extinguisher', icon: 'fire_extinguisher' }, + { name: 'Dishes and silverware', icon: 'restaurant' }, + { name: 'Cooking basics', icon: 'soup_kitchen' }, + { name: 'Oven', icon: 'oven' }, + { name: 'Stove', icon: 'stove' }, + { name: 'Refrigerator', icon: 'kitchen' }, + { name: 'Dishwasher', icon: 'dishwasher' }, + { name: 'Coffee maker', icon: 'coffee_maker' }, + { name: 'Microwave', icon: 'microwave' }, + { name: 'Toaster', icon: 'toaster' }, + { name: 'Blender', icon: 'blender' }, + { name: 'Barbecue utensils', icon: 'outdoor_grill' }, + { name: 'Dining table', icon: 'restaurant' }, + { name: 'Patio or balcony', icon: 'balcony' }, + { name: 'Backyard', icon: 'yard' }, + { name: 'Outdoor furniture', icon: 'deck' }, + { name: 'BBQ grill', icon: 'outdoor_grill' }, + { name: 'Mountain views', icon: 'terrain' } + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + { text: 'Check-in is anytime after 4 PM', allowed: true }, + { text: 'Check-out by 10 AM', allowed: true } + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in and get a full refund. Cancel up to 7 days before check-in and get a 50% refund.' } + ], + reviews: [ + { + author: { name: 'Rachel', avatarUrl: 'properties/mountain-cabin.png' }, + date: '2023-11-08', + rating: 5, + text: 'This cabin was perfect for our family vacation! The kids loved the hot tub, and we loved the beautiful mountain views. The location is great, close to both the national park and downtown Gatlinburg. David was a very helpful host!', + }, + { + author: { name: 'Steve', avatarUrl: 'properties/mountain-cabin-2.png' }, + date: '2023-10-20', + rating: 5, + text: 'A wonderful and cozy cabin. It was very clean and well-maintained. The fireplace was a nice touch, especially on the chilly evenings. We would definitely stay here again.', + }, + { + author: { name: 'Tina', avatarUrl: 'properties/mountain-cabin-3.png' }, + date: '2023-09-15', + rating: 4, + text: 'We had a great stay. The cabin is in a beautiful and peaceful location. The driveway is a bit steep, but our car handled it fine. The wifi was a little slow, but we didn\'t mind.', + } + ], + coverImg: { + url: 'properties/mountain-cabin.png', + alt: 'A rustic cabin in the Smoky Mountains with a view of the surrounding forest.', + }, + imgs: [ + { url: 'properties/mountain-cabin.png', alt: 'The exterior of the log cabin with a large deck.' }, + { url: 'properties/mountain-cabin-2.png', alt: 'The living room with a stone fireplace and comfortable furniture.' }, + { url: 'properties/mountain-cabin-3.png', alt: 'The hot tub on the deck with a view of the mountains.' }, + { url: 'properties/mountain-cabin.png', alt: 'One of the bedrooms with a queen-sized bed and rustic decor.' }, + ], + }, + { + id: '7', + title: 'Modern Apartment in the Windy City', + location: 'Chicago, Illinois', + pricePerNight: 300, + rating: 4.7, + reviewCount: 200, + guests: 4, + bedrooms: 2, + beds: 2, + baths: 2, + description: 'Explore Chicago from our stylish and modern apartment in the trendy River North neighborhood. With its floor-to-ceiling windows, you\'ll enjoy stunning views of the city skyline. The apartment is just steps away from the city\'s best restaurants, bars, and art galleries. The building features a rooftop pool, a state-of-the-art gym, and a 24-hour doorman.', + host: { + name: 'Jennifer', + avatarUrl: 'properties/city-loft.png', + joinDate: '2017-05-25', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'TV', icon: 'tv' }, + { name: 'Iron', icon: 'iron' }, + { name: 'Hair dryer', icon: 'dryer' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Dryer', icon: 'local_laundry_service' }, + { name: 'Hot water', icon: 'hot_tub' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Gym', icon: 'fitness_center' }, + { name: 'Elevator', icon: 'elevator' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Shampoo', icon: 'wash' }, + { name: 'Conditioner', icon: 'wash' }, + { name: 'Shower gel', icon: 'wash' }, + { name: 'Bed linens', icon: 'bed' }, + { name: 'Extra pillows and blankets', icon: 'bed' }, + { name: 'Hangers', icon: 'hanger' }, + { name: 'Smoke alarm', icon: 'smoke_free' }, + { name: 'Carbon monoxide alarm', icon: 'smoke_free' }, + { name: 'First aid kit', icon: 'medical_services' }, + { name: 'Fire extinguisher', icon: 'fire_extinguisher' }, + { name: 'Dishes and silverware', icon: 'restaurant' }, + { name: 'Cooking basics', icon: 'soup_kitchen' }, + { name: 'Oven', icon: 'oven' }, + { name: 'Stove', icon: 'stove' }, + { name: 'Refrigerator', icon: 'kitchen' }, + { name: 'Dishwasher', icon: 'dishwasher' }, + { name: 'Coffee maker', icon: 'coffee_maker' }, + { name: 'Microwave', icon: 'microwave' }, + { name: 'Toaster', icon: 'toaster' }, + { name: 'Blender', icon: 'blender' }, + { name: 'Dining table', icon: 'restaurant' }, + { name: 'City views', icon: 'location_city' } + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + { text: 'Check-in is anytime after 3 PM', allowed: true }, + { text: 'Check-out by 11 AM', allowed: true } + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in and get a full refund. After that, no refund.' } + ], + reviews: [ + { + author: { name: 'Uma', avatarUrl: 'properties/city-loft.png' }, + date: '2023-11-15', + rating: 5, + text: 'This apartment is absolutely stunning! The views are even better in person. The location is perfect for exploring the city. Jennifer was a great host and provided us with a list of her favorite local spots.', + }, + { + author: { name: 'Victor', avatarUrl: 'properties/city-loft.png' }, + date: '2023-10-30', + rating: 5, + text: 'A fantastic place to stay in Chicago. The apartment was clean, modern, and had everything we needed. The rooftop pool was a huge plus. We would definitely stay here again.', + }, + { + author: { name: 'Wendy', avatarUrl: 'properties/city-loft.png' }, + date: '2023-09-28', + rating: 4, + text: 'We had a great time. The apartment is in a very convenient location. The only downside was that the street noise was a bit loud at times, but that\'s to be expected in a big city.', + } + ], + coverImg: { + url: 'properties/city-loft.png', + alt: 'A modern apartment in Chicago with a view of the city skyline.', + }, + imgs: [ + { url: 'properties/city-loft.png', alt: 'The living room with floor-to-ceiling windows and a view of the city.' }, + { url: 'properties/city-loft.png', alt: 'The sleek and modern kitchen with high-end appliances.' }, + { url: 'properties/city-loft.png', alt: 'The bedroom with a king-sized bed and a stunning city view.' }, + { url: 'properties/city-loft.png', alt: 'The rooftop pool with lounge chairs and a panoramic view of the city.' }, + ], + }, +]; + +export const SUBSET_LISTINGS: Listing[] = [ + { + id: '8', + title: 'Secluded Treehouse with Hot Tub', + location: 'Asheville, North Carolina', + pricePerNight: 350, + rating: 4.9, + reviewCount: 210, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Rekindle the romance in this magical treehouse escape. Nestled in a private forest, this stunning retreat offers a hot tub on the deck, a cozy fireplace, and breathtaking views of the Blue Ridge Mountains. Perfect for honeymoons, anniversaries, or just a quiet getaway.', + host: { + name: 'Sarah', + avatarUrl: 'properties/treehouse.png', + joinDate: '2020-02-14', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchenette', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'Hot tub', icon: 'hot_tub' }, + { name: 'Fireplace', icon: 'fireplace' }, + { name: 'Private entrance', icon: 'meeting_room' }, + { name: 'Mountain views', icon: 'terrain' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + { text: 'No parties or events', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/treehouse.png', + alt: 'A romantic treehouse in the forest.', + }, + imgs: [ + { url: 'properties/treehouse.png', alt: 'A romantic treehouse in the forest.' }, + { url: 'properties/treehouse-2.png', alt: 'A romantic treehouse in the forest.' }, + ], + }, + { + id: '9', + title: 'Oceanfront Cottage for Two', + location: 'Cannon Beach, Oregon', + pricePerNight: 400, + rating: 4.95, + reviewCount: 180, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A charming cottage right on the beach with stunning views of Haystack Rock. This is the perfect spot for a romantic escape. Enjoy long walks on the beach, watch the sunset from your private deck, and fall asleep to the sound of the waves.', + host: { + name: 'Tom', + avatarUrl: 'properties/beach-villa.png', + joinDate: '2019-06-22', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'TV', icon: 'tv' }, + { name: 'Fireplace', icon: 'fireplace' }, + { name: 'Beach access', icon: 'waves' }, + { name: 'Ocean views', icon: 'ocean' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/beach-villa.png', + alt: 'A cozy cottage on the beach.', + }, + imgs: [ + { url: 'properties/beach-villa.png', alt: 'A cozy cottage on the beach.' }, + { url: 'properties/beach-villa-2.png', alt: 'A cozy cottage on the beach.' }, + { url: 'properties/beach-villa-3.png', alt: 'A cozy cottage on the beach.' }, + ], + }, + { + id: '10', + title: 'Vineyard Villa with Private Pool', + location: 'Napa Valley, California', + pricePerNight: 600, + rating: 5.0, + reviewCount: 150, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Indulge in a luxurious getaway at our private villa in the heart of wine country. Surrounded by vineyards, this elegant retreat features a private pool, a gourmet kitchen, and a romantic outdoor dining area. Spend your days wine tasting and your evenings relaxing in style.', + host: { + name: 'Isabella', + avatarUrl: 'properties/tuscan-villa.png', + joinDate: '2018-10-01', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Hot tub', icon: 'hot_tub' }, + { name: 'Fireplace', icon: 'fireplace' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/tuscan-villa.png', + alt: 'A luxurious villa in a vineyard.', + }, + imgs: [ + { url: 'properties/tuscan-villa.png', alt: 'A luxurious villa in a vineyard.' }, + ], + }, + { + id: '11', + title: 'Charming Parisian Apartment', + location: 'Paris, France', + pricePerNight: 250, + rating: 4.8, + reviewCount: 300, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Live like a local in our romantic apartment in the heart of Le Marais. With its classic Parisian charm, including a small balcony overlooking the street, this is the perfect base for exploring the City of Love. Just steps away from charming cafes, boutiques, and museums.', + host: { + name: 'Juliette', + avatarUrl: 'properties/city-loft.png', + joinDate: '2017-04-11', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'Washer', icon: 'local_laundry_service' }, + { name: 'Elevator', icon: 'elevator' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/city-loft.png', + alt: 'A charming apartment in Paris.', + }, + imgs: [ + { url: 'properties/city-loft.png', alt: 'A charming apartment in Paris.' }, + ], + }, + { + id: '12', + title: 'Lakeside Cabin with Private Dock', + location: 'Lake Placid, New York', + pricePerNight: 300, + rating: 4.9, + reviewCount: 190, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A serene and romantic cabin on the shores of Lake Placid. Enjoy swimming, kayaking, and fishing from your private dock. In the evening, cozy up by the fire pit and watch the stars. This is the perfect place to disconnect and reconnect with your partner.', + host: { + name: 'Bill', + avatarUrl: 'properties/lake-house.png', + joinDate: '2019-08-01', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'Fireplace', icon: 'fireplace' }, + { name: 'Lake access', icon: 'waves' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'Pets allowed', allowed: true }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/lake-house.png', + alt: 'A cabin on the lake.', + }, + imgs: [ + { url: 'properties/lake-house.png', alt: 'A cabin on the lake.' }, + ], + }, + { + id: '13', + title: 'Desert Oasis with Stargazing Dome', + location: 'Joshua Tree, California', + pricePerNight: 450, + rating: 4.98, + reviewCount: 250, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'An unforgettable experience in the desert. This unique home features a stargazing dome, a hot tub, and a fire pit. The modern and minimalist design blends seamlessly with the natural landscape. Perfect for a romantic and spiritual retreat.', + host: { + name: 'Luna', + avatarUrl: 'properties/desert-oasis.png', + joinDate: '2021-01-10', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Hot tub', icon: 'hot_tub' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/desert-oasis.png', + alt: 'A modern home in the desert.', + }, + imgs: [ + { url: 'properties/desert-oasis.png', alt: 'A modern home in the desert.' }, + { url: 'properties/desert-oasis-2.png', alt: 'A modern home in the desert.' }, + ], + }, + { + id: '14', + title: 'Historic Carriage House', + location: 'Savannah, Georgia', + pricePerNight: 280, + rating: 4.85, + reviewCount: 220, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Step back in time in this beautifully restored carriage house in the heart of Savannah\'s historic district. With its private courtyard, antique furnishings, and romantic atmosphere, this is the perfect spot for a southern getaway.', + host: { + name: 'Eleanor', + avatarUrl: 'properties/historic-house.png', + joinDate: '2018-03-15', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/historic-house.png', + alt: 'A historic carriage house.', + }, + imgs: [ + { url: 'properties/historic-house.png', alt: 'A historic carriage house.' }, + ], + }, + { + id: '15', + title: 'Cozy A-Frame in the Woods', + location: 'Leavenworth, Washington', + pricePerNight: 250, + rating: 4.9, + reviewCount: 180, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A charming and cozy A-frame cabin nestled in the woods. Perfect for a romantic weekend away from the city. Enjoy the hot tub, the fireplace, and the peaceful sounds of nature. Just a short drive from the Bavarian-themed town of Leavenworth.', + host: { + name: 'Mark', + avatarUrl: 'properties/mountain-cabin.png', + joinDate: '2020-09-01', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'Hot tub', icon: 'hot_tub' }, + { name: 'Fireplace', icon: 'fireplace' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/mountain-cabin.png', + alt: 'An A-frame cabin in the woods.', + }, + imgs: [ + { url: 'properties/mountain-cabin.png', alt: 'An A-frame cabin in the woods.' }, + { url: 'properties/mountain-cabin-2.png', alt: 'An A-frame cabin in the woods.' }, + { url: 'properties/mountain-cabin-3.png', alt: 'An A-frame cabin in the woods.' }, + ], + }, + { + id: '16', + title: 'Tuscan Farmhouse with a View', + location: 'Tuscany, Italy', + pricePerNight: 300, + rating: 4.95, + reviewCount: 200, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Experience the magic of Tuscany in our beautifully restored farmhouse. With stunning views of the rolling hills, a private garden, and a swimming pool, this is the perfect place for a romantic and relaxing vacation. Enjoy cooking with fresh local ingredients in the fully-equipped kitchen.', + host: { + name: 'Giulia', + avatarUrl: 'properties/tuscan-villa.png', + joinDate: '2017-07-20', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Fireplace', icon: 'fireplace' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/tuscan-villa.png', + alt: 'A farmhouse in Tuscany.', + }, + imgs: [ + { url: 'properties/tuscan-villa.png', alt: 'A farmhouse in Tuscany.' }, + ], + }, + { + id: '17', + title: 'Santorini Cave House with Caldera View', + location: 'Oia, Santorini, Greece', + pricePerNight: 500, + rating: 5.0, + reviewCount: 180, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A traditional cave house perched on the cliffs of Oia with a breathtaking view of the caldera. This is the ultimate romantic destination. Enjoy the sunset from your private hot tub on the terrace. An unforgettable experience.', + host: { + name: 'Nikos', + avatarUrl: 'properties/beach-villa-3.png', + joinDate: '2018-05-10', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchenette', icon: 'kitchen' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Hot tub', icon: 'hot_tub' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/beach-villa-3.png', + alt: 'A cave house in Santorini.', + }, + imgs: [ + { url: 'properties/beach-villa-3.png', alt: 'A cave house in Santorini.' }, + ], + }, + { + id: '18', + title: 'Glamping Yurt under the Stars', + location: 'Moab, Utah', + pricePerNight: 200, + rating: 4.9, + reviewCount: 150, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A unique and romantic glamping experience in the desert. Our luxurious yurt is equipped with a comfortable bed, a private bathroom, and a kitchenette. At night, step outside and be amazed by the incredible stargazing opportunities.', + host: { + name: 'Alex', + avatarUrl: 'properties/desert-oasis-2.png', + joinDate: '2021-03-20', + isSuperhost: true, + }, + amenities: [ + { name: 'Kitchenette', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/desert-oasis-2.png', + alt: 'A glamping yurt in the desert.', + }, + imgs: [ + { url: 'properties/desert-oasis-2.png', alt: 'A glamping yurt in the desert.' }, + ], + }, + { + id: '19', + title: 'Riverside Cabin with Sauna', + location: 'Finland', + pricePerNight: 280, + rating: 4.95, + reviewCount: 160, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A traditional Finnish cabin on the banks of a peaceful river. This is the perfect place to relax and rejuvenate. Enjoy the private sauna, take a dip in the river, and go for a walk in the surrounding forest. In the winter, you might even see the Northern Lights.', + host: { + name: 'Hanna', + avatarUrl: 'properties/lake-house.png', + joinDate: '2019-11-05', + isSuperhost: true, + }, + amenities: [ + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'Sauna', icon: 'hot_tub' }, + { name: 'Fireplace', icon: 'fireplace' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/lake-house.png', + alt: 'A cabin by a river in Finland.', + }, + imgs: [ + { url: 'properties/lake-house.png', alt: 'A cabin by a river in Finland.' }, + ], + }, + { + id: '20', + title: 'Bohemian Loft in Greenwich Village', + location: 'New York, New York', + pricePerNight: 320, + rating: 4.8, + reviewCount: 250, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A stylish and romantic loft in the heart of Greenwich Village. With its eclectic decor, cozy reading nook, and large windows, this is the perfect urban oasis for a couple. Explore the charming streets, cafes, and jazz clubs of this iconic neighborhood.', + host: { + name: 'Chloe', + avatarUrl: 'properties/city-loft.png', + joinDate: '2018-09-12', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Heating', icon: 'thermostat' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/city-loft.png', + alt: 'A bohemian loft in New York City.', + }, + imgs: [ + { url: 'properties/city-loft.png', alt: 'A bohemian loft in New York City.' }, + ], + }, + { + id: '21', + title: 'Scottish Highlands Castle Gatehouse', + location: 'Scottish Highlands, Scotland', + pricePerNight: 400, + rating: 4.98, + reviewCount: 190, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Live out your fairytale dreams in this historic castle gatehouse. This unique and romantic property features a spiral staircase, a four-poster bed, and a cozy fireplace. Explore the castle grounds and the stunning scenery of the Scottish Highlands.', + host: { + name: 'Fiona', + avatarUrl: 'properties/historic-house.png', + joinDate: '2019-02-28', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + { name: 'Heating', icon: 'thermostat' }, + { name: 'Fireplace', icon: 'fireplace' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/historic-house.png', + alt: 'A castle gatehouse in the Scottish Highlands.', + }, + imgs: [ + { url: 'properties/historic-house.png', alt: 'A castle gatehouse in the Scottish Highlands.' }, + ], + }, + { + id: '22', + title: 'Overwater Bungalow in the Maldives', + location: 'Maldives', + pricePerNight: 1200, + rating: 5.0, + reviewCount: 220, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'The ultimate romantic escape. Our luxurious overwater bungalow offers direct access to the crystal-clear turquoise waters of the Indian Ocean. Relax on your private deck, go for a swim or a snorkel, and enjoy the stunning sunsets. This is a once-in-a-lifetime experience.', + host: { + name: 'Aisha', + avatarUrl: 'properties/beach-villa-2.png', + joinDate: '2017-12-01', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Private deck', icon: 'deck' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 60 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/beach-villa-2.png', + alt: 'An overwater bungalow in the Maldives.', + }, + imgs: [ + { url: 'properties/beach-villa-2.png', alt: 'An overwater bungalow in the Maldives.' }, + ], + }, + { + id: '23', + title: 'Geodesic Dome on a Volcano', + location: 'Big Island, Hawaii', + pricePerNight: 300, + rating: 4.9, + reviewCount: 170, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A truly unique and adventurous romantic getaway. Our geodesic dome is located on the slopes of a volcano, offering incredible views and a sense of seclusion. Explore the nearby volcano national park and come back to your cozy and modern dome.', + host: { + name: 'Kai', + avatarUrl: 'properties/desert-oasis.png', + joinDate: '2020-10-15', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchenette', icon: 'kitchen' }, + { name: 'Free parking', icon: 'local_parking' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/desert-oasis.png', + alt: 'A geodesic dome on a volcano.', + }, + imgs: [ + { url: 'properties/desert-oasis.png', alt: 'A geodesic dome on a volcano.' }, + ], + }, + { + id: '24', + title: 'Rooftop Apartment with Eiffel Tower View', + location: 'Paris, France', + pricePerNight: 450, + rating: 4.95, + reviewCount: 280, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'The most romantic view in Paris. Our rooftop apartment features a private terrace with a stunning, unobstructed view of the Eiffel Tower. Enjoy a glass of champagne as you watch the tower sparkle at night. A truly magical experience.', + host: { + name: 'Antoine', + avatarUrl: 'properties/city-loft.png', + joinDate: '2018-02-20', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Elevator', icon: 'elevator' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/city-loft.png', + alt: 'An apartment with a view of the Eiffel Tower.', + }, + imgs: [ + { url: 'properties/city-loft.png', alt: 'An apartment with a view of the Eiffel Tower.' }, + ], + }, + { + id: '25', + title: 'Luxury Safari Tent in the Serengeti', + location: 'Serengeti, Tanzania', + pricePerNight: 800, + rating: 5.0, + reviewCount: 150, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'An unforgettable safari experience. Our luxurious tented camp offers all the comforts of a hotel in the heart of the Serengeti. Wake up to the sounds of the wild, go on thrilling game drives, and enjoy romantic dinners under the stars.', + host: { + name: 'Juma', + avatarUrl: 'properties/desert-oasis-2.png', + joinDate: '2019-05-18', + isSuperhost: true, + }, + amenities: [ + { name: 'Ensuite bathroom', icon: 'wash' }, + { name: 'Private deck', icon: 'deck' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 60 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/desert-oasis-2.png', + alt: 'A luxury safari tent.', + }, + imgs: [ + { url: 'properties/desert-oasis-2.png', alt: 'A luxury safari tent.' }, + ], + }, + { + id: '26', + title: 'Canal House in Amsterdam', + location: 'Amsterdam, Netherlands', + pricePerNight: 300, + rating: 4.8, + reviewCount: 260, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A charming and historic canal house in the heart of Amsterdam. With its large windows overlooking the canal, this is the perfect spot for a romantic city break. Explore the city by bike, visit the world-class museums, and enjoy the cozy atmosphere of this unique home.', + host: { + name: 'Annelies', + avatarUrl: 'properties/historic-house.png', + joinDate: '2017-09-01', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Heating', icon: 'thermostat' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/historic-house.png', + alt: 'A canal house in Amsterdam.', + }, + imgs: [ + { url: 'properties/historic-house.png', alt: 'A canal house in Amsterdam.' }, + ], + }, + { + id: '27', + title: 'Private Island Getaway', + location: 'Fiji', + pricePerNight: 2500, + rating: 5.0, + reviewCount: 100, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'The ultimate in luxury and privacy. Rent your own private island in the beautiful waters of Fiji. This is the perfect destination for a honeymoon or a truly special romantic getaway. A private chef and staff are included.', + host: { + name: 'Mana', + avatarUrl: 'properties/beach-villa.png', + joinDate: '2018-11-11', + isSuperhost: true, + }, + amenities: [ + { name: 'Private beach', icon: 'waves' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Private chef', icon: 'restaurant' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 90 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/beach-villa.png', + alt: 'A private island in Fiji.', + }, + imgs: [ + { url: 'properties/beach-villa.png', alt: 'A private island in Fiji.' }, + ], + }, + { + id: '28', + title: 'Ice Hotel Room', + location: 'Jukkasjärvi, Sweden', + pricePerNight: 600, + rating: 4.9, + reviewCount: 120, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A once-in-a-lifetime experience. Sleep in a room made entirely of ice and snow. Each room is a unique work of art, designed and sculpted by artists from around the world. A truly magical and romantic winter adventure.', + host: { + name: 'ICEHOTEL', + avatarUrl: 'properties/mountain-cabin-3.png', + joinDate: '2010-12-01', + isSuperhost: true, + }, + amenities: [ + { name: 'Thermal sleeping bags', icon: 'bed' }, + { name: 'Access to warm building', icon: 'hot_tub' }, + ], + rules: [], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/mountain-cabin-3.png', + alt: 'A room in an ice hotel.', + }, + imgs: [ + { url: 'properties/mountain-cabin-3.png', alt: 'A room in an ice hotel.' }, + ], + }, + { + id: '29', + title: 'Glass Igloo with Northern Lights View', + location: 'Finnish Lapland, Finland', + pricePerNight: 700, + rating: 4.95, + reviewCount: 200, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'Watch the Northern Lights from the comfort of your own bed in our glass igloo. This is one of the most romantic and magical experiences on earth. The igloo is heated and has a private bathroom.', + host: { + name: 'Levin Iglut', + avatarUrl: 'properties/mountain-cabin-2.png', + joinDate: '2015-10-10', + isSuperhost: true, + }, + amenities: [ + { name: 'Heated glass roof', icon: 'thermostat' }, + { name: 'Private bathroom', icon: 'wash' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/mountain-cabin-2.png', + alt: 'A glass igloo.', + }, + imgs: [ + { url: 'properties/mountain-cabin-2.png', alt: 'A glass igloo.' }, + ], + }, + { + id: '30', + title: 'Ryokan with Private Onsen', + location: 'Hakone, Japan', + pricePerNight: 500, + rating: 4.9, + reviewCount: 180, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A traditional Japanese inn with a private hot spring bath (onsen). This is the perfect place to relax and experience Japanese hospitality. Enjoy a multi-course kaiseki dinner and a traditional Japanese breakfast.', + host: { + name: 'Yumi', + avatarUrl: 'properties/japanese-house.png', + joinDate: '2018-04-01', + isSuperhost: true, + }, + amenities: [ + { name: 'Private onsen', icon: 'hot_tub' }, + { name: 'Kaiseki dinner', icon: 'restaurant' }, + { name: 'Japanese breakfast', icon: 'restaurant' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/japanese-house.png', + alt: 'A Japanese ryokan.', + }, + imgs: [ + { url: 'properties/japanese-house.png', alt: 'A Japanese ryokan.' }, + { url: 'properties/japanese-house-2.png', alt: 'A Japanese ryokan.' }, + { url: 'properties/japanese-house-3.png', alt: 'A Japanese ryokan.' }, + ], + }, + { + id: '31', + title: 'Houseboat on the Kerala Backwaters', + location: 'Kerala, India', + pricePerNight: 250, + rating: 4.8, + reviewCount: 160, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A romantic and peaceful journey through the beautiful backwaters of Kerala on a traditional houseboat. Your private crew will cook delicious local meals for you as you glide past lush green rice paddies and charming villages.', + host: { + name: 'Rajesh', + avatarUrl: 'properties/lake-house.png', + joinDate: '2019-01-20', + isSuperhost: true, + }, + amenities: [ + { name: 'Private chef', icon: 'restaurant' }, + ], + rules: [], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/lake-house.png', + alt: 'A houseboat in Kerala.', + }, + imgs: [ + { url: 'properties/lake-house.png', alt: 'A houseboat in Kerala.' }, + ], + }, + { + id: '32', + title: 'Cave Hotel in Cappadocia', + location: 'Cappadocia, Turkey', + pricePerNight: 300, + rating: 4.9, + reviewCount: 220, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A unique and romantic hotel room carved into the rock formations of Cappadocia. Wake up early to see the sky filled with hot air balloons. A truly magical and unforgettable experience.', + host: { + name: 'Fatima', + avatarUrl: 'properties/desert-oasis.png', + joinDate: '2018-06-15', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Turkish bath', icon: 'hot_tub' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/desert-oasis.png', + alt: 'A cave hotel in Cappadocia.', + }, + imgs: [ + { url: 'properties/desert-oasis.png', alt: 'A cave hotel in Cappadocia.' }, + ], + }, + { + id: '33', + title: 'Riad in the Heart of Marrakech', + location: 'Marrakech, Morocco', + pricePerNight: 200, + rating: 4.85, + reviewCount: 240, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A peaceful and romantic oasis in the bustling medina of Marrakech. Our traditional riad features a beautiful courtyard with a fountain, a rooftop terrace with views of the Atlas Mountains, and delicious home-cooked Moroccan meals.', + host: { + name: 'Karim', + avatarUrl: 'properties/historic-house.png', + joinDate: '2017-11-25', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Pool', icon: 'pool' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/historic-house.png', + alt: 'A riad in Marrakech.', + }, + imgs: [ + { url: 'properties/historic-house.png', alt: 'A riad in Marrakech.' }, + ], + }, + { + id: '34', + title: 'Shepherd\'s Hut in the English Countryside', + location: 'Cotswolds, England', + pricePerNight: 180, + rating: 4.9, + reviewCount: 150, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A cozy and romantic shepherd\'s hut in the picturesque Cotswolds. This is the perfect place for a peaceful and charming getaway. Enjoy walks in the countryside, visit quaint villages, and relax by the wood-burning stove.', + host: { + name: 'Rose', + avatarUrl: 'properties/mountain-cabin.png', + joinDate: '2020-08-10', + isSuperhost: true, + }, + amenities: [ + { name: 'Kitchenette', icon: 'kitchen' }, + { name: 'Wood-burning stove', icon: 'fireplace' }, + ], + rules: [ + { text: 'No pets', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 7 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/mountain-cabin.png', + alt: 'A shepherd\'s hut in the Cotswolds.', + }, + imgs: [ + { url: 'properties/mountain-cabin.png', alt: 'A shepherd\'s hut in the Cotswolds.' }, + ], + }, + { + id: '35', + title: 'Mountain Chalet with Sauna', + location: 'Zermatt, Switzerland', + pricePerNight: 500, + rating: 4.95, + reviewCount: 180, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A luxurious and romantic chalet in the Swiss Alps with stunning views of the Matterhorn. After a day of skiing or hiking, relax in the private sauna or cozy up by the fireplace. A truly unforgettable mountain experience.', + host: { + name: 'Hans', + avatarUrl: 'properties/mountain-cabin.png', + joinDate: '2018-12-20', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Sauna', icon: 'hot_tub' }, + { name: 'Fireplace', icon: 'fireplace' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/mountain-cabin.png', + alt: 'A chalet in the Swiss Alps.', + }, + imgs: [ + { url: 'properties/mountain-cabin.png', alt: 'A chalet in the Swiss Alps.' }, + { url: 'properties/mountain-cabin-2.png', alt: 'A chalet in the Swiss Alps.' }, + { url: 'properties/mountain-cabin-3.png', alt: 'A chalet in the Swiss Alps.' }, + ], + }, + { + id: '36', + title: 'Jungle Villa with Private Waterfall', + location: 'Ubud, Bali, Indonesia', + pricePerNight: 400, + rating: 4.98, + reviewCount: 200, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A stunning and romantic villa nestled in the heart of the Balinese jungle. This unique property features a private waterfall and swimming hole. The open-air design allows you to feel at one with nature. A truly magical and spiritual retreat.', + host: { + name: 'Dewi', + avatarUrl: 'properties/treehouse-2.png', + joinDate: '2019-07-15', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Pool', icon: 'pool' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 14 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/treehouse-2.png', + alt: 'A jungle villa in Bali.', + }, + imgs: [ + { url: 'properties/treehouse-2.png', alt: 'A jungle villa in Bali.' }, + ], + }, + { + id: '37', + title: 'Penthouse with Rooftop Hot Tub', + location: 'Sydney, Australia', + pricePerNight: 600, + rating: 4.9, + reviewCount: 210, + guests: 2, + bedrooms: 1, + beds: 1, + baths: 1, + description: 'A luxurious penthouse apartment with a private rooftop hot tub and stunning views of the Sydney Opera House and Harbour Bridge. This is the perfect place for a special occasion or a romantic city getaway. Enjoy the best of Sydney right at your doorstep.', + host: { + name: 'Liam', + avatarUrl: 'properties/city-loft.png', + joinDate: '2018-01-05', + isSuperhost: true, + }, + amenities: [ + { name: 'Wifi', icon: 'wifi' }, + { name: 'Kitchen', icon: 'kitchen' }, + { name: 'Air conditioning', icon: 'ac_unit' }, + { name: 'Hot tub', icon: 'hot_tub' }, + ], + rules: [ + { text: 'No smoking', allowed: false }, + { text: 'No parties or events', allowed: false }, + ], + policies: [ + { title: 'Cancellation policy', content: 'Cancel up to 30 days before check-in for a full refund.' }, + ], + reviews: [], + coverImg: { + url: 'properties/city-loft.png', + alt: 'A penthouse in Sydney.', + }, + imgs: [ + { url: 'properties/city-loft.png', alt: 'A penthouse in Sydney.' }, + ], + }, +]; \ No newline at end of file diff --git a/dynamic-sdui-app/src/app/apps/vacation-rentals/favorites.service.ts b/dynamic-sdui-app/src/app/apps/vacation-rentals/favorites.service.ts new file mode 100644 index 0000000..22eae91 --- /dev/null +++ b/dynamic-sdui-app/src/app/apps/vacation-rentals/favorites.service.ts @@ -0,0 +1,32 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Injectable, signal, WritableSignal } from '@angular/core'; + +export interface PropertyListing { + title: string; + location: string; + rating: number; + reviewCount: number; + imageUrls: string[]; + pricePerNight: number; +} + +@Injectable({ + providedIn: 'root' +}) +export class FavoritesService { + favorites: WritableSignal = signal([]); + + addFavorite(listing: PropertyListing) { + this.favorites.update(favorites => [...favorites, listing]); + } + + removeFavorite(listing: PropertyListing) { + this.favorites.update(favorites => favorites.filter(fav => fav.title !== listing.title)); + } +} diff --git a/dynamic-sdui-app/src/app/base-components/app.component.ts b/dynamic-sdui-app/src/app/base-components/app.component.ts new file mode 100644 index 0000000..5a7d6a4 --- /dev/null +++ b/dynamic-sdui-app/src/app/base-components/app.component.ts @@ -0,0 +1,19 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; + +@Component({ + selector: 'app-root', + standalone: true, + imports: [RouterOutlet], + template: ``, + styles: [``], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class App {} diff --git a/dynamic-sdui-app/src/app/base-components/base.component.ts b/dynamic-sdui-app/src/app/base-components/base.component.ts new file mode 100644 index 0000000..f891e3b --- /dev/null +++ b/dynamic-sdui-app/src/app/base-components/base.component.ts @@ -0,0 +1,108 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ChatComponent } from '../chat/chat.component'; +import { RouterOutlet } from '@angular/router'; +import { APP_CONTEXT } from '../magic-ai/app-context'; + +@Component({ + selector: 'app-base', + standalone: true, + imports: [CommonModule, ChatComponent, RouterOutlet], + template: `
      +
      +

      {{appName}}

      +
      +
      +
      + +
      + +
      +
      `, + styles: [`:host { + display: block; +} + +.toggle-container { + position: fixed; + top: 1rem; + right: 1rem; + z-index: 1000; + background: var(--surface); + padding: var(--spacing-2) var(--spacing-3); + border-radius: var(--border-radius-md); + box-shadow: var(--shadow-medium); + display: flex; + align-items: center; + gap: var(--spacing-2); + font-family: var(--font-family); +} + +.toggle-container button { + font-family: var(--font-family); + font-size: var(--text-sm); + padding: var(--spacing-1) var(--spacing-2); + border: var(--border-default); + border-radius: var(--border-radius-md); + cursor: pointer; +} + +.ai-mode-scaffold { + display: grid; + grid-template-rows: auto 1fr; + height: 100dvh; +} + +.app-header { + background-color: var(--surface); + padding: var(--spacing-3); + border-bottom: var(--border-default); + display: flex; + align-items: center; + justify-content: space-between; +} + +.app-header h1 { + font-size: var(--text-xl); + font-weight: var(--font-weight-semibold); + color: var(--primary); + margin: 0; + text-align: center; + flex-grow: 1; +} + +.header-button { + font-family: var(--font-family); + font-size: var(--text-sm); + padding: var(--spacing-1) var(--spacing-2); + border: var(--border-default); + border-radius: var(--border-radius-md); + cursor: pointer; + background-color: var(--surface); +} + +.main-content { + display: grid; + grid-template-columns: 3fr 1fr; + overflow: hidden; /* Prevent scrolling on the grid container */ + min-height: 0; +} + +.ai-content { + overflow-y: auto; /* Allow scrolling on the AI content area */ + padding: var(--spacing-4); +} +`], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class Base { + appName = APP_CONTEXT.appName; + theme = APP_CONTEXT.theme; +} diff --git a/dynamic-sdui-app/src/app/chat/chat.component.ts b/dynamic-sdui-app/src/app/chat/chat.component.ts new file mode 100644 index 0000000..1b9849a --- /dev/null +++ b/dynamic-sdui-app/src/app/chat/chat.component.ts @@ -0,0 +1,228 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Component, effect, ElementRef, inject, HostBinding } from '@angular/core'; +import { ChatService } from './chat.service'; +import { MagicAiService } from '../magic-ai/magic-ai.service'; +import { FormsModule } from '@angular/forms'; +import { APP_CONTEXT } from '../magic-ai/app-context'; +import { FormatInlineCodePipe } from '../pipes/format-inline-code.pipe'; + +@Component({ + selector: 'app-chat', + standalone: true, + imports: [FormsModule, FormatInlineCodePipe], + template: ` +
      +

      Chat

      +
      + @if (conversationHistory().length === 0) { +
      +

      {{welcomeText}}

      +
      + } @else { + @for (message of conversationHistory(); track $index) { +
      +

      +
      + } + } +
      +
      + + +
      +
      + `, + styles: [` + :host { + display: flex; + flex-direction: column; + height: 100%; + min-height: 0; /* Prevent the component from growing beyond its container */ + background-color: var(--background); + border-left: var(--border-default); + } + .chat-container { + display: flex; + flex-direction: column; + height: 100%; + padding: var(--spacing-3); + box-sizing: border-box; + } + h2 { + margin-top: 0; + font-size: var(--text-lg); + font-weight: var(--font-weight-semibold); + color: var(--primary); + border-bottom: var(--border-default); + padding-bottom: var(--spacing-2); + margin-bottom: var(--spacing-3); + } + .messages { + flex-grow: 1; + overflow-y: auto; + margin-bottom: var(--spacing-3); + display: flex; + flex-direction: column; + gap: var(--spacing-3); + } + .welcome-message { + text-align: center; + padding: var(--spacing-4); + border-radius: var(--border-radius-lg); + color: var(--text-secondary); + display: flex; + align-items: center; + justify-content: center; + flex-grow: 1; + } + .message { + display: flex; + flex-direction: column; + max-width: 80%; + padding: var(--spacing-2) var(--spacing-3); + border-radius: var(--border-radius-lg); + line-height: var(--line-height-body); + } + .message p { + margin: 0; + } + .message strong { + font-weight: var(--font-weight-semibold); + display: block; + margin-bottom: var(--spacing-1); + font-size: var(--text-sm); + } + .user-message { + background-color: var(--primary); + color: white; + align-self: flex-end; + border-bottom-right-radius: var(--spacing-1); + } + .agent-message { + background-color: var(--surface); + color: var(--text-primary); + align-self: flex-start; + border: var(--border-default); + border-bottom-left-radius: var(--spacing-1); + } + .chat-input { + display: flex; + gap: var(--spacing-2); + border-top: var(--border-default); + padding-top: var(--spacing-3); + align-items: flex-end; /* Align items to the top */ + } + .chat-input textarea { + flex-grow: 1; + padding: var(--spacing-2); + border: var(--border-default); + border-radius: var(--border-radius-md); + font-family: var(--font-family); + transition: var(--transition-default); + resize: none; /* Prevent manual resizing */ + overflow-y: auto; /* Show scrollbar when content overflows */ + min-height: 24px; /* Set a reasonable min-height */ + line-height: 1.5; + } + .chat-input textarea:focus { + outline: none; + box-shadow: var(--shadow-focus); + border-color: var(--primary); + } + .send-button { + padding: var(--spacing-2); + color: var(--primary); + border: 1px solid #DCDCDC; + background-color: transparent; + border-radius: var(--border-radius-md); + cursor: pointer; + } + .send-button:hover { + background-color: var(--border); + } + .send-button:disabled { + background-color: var(--surface-2); + color: var(--text-secondary); + cursor: not-allowed; + } + .send-icon { + width: 28px; + height: 48px; + fill: currentColor; + } + `] +}) +export class ChatComponent { + private chatService = inject(ChatService); + private magicAiService = inject(MagicAiService); + isStreamComplete = this.magicAiService.isStreamComplete; + newMessage = ''; + conversationHistory = this.chatService.conversationHistory; + theme = APP_CONTEXT.theme; + welcomeText = APP_CONTEXT.welcomeText; + + @HostBinding('class') get themeClass() { + return `${this.theme}-theme`; + } + + constructor(private elementRef: ElementRef) { + effect(() => { + // This effect runs when the conversation history changes. + this.conversationHistory(); + + // We use a setTimeout to schedule the scroll operation after Angular + // has finished updating the DOM with the new message. + setTimeout(() => this.scrollToBottom(), 0); + }); + } + + private scrollToBottom(): void { + try { + const messagesContainer = this.elementRef.nativeElement.querySelector('.messages'); + if (messagesContainer) { + messagesContainer.scrollTop = messagesContainer.scrollHeight; + } + } catch (err) { + console.error('Error scrolling to bottom:', err); + } + } + + sendMessage() { + if (this.newMessage.trim()) { + this.chatService.addUserPrompt(this.newMessage); + this.newMessage = ''; + // Reset height after sending + const textarea = this.elementRef.nativeElement.querySelector('textarea'); + if (textarea) { + textarea.style.height = 'auto'; + } + } + } + + onInput(event: Event): void { + const textarea = event.target as HTMLTextAreaElement; + textarea.style.height = 'auto'; // Reset height to calculate new scrollHeight + + const computedStyle = getComputedStyle(textarea); + const lineHeight = parseFloat(computedStyle.lineHeight); + const maxHeight = lineHeight * 5; + + const newHeight = Math.min(textarea.scrollHeight, maxHeight); + textarea.style.height = `${newHeight}px`; + + // Ensure it scrolls to the bottom if maxHeight is reached + if (textarea.scrollHeight > maxHeight) { + textarea.scrollTop = textarea.scrollHeight; + } + } +} diff --git a/dynamic-sdui-app/src/app/chat/chat.service.ts b/dynamic-sdui-app/src/app/chat/chat.service.ts new file mode 100644 index 0000000..eec293f --- /dev/null +++ b/dynamic-sdui-app/src/app/chat/chat.service.ts @@ -0,0 +1,68 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Injectable, inject, computed, linkedSignal } from '@angular/core'; +import { Router } from '@angular/router'; + +import { MagicAiService } from '../magic-ai/magic-ai.service'; + +@Injectable({ + providedIn: 'root' +}) +export class ChatService { + private router = inject(Router); + private magicAiService = inject(MagicAiService); + conversationHistory = linkedSignal({ + source: () => this.magicAiService.agentResponse(), + computation: (agentResponse, prev) => { + if (!agentResponse) { + return prev?.value || []; + } + + const message: Message = { author: 'agent', text: agentResponse }; + if (prev && prev?.value.at(-1)?.author === 'agent') { + const newHistory: Message[] = prev.value.slice(0, -1); + return [...newHistory, message]; + } else if (!prev || prev?.value.length === 0) { + return [message]; + } else { + return [...prev.value, message]; + } + } + }); + + nextIndex = computed(() => this.conversationHistory() + .filter(message => message.author === 'agent').length); + + addUserPrompt(newPrompt: string): void { + if (!this.magicAiService.isStreamComplete()) { + return; + } + + this.magicAiService.prompt.set(newPrompt); + this.router.navigate([`/magic/${this.nextIndex()}`]); + this.addToConversation({ author: 'user', text: newPrompt }); + } + + addToConversation(message: Message): void { + this.conversationHistory.update(history => { + if (!history.length) { + return [message]; + } else if (history[history.length - 1].text === message.text) { + return history; + } else { + return [...history, message] + } + }); + } +} + +export interface Message { + author: 'user' | 'agent'; + text: string; +} diff --git a/dynamic-sdui-app/src/app/magic-ai/app-context.ts b/dynamic-sdui-app/src/app/magic-ai/app-context.ts new file mode 100644 index 0000000..cf14140 --- /dev/null +++ b/dynamic-sdui-app/src/app/magic-ai/app-context.ts @@ -0,0 +1,54 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { Type } from '@angular/core'; +import { GENERATED_APP_CONTEXT as ADEV_APP_CONTEXT } from '../apps/adev-docs/app-context'; +import { GENERATED_APP_CONTEXT as VACATION_APP_CONTEXT } from '../apps/vacation-rentals/app-context'; +import { GENERATED_APP_CONTEXT as MAGIC_BOOKSTORE_APP_CONTEXT } from '../apps/magic-bookstore/app-context'; + +export interface ComponentContext { + name: string; + description: string; + type: 'dynamicComponent'; + inputs: { [key: string]: Input; } +} + +export interface Input { + type: string; + description: string; + required?: boolean; +} + +export interface AppContext { + appName: string; + theme: string; + welcomeText: string; + placeholders: string[]; + appDescription: string; + componentMap: { [key: string]: Type }; + componentContextData: ComponentContext[]; +} + +const ADEV_DOCS: AppName = 'adev-docs'; +const VACATION_RENTALS: AppName = 'vacation-rentals'; +const MAGIC_BOOKSTORE: AppName = 'magic-bookstore'; + +type AppName = + 'adev-docs' | + 'vacation-rentals' | + 'magic-bookstore'; +const APP_CONTEXT_MAP: { [key: string]: AppContext } = { + [ADEV_DOCS]: ADEV_APP_CONTEXT, + [VACATION_RENTALS]: VACATION_APP_CONTEXT, + [MAGIC_BOOKSTORE]: MAGIC_BOOKSTORE_APP_CONTEXT, +}; + + +export const APP_NAME: AppName = ADEV_DOCS; + +export const APP_CONTEXT = APP_CONTEXT_MAP[APP_NAME]; \ No newline at end of file diff --git a/dynamic-sdui-app/src/app/magic-ai/magic-ai-container.component.ts b/dynamic-sdui-app/src/app/magic-ai/magic-ai-container.component.ts new file mode 100644 index 0000000..dcfba60 --- /dev/null +++ b/dynamic-sdui-app/src/app/magic-ai/magic-ai-container.component.ts @@ -0,0 +1,136 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { + ChangeDetectionStrategy, + Component, + effect, + inject, + computed, + input, + HostBinding, +} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import { Router } from '@angular/router'; +import { MagicAiRenderer } from './magic-ai-renderer.component'; +import { MagicAiService } from './magic-ai.service'; +import { APP_CONTEXT } from './app-context'; + +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { MatIconModule } from '@angular/material/icon'; + +@Component({ + selector: 'magic-ai-component', + imports: [CommonModule, MagicAiRenderer, MatProgressSpinnerModule, MatIconModule], + standalone: true, + styles: [` + :host { + display: block; + } + .loading-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: var(--spacing-4); + color: var(--text-secondary); + padding: var(--spacing-6); + font-family: var(--font-family); + background-color: var(--surface); + border: var(--border-default); + border-radius: var(--border-radius-lg); + box-shadow: var(--shadow-subtle); + } + .loading-icon { + font-size: 48px; + width: 48px; + height: 48px; + color: var(--primary); + } + .spinner-text-container { + display: flex; + align-items: center; + gap: var(--spacing-3); + } + button { + margin-bottom: var(--spacing-2); + padding: var(--spacing-2) var(--spacing-3); + border: none; + background-color: var(--primary); + color: white; + border-radius: var(--border-radius-md); + cursor: pointer; + font-family: var(--font-family); + transition: var(--transition-default); + } + button:hover { + background-color: var(--primary-dark); + } + :host ::ng-deep .mat-primary .mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle, + :host ::ng-deep .mat-primary .mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic { + stroke: var(--primary) !important; + } + `], + template: ` + @if (isUiLoading()) { +
      + auto_awesome +
      + + +

      {{loadingText()}}

      +
      +
      + } @else if (!!componentResource.error()) { + +

      Something went wrong.

      + } @else if (componentResource.hasValue()) { + + } + `, + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MagicAiComponent { + private router = inject(Router); + private readonly magicAiService = inject(MagicAiService); + componentResource = this.magicAiService.componentResource; + loadingText = this.magicAiService.loadingText; + isUiLoading = computed(() => !this.magicAiService.componentResource.value()?.componentSchema); + theme = APP_CONTEXT.theme; + index = input.required(); + schemaIndex = computed(() => parseInt(this.index())); + + activeSchema = computed(() => { + if (this.schemaIndex() >= 0 && this.schemaIndex() < this.magicAiService.componentSchemaList().length) { + return this.magicAiService.componentSchemaList()[this.schemaIndex()]; + } else { + return this.componentResource.value()?.componentSchema; + } + }); + + constructor() { + effect(() => { + try { + const schemaLen = this.magicAiService.componentSchemaList().length - 1; + const index = parseInt(this.index()); + if (index > schemaLen + 1 || index < 0) { + const adjustedIndex = Math.max(schemaLen - 1, 0); + this.router.navigate([`/magic/${adjustedIndex}`]); + } + } catch (e) { + console.log('MagicAi Component: componentResource error'); + } + }); + } + + @HostBinding('class') get themeClass() { + return `${this.theme}-theme`; + } +} + diff --git a/dynamic-sdui-app/src/app/magic-ai/magic-ai-renderer.component.ts b/dynamic-sdui-app/src/app/magic-ai/magic-ai-renderer.component.ts new file mode 100644 index 0000000..2a0e4b1 --- /dev/null +++ b/dynamic-sdui-app/src/app/magic-ai/magic-ai-renderer.component.ts @@ -0,0 +1,124 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { + ChangeDetectionStrategy, + Component, + effect, + inject, + ElementRef, + ViewRef, + createComponent, + EnvironmentInjector, + ApplicationRef, + input, + untracked, + inputBinding, + Type, +} from '@angular/core'; + +import { DynamicSchema } from './magic-ai.service'; +import { APP_CONTEXT } from './app-context'; + +/** + * Renders a `DynamicSchema` of hierarchical components, elements, & text. + */ +@Component({ + selector: 'magic-ai-renderer', + changeDetection: ChangeDetectionStrategy.OnPush, + template: '', +}) +export class MagicAiRenderer { + readonly schema = input.required(); + private componentMap = APP_CONTEXT.componentMap; + + private readonly injector = inject(EnvironmentInjector); + private readonly appRef = inject(ApplicationRef); + private readonly host = inject(ElementRef).nativeElement as HTMLElement; + + constructor() { + // Effect that watches schema() and renders it. + effect((onCleanup) => { + const schema = this.schema(); + + const views: ViewRef[] = []; + // Actually render the schema to an element. We do this in untracked() to avoid accidental + // reactive dependencies (even though there shouldn't be any). + const node = untracked(() => this.render(schema, views)); + this.host.appendChild(node); + + onCleanup(() => { + // When schema changes, remove the old node and destroy all associated views. + node.remove(); + for (const view of views) { + view.destroy(); + } + }); + }); + } + + private render(schema: DynamicSchema, views: ViewRef[]): ChildNode { + if (!schema) { + return document.createElement('br'); + } + + switch (schema.type) { + case 'componentSchema': { + // Dynamically instantiate the component. + const component = this.getComponentType(schema.name); + if (component) { + const cmp = createComponent(component, { + environmentInjector: this.injector, + // Bind any inputs requested. + bindings: Object.keys(schema.inputs ?? {}).map((key) => + inputBinding(key, () => schema.inputs![key]) + ), + }); + + // Attach to change detection and save the view for later cleanup. + this.appRef.attachView(cmp.hostView); + views.push(cmp.hostView); + + // Hack to remove ng-version attribute which gets added to AppRef level views automatically. + cmp.location.nativeElement.removeAttribute('ng-version'); + return cmp.location.nativeElement; + } + return document.createElement('br'); + } + case 'elementSchema': { + if (!schema.element || schema.element === '') { + return document.createElement('br'); + } + + // Render an element dynamically. + const element = document.createElement(schema.element); + + // Set any attributes requested. + for (const key of Object.keys(schema.attributes ?? {})) { + element.setAttribute(key, schema.attributes![key]); + } + + if (schema.children) { + // Render & append children. + element.append( + ...schema.children.map((child) => this.render(child, views)) + ); + } + return element; + } + case 'textSchema': { + return document.createTextNode(schema.text); + } + default: + return document.createElement('br'); + } + } + + private getComponentType(name: string): Type | null { + return this.componentMap[name as keyof typeof this.componentMap] || null; + } +} diff --git a/dynamic-sdui-app/src/app/magic-ai/magic-ai.service.ts b/dynamic-sdui-app/src/app/magic-ai/magic-ai.service.ts new file mode 100644 index 0000000..d370d26 --- /dev/null +++ b/dynamic-sdui-app/src/app/magic-ai/magic-ai.service.ts @@ -0,0 +1,164 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ + +import { + effect, + computed, + signal, + resource, + linkedSignal, + ResourceStreamItem, + Injectable +} from '@angular/core'; +import {streamFlow} from 'genkit/beta/client'; +import { APP_CONTEXT } from './app-context'; + +const URL = 'generateUI'; + +@Injectable({ + providedIn: 'root' +}) +export class MagicAiService { + private appContext = APP_CONTEXT; + private sessionId = signal(crypto.randomUUID()); + + prompt = signal('Return a visually rich home page for the application with directions to get started and some possible items/collections/etc. to explore.'); + agentResponse = computed(() => this.componentResource.value()?.agentResponse); + loadingText = signal(this.appContext.placeholders[this.randomLoadingIndex()]); + + componentSchemaList = linkedSignal({ + source: () => this.componentResource.value(), + computation: (newSchema, prev) => { + const schema = newSchema?.componentSchema; + if (!schema) { + return prev?.value || []; + } else if (!prev || prev.value.length === 0) { + return [schema]; + } else if (this.isStreamComplete()) { + return [...prev.value, schema]; + } else { + return [...prev.value.slice(0, -1), schema]; + } + } + }); + + isStreamComplete = linkedSignal({ + source: () => this.componentResource.value(), + computation: (newSchema) => { + return !!newSchema?.endOfStream; + } + }); + + componentResource = resource({ + params: () => this.prompt(), + stream: async ({params}) => { + const data = signal>({value: {}}); + const response = streamFlow({ + url: URL, + input: { + appDescription: this.appContext.appDescription, + message: params, + sessionId: this.sessionId(), + componentRegistry: this.appContext.componentContextData.map((c) => ({ + name: c.name, + description: c.description, + inputs: Object.keys(c.inputs).map((key) => ({ + name: key, + ...c.inputs[key], + })), + })), + }, + }); + + (async () => { + try { + console.log('Stream flow response initiated. Waiting for chunks...'); + for await (const chunk of response.stream) { + if (chunk) { + data.update(prev => { + if (prev && 'value' in prev) { + const value = {...prev.value, ...chunk}; + return {value}; + } else { + return { error: chunk as unknown as Error }; + } + }); + } + } + console.log('Stream loop finished. Now awaiting final output...'); + } catch(e) { + data.set({ error: e as unknown as Error }); + } + })(); + return data; + }, + }); + + randomLoadingIndex(): number { + return Math.floor(Math.random() * this.appContext.placeholders.length); + } + + constructor() { + effect((onCleanup) => { + let interval: any; + const validTypes = ['elementSchema', 'componentSchema', 'textSchema']; + + try { + const isGenerating = !validTypes.includes(this.componentResource.value()?.componentSchema?.type ?? ''); + if (!interval && (this.componentResource.isLoading() || isGenerating)) { + interval = setInterval(() => { + this.loadingText.set(this.appContext.placeholders[this.randomLoadingIndex()]); + }, 3000); + } + + onCleanup(() => { + clearInterval(interval); + }); + } catch (e) { + console.log('MagicAiService: componentResource error'); + } + }); + } +} + +export type DynamicSchema = DynamicElementSchema | DynamicComponentSchema | TextSchema | undefined; + +export interface ViewSchema { + prompt: string; + componentSchema: DynamicSchema; +} + +export interface FlowResponse { + agentResponse?: string; + componentSchema?: DynamicElementSchema; + endOfStream?: boolean; +} + +export interface TextSchema { + type: 'textSchema'; + text: string; +} + +export interface DynamicComponentSchema { + type: 'componentSchema'; + name: string; + inputs: {[key: string]: any}; +} + +export interface DynamicElementSchema { + type: 'elementSchema'; + element: string; + attributes?: {[key: string]: string}; + children?: DynamicSchema[]; +} + +interface DynamicElementListSchema { + index: number; + schema: DynamicElementSchema; + endOfStream?: boolean; +} diff --git a/dynamic-sdui-app/src/app/pipes/format-inline-code.pipe.ts b/dynamic-sdui-app/src/app/pipes/format-inline-code.pipe.ts new file mode 100644 index 0000000..0b9cf00 --- /dev/null +++ b/dynamic-sdui-app/src/app/pipes/format-inline-code.pipe.ts @@ -0,0 +1,22 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'formatInlineCode', + standalone: true, +}) +export class FormatInlineCodePipe implements PipeTransform { + transform(value: string | undefined | null): string { + if (!value) { + return ''; + } + // This regex finds all instances of text wrapped in backticks and replaces them with ... + return value.replace(/`([^`]+)`/g, '$1'); + } +} diff --git a/dynamic-sdui-app/src/app/showcase/showcase-directory.component.ts b/dynamic-sdui-app/src/app/showcase/showcase-directory.component.ts new file mode 100644 index 0000000..c08168e --- /dev/null +++ b/dynamic-sdui-app/src/app/showcase/showcase-directory.component.ts @@ -0,0 +1,55 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'app-showcase-directory', + standalone: true, + imports: [CommonModule, RouterLink], + template: ` + + `, + styles: [` + .showcase-directory-container { + padding: 2rem; + background-color: var(--background); + color: var(--text-primary); + font-family: var(--font-family); + } + h1 { + font-size: var(--text-xxl); + font-weight: var(--font-weight-semibold); + margin-bottom: var(--spacing-4); + color: var(--primary); + } + ul { + padding-left: 40px; + } + li { + margin-bottom: var(--spacing-2); + } + a { + color: var(--primary); + text-decoration: none; + font-size: var(--text-lg); + } + a:hover { + text-decoration: underline; + } + `] +}) +export class ShowcaseDirectoryComponent {} diff --git a/dynamic-sdui-app/src/genkit-utils/data-store.ts b/dynamic-sdui-app/src/genkit-utils/data-store.ts new file mode 100644 index 0000000..822ddf3 --- /dev/null +++ b/dynamic-sdui-app/src/genkit-utils/data-store.ts @@ -0,0 +1,19 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { APP_NAME } from '../app/magic-ai/app-context'; +import { DATA as ADEV_DATA } from '../app/apps/adev-docs/data-store'; +import { DATA as VACATION_DATA } from '../app/apps/vacation-rentals/data-store'; +import { DATA as MAGIC_BOOKSTORE_DATA } from '../app/apps/magic-bookstore/data-store'; + +const DATA_MAP = { + 'adev-docs': ADEV_DATA, + 'vacation-rentals': JSON.stringify(VACATION_DATA, null, 2), + 'magic-bookstore': JSON.stringify(MAGIC_BOOKSTORE_DATA, null, 2), +}; + +export const DATA = DATA_MAP[APP_NAME]; diff --git a/dynamic-sdui-app/src/genkit-utils/flows.ts b/dynamic-sdui-app/src/genkit-utils/flows.ts new file mode 100644 index 0000000..7501d90 --- /dev/null +++ b/dynamic-sdui-app/src/genkit-utils/flows.ts @@ -0,0 +1,137 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { genkit, MessageData } from 'genkit/beta'; +import { z } from "zod"; +import { googleAI } from "@genkit-ai/googleai"; +import { vertexAI } from '@genkit-ai/vertexai'; +import { systemInstructions } from './prompts'; +import { DATA } from './data-store'; + +const ai = genkit({ + plugins: [googleAI(), vertexAI({ location: 'us-central1' })], + model: googleAI.model('gemini-2.5-flash'), +}); + +// A simple in-memory store for conversation history. +const historyStore: Record = {}; + +async function loadHistory(sessionId: string): Promise { + return historyStore[sessionId] || []; +} + +async function saveHistory(sessionId: string, history: MessageData[]) { + historyStore[sessionId] = history; +} + +// Define the Zod schemas for the expected output +const DynamicComponentSchema = z.object({ + type: z.string(), // 'componentSchema' + name: z.string(), + inputs: z.record(z.string(), z.any()).optional(), +}); + +const BaseDynamicElementSchema = z.object({ + type: z.string(), // 'elementSchema' + element: z.string(), + attributes: z.record(z.string(), z.any()).optional(), +}); + +const TextSchema = z.object({ + type: z.string(), // 'textSchema' + text: z.string(), +}); + +type DynamicElement = z.infer & { + children: (DynamicElement | z.infer | z.infer)[]; +}; + +const DynamicElementSchema: z.ZodType = BaseDynamicElementSchema.extend({ + children: z.lazy(() => + z.union([DynamicElementSchema, DynamicComponentSchema, TextSchema]).array() + ), +}); + +const FlowResponseSchema = z.object({ + agentResponse: z.string(), + componentSchema: DynamicElementSchema, + endOfStream: z.boolean().optional(), +}); + +export const UiSchema = ai.defineSchema('UiSchema', FlowResponseSchema); + +/* + * Tools may provide a better mechanism for fetching real data. + */ +// const getDataFromDataStore = ai.defineTool( +// { +// name: 'getDataFromDataStore', +// description: 'Fetches all of the data from the datastore', +// outputSchema: z.array(z.custom()), +// }, +// async () => { +// return LISTINGS; +// } +// ); + +export const generateUIFlow = ai.defineFlow( + { + name: 'generateUI', + inputSchema: z.object({ + appDescription: z.string(), + message: z.string(), + sessionId: z.string(), + componentRegistry: z.array(z.any()), + }), + outputSchema: UiSchema, + }, + async ({ appDescription, message, sessionId, componentRegistry }, { sendChunk }) => { + try { + const history = await loadHistory(sessionId); + history.push({ role: 'user', content: [{ text: message }] }); + + const { stream, response } = ai.generateStream({ + system: ` +${systemInstructions} +* appDescription: ${appDescription} +* componentRegistry: ${JSON.stringify(componentRegistry, null, 2)} +* datastore: ${DATA} +`, + prompt: `userPrompt: ${message}`, + messages: history, + // tools: [getDataFromDataStore], // Tools may provide a better mechanism for fetching real data rather than hard-coding the data. + }); + + (async () => { + let latestChunk; + for await (const chunk of stream) { + console.log(JSON.stringify(chunk.output)); + if (chunk.output) { + latestChunk = chunk.output; + sendChunk(chunk.output); + } + } + // endOfStream property required for signals in client. + sendChunk({ ...latestChunk, endOfStream: true }); + })(); + + const finalResponse = await response; + + let historyToSave = finalResponse.messages; + // Must remove system prompt before saving. + if (historyToSave[0]?.role === 'system') { + historyToSave = historyToSave.slice(1); + } + await saveHistory(sessionId, historyToSave); + + return finalResponse.output; + } catch (e) { + console.error('Manual prompt test failed:', e); + throw 'An error has occured.'; + } + } +); diff --git a/dynamic-sdui-app/src/genkit-utils/prompts.ts b/dynamic-sdui-app/src/genkit-utils/prompts.ts new file mode 100644 index 0000000..895b28b --- /dev/null +++ b/dynamic-sdui-app/src/genkit-utils/prompts.ts @@ -0,0 +1,172 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +export const systemInstructions = ` +## **🤖 LLM Instructions for Dynamic UI Generation (Optimized)** + +### **1\. Your Role and Objective** + +You are an expert AI UI/UX designer and layout generator. Your sole objective is to dynamically generate the \ content for a web application view based on a set of **pre-processed inputs**. + +Your primary goal is to **maximize component usage** and **eliminate ALL unnecessary whitespace**. You must construct a responsive, **dense**, and aesthetically-pleasing layout. Your final output **must** be a single JSON object conforming to the FlowResponse schema. + +--- + +### **2\. Inputs Provided** + +You will be given the following inputs. The data-heavy work (querying, ranking, and relevance analysis) **has already been done.** + +1. **appDescription**: A string describing the application domain (e.g., "e-commerce," "project management") and its specific LayoutCompositions. +2. **userPrompt**: The original string from the end-user (e.g., "I'm looking for a 4K TV with great sound for movies"). +3. **componentRegistry**: A list of available pre-built components you can use, including metadata. +4. **rankedItemsWithRelevance**: An array of items, each containing: + * **itemData**: The main data for the item (e.g., product details). + * **relevancePayload**: A pre-computed, ranked list of the 1-3 data points that make this item uniquely relevant (e.g., specific reviews, key features, contextual details). +5. **layoutHint**: A string name for the layout composition to use (e.g., "VacationListLayout", "ProductDetailLayout"), which is defined in the appDescription. + +--- + +### **3\. Step-by-Step Generation Process** + +#### **Step 1: Analyze Context** + +1. **Analyze appDescription & userPrompt**: Understand the application's business logic, the user's core intent, and the available LayoutCompositions. +2. **Scan componentRegistry**: Familiarize yourself with your available UI components. **Pay close attention to component description fields, as they contain rules you must follow.** +3. **Analyze rankedItemsWithRelevance**: This input provides both *what* to show (itemData) and *why* it's relevant (relevancePayload). + +#### **Step 2: Create the Component Mapping Plan** + +**This is the most critical step.** Before constructing any layout, you **must** create a detailed internal "plan" for each item in the rankedItemsWithRelevance list. + +**CRITICAL MANDATE:** This plan **must** map *all* data—both from itemData and the relevancePayload—to specific componentRegistry component names. Do *not* plan to use raw text for data if a component exists for it (e.g., map data about a person to the appropriate component from the registry for displaying user profiles, not to a \ tag). + +This plan ensures each item's layout is **structurally unique** (based on its unique relevancePayload) and **prioritizes components over raw HTML**. + +#### **Step 3: Construct the View Layout and Apply Styling** + +Now, **execute the verified plan** from Step 2\. + +1. **Find the Blueprint:** You **must** find the layout rules in the appDescription's LayoutCompositions section that correspond to the layoutHint input. +2. **Execute the Blueprint:** You **must** follow those rules precisely, using the Layout Primitives (defined in Section 4\) as your building blocks and your Component Mapping Plan (from Step 2\) to populate the content. + +--- + +### **4\. Layout Primitives (Building Blocks)** + +These are the only layout building blocks you may use. The appDescription will provide LayoutCompositions that combine these primitives. + +1. **Top-Level Container (CRITICAL):** The *root* componentSchema (the outermost element) **must** be a div. This div **must** act as the main page container by using the classes: flex flex-col gap-6. +2. **Stack (Vertical):** A vertical stack of components. + * element: "div" + * attributes: {"class": "flex flex-col gap-4"} +3. **Row (Horizontal):** A horizontal row of components. + * element: "div" + * attributes: {"class": "flex flex-row gap-4"} +4. **Wrapper (Padding):** A wrapper for adding internal padding. + * element: "div" + * attributes: {"class": "p-4"} (or p-6, etc.) +5. **Grid:** A standard responsive grid. + * element: "div" + * attributes: {"class": "grid grid-cols-1 md:grid-cols-3 gap-4"} + +--- + +### **5\. Layout Scaffolding Guidelines** + +**CRITICAL PRIME DIRECTIVE:** These guidelines apply **ONLY** to the div scaffolding you use for layout (e.g., flex, grid, gap). You **MUST NOT** use these rules to manually style text, cards, images, or any other content. **Always use a component from the componentRegistry for all data and content.** + +**Overall Design Philosophy:** Cleanliness, Intuition, and **Density**. + +1. **Layout & Structure:** + * **Grid/Flex:** Use standard grid or flex for alignment. + * **Spacing:** Use gap-4 or gap-6 *between* components. Use p-4 or p-6 for *internal* container padding. + * **Density:** **Avoid empty whitespace *within* content columns.** Fill all available space with relevant components. + +--- + +### **6\. Output Generation** + +**OuputSchema Definition:** + +CRITICAL: You MUST return a valid JSON object that conforms to the schema below. Do NOT return an array, null, or any other format. + +**Schema:** + +JSON + +\`\`\` + +{ + "agentResponse": "A conversational, helpful response to the user's prompt.", + "componentSchema": { + "type": "elementSchema|componentSchema|textSchema", + "element": "div|span|h1...", + "attributes": { "class": "a tailwind class name" }, + "children": [ + // ... array of oneof (A), (B), or (C) objects + ] + } +} + +\`\`\` + +CRITICAL: The element property for elementSchema (A) MUST be one of the following strings: + +* div +* span +* h1, h2, h3, h4, h5, h6 +* p +* ul, ol, li + +You are **NOT** allowed to use interactive elements like \ or \. All interactivity MUST come from a component in the componentRegistry. + +**(A) // Element: For HTML structure and layout** + +JSON + +\`\`\` + +{ + "type": "elementSchema", + "element": "div", // e.g., "div", "h3", "p", "span" + "attributes": { "class": "flex flex-col gap-4" }, + "children": [ + // ... array of (A), (B), or (C) objects + ] +} + +\`\`\` + +**(B) // Component: For registered components** + +JSON + +\`\`\` + +{ + "type":"componentSchema", + "name": "ProductCardComponent", // A component name from the registry + "inputs": { + "the_input_name": "the_input_value" + } +} + +\`\`\` + +**(C) // Text: For raw text content** + +JSON + +\`\`\` + +{ + "type": "textSchema", + "text": "The text goes here" +} + +\`\`\` +`; diff --git a/dynamic-sdui-app/src/index.html b/dynamic-sdui-app/src/index.html new file mode 100644 index 0000000..1ce433b --- /dev/null +++ b/dynamic-sdui-app/src/index.html @@ -0,0 +1,23 @@ + + + + + + ContextTestApp + + + + + + + + + diff --git a/dynamic-sdui-app/src/main.server.ts b/dynamic-sdui-app/src/main.server.ts new file mode 100644 index 0000000..09e35f3 --- /dev/null +++ b/dynamic-sdui-app/src/main.server.ts @@ -0,0 +1,15 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser'; +import { App } from './app/base-components/app.component'; +import { config } from './app/app.config.server'; + +const bootstrap = (context: BootstrapContext) => + bootstrapApplication(App, config, context); + +export default bootstrap; diff --git a/dynamic-sdui-app/src/main.ts b/dynamic-sdui-app/src/main.ts new file mode 100644 index 0000000..1b96eb3 --- /dev/null +++ b/dynamic-sdui-app/src/main.ts @@ -0,0 +1,13 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/base-components/app.component'; + +bootstrapApplication(App, appConfig) + .catch((err) => console.error(err)); diff --git a/dynamic-sdui-app/src/server.ts b/dynamic-sdui-app/src/server.ts new file mode 100644 index 0000000..cd78b89 --- /dev/null +++ b/dynamic-sdui-app/src/server.ts @@ -0,0 +1,70 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +import { + AngularNodeAppEngine, + createNodeRequestHandler, + isMainModule, + writeResponseToNodeResponse, +} from '@angular/ssr/node'; +import express from 'express'; +import { expressHandler } from '@genkit-ai/express'; +import { generateUIFlow } from './genkit-utils/flows'; +import { join } from 'node:path'; + +const browserDistFolder = join(import.meta.dirname, '../browser'); + +const app = express(); +const angularApp = new AngularNodeAppEngine(); + +/** + * Genkit flows + */ +app.post('/generateUI', express.json(), expressHandler(generateUIFlow)); + +/** + * Serve static files from /browser + */ +app.use( + express.static(browserDistFolder, { + maxAge: '1y', + index: false, + redirect: false, + }), +); + +/** + * Handle all other requests by rendering the Angular application. + */ +app.use((req, res, next) => { + angularApp + .handle(req) + .then((response) => + response ? writeResponseToNodeResponse(response, res) : next(), + ) + .catch(next); +}); + +/** + * Start the server if this module is the main entry point. + * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000. + */ +if (isMainModule(import.meta.url)) { + const port = process.env['PORT'] || 4000; + app.listen(port, (error) => { + if (error) { + throw error; + } + + console.log(`Node Express server listening on http://localhost:${port}`); + }); +} + +/** + * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions. + */ +export const reqHandler = createNodeRequestHandler(app); diff --git a/dynamic-sdui-app/src/styles.css b/dynamic-sdui-app/src/styles.css new file mode 100644 index 0000000..a5252a9 --- /dev/null +++ b/dynamic-sdui-app/src/styles.css @@ -0,0 +1,348 @@ +/*! + * @license + * Copyright Google LLC All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.dev/license + */ +@import "tailwindcss"; +@import "highlight.js/styles/atom-one-dark.css"; + +/* You can add global styles to this file, and also import other style files */ +:root { + /* Haven Theme Variables */ + --haven-primary: #007A7A; + --haven-primary-light: #E6F2F2; + --haven-primary-dark: #005C5C; + --haven-text-primary: #222222; + --haven-text-secondary: #555555; + --haven-text-muted: #888888; + --haven-background: #F9F9F9; + --haven-surface: #FFFFFF; + --haven-border: #EAEAEA; + --haven-accent-gold: #FFB400; + --haven-success: #28a745; + --haven-warning: #ffc107; + --haven-error: #dc3545; + --haven-font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + --haven-text-xs: 0.75rem; + --haven-text-sm: 0.875rem; + --haven-text-base: 1rem; + --haven-text-lg: 1.125rem; + --haven-text-xl: 1.5rem; + --haven-text-xxl: 2rem; + --haven-font-weight-regular: 400; + --haven-font-weight-medium: 500; + --haven-font-weight-semibold: 600; + --haven-line-height-body: 1.6; + --haven-line-height-heading: 1.2; + --haven-spacing-1: 0.25rem; + --haven-spacing-2: 0.5rem; + --haven-spacing-3: 1rem; + --haven-spacing-4: 1.5rem; + --haven-spacing-5: 2rem; + --haven-spacing-6: 3rem; + --haven-border-radius-md: 8px; + --haven-border-radius-lg: 12px; + --haven-border-width: 1px; + --haven-border-default: var(--haven-border-width) solid var(--haven-border); + --haven-shadow-subtle: 0px 4px 12px rgba(0, 0, 0, 0.05); + --haven-shadow-medium: 0px 6px 16px rgba(0, 0, 0, 0.08); + --haven-shadow-focus: 0 0 0 3px rgba(0, 122, 122, 0.25); + --haven-transition-default: all 0.2s ease-in-out; + + /* adev-docs Theme Variables */ + --adev-docs-primary: #5C44E4; + --adev-docs-primary-light: #E4E0FA; + --adev-docs-primary-dark: #8514F5; + --adev-docs-secondary: #6c757d; + --adev-docs-background: #ffffff; + --adev-docs-surface: #f8f9fa; + --adev-docs-text-primary: #212529; + --adev-docs-text-secondary: #555555; + --adev-docs-text-muted: #888888; + --adev-docs-border: #dee2e6; + --adev-docs-code-background: #e9ecef; + --adev-docs-code-text: #0d0d0d; + --adev-docs-border-radius-md: 4px; + --adev-docs-border-radius-lg: 8px; + --adev-docs-shadow-subtle: 0 2px 4px rgba(0, 0, 0, 0.05); + --adev-docs-shadow-medium: 0 4px 8px rgba(0, 0, 0, 0.1); + --adev-docs-shadow-focus: 0 0 0 3px rgba(92, 68, 228, 0.25); + --adev-docs-success: #28a745; + --adev-docs-info: #F637E3; + --adev-docs-warning: #ffc107; + --adev-docs-danger: #F11653; + --adev-docs-font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + --adev-docs-text-xs: 0.75rem; + --adev-docs-text-sm: 0.875rem; + --adev-docs-text-base: 1rem; + --adev-docs-text-lg: 1.125rem; + --adev-docs-text-xl: 1.5rem; + --adev-docs-text-xxl: 2rem; + --adev-docs-font-weight-regular: 400; + --adev-docs-font-weight-medium: 500; + --adev-docs-font-weight-semibold: 600; + --adev-docs-line-height-body: 1.6; + --adev-docs-line-height-heading: 1.2; + --adev-docs-spacing-1: 0.25rem; + --adev-docs-spacing-2: 0.5rem; + --adev-docs-spacing-3: 1rem; + --adev-docs-spacing-4: 1.5rem; + --adev-docs-spacing-5: 2rem; + --adev-docs-spacing-6: 3rem; + --adev-docs-border-width: 1px; + --adev-docs-border-default: var(--adev-docs-border-width) solid var(--adev-docs-border); + --adev-docs-transition-default: all 0.2s ease-in-out; +} + +/* magic-bookstore Theme Variables */ +:root { + --magic-bookstore-primary: #4A90E2; /* A calming blue */ + --magic-bookstore-primary-light: #EAF3FD; + --magic-bookstore-primary-dark: #2F6BBF; + --magic-bookstore-text-primary: #333333; + --magic-bookstore-text-secondary: #555555; + --magic-bookstore-text-muted: #888888; + --magic-bookstore-background: #F8F8FA; + --magic-bookstore-surface: #FFFFFF; + --magic-bookstore-border: #E0E0E0; + --magic-bookstore-accent-gold: #FFD700; /* For awards/highlights */ + --magic-bookstore-success: #4CAF50; + --magic-bookstore-warning: #FFC107; + --magic-bookstore-error: #F44336; + --magic-bookstore-font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + --magic-bookstore-text-xs: 0.75rem; + --magic-bookstore-text-sm: 0.875rem; + --magic-bookstore-text-base: 1rem; + --magic-bookstore-text-lg: 1.125rem; + --magic-bookstore-text-xl: 1.5rem; + --magic-bookstore-text-xxl: 2rem; + --magic-bookstore-font-weight-regular: 400; + --magic-bookstore-font-weight-medium: 500; + --magic-bookstore-font-weight-semibold: 600; + --magic-bookstore-line-height-body: 1.6; + --magic-bookstore-line-height-heading: 1.2; + --magic-bookstore-spacing-1: 0.25rem; + --magic-bookstore-spacing-2: 0.5rem; + --magic-bookstore-spacing-3: 1rem; + --magic-bookstore-spacing-4: 1.5rem; + --magic-bookstore-spacing-5: 2rem; + --magic-bookstore-spacing-6: 3rem; + --magic-bookstore-border-radius-md: 8px; + --magic-bookstore-border-radius-lg: 12px; + --magic-bookstore-border-width: 1px; + --magic-bookstore-border-default: var(--magic-bookstore-border-width) solid var(--magic-bookstore-border); + --magic-bookstore-shadow-subtle: 0px 4px 12px rgba(0, 0, 0, 0.05); + --magic-bookstore-shadow-medium: 0px 6px 16px rgba(0, 0, 0, 0.08); + --magic-bookstore-shadow-focus: 0 0 0 3px rgba(74, 144, 226, 0.25); + --magic-bookstore-transition-default: all 0.2s ease-in-out; +} + +.magic-bookstore-theme { + --primary: var(--magic-bookstore-primary); + --primary-light: var(--magic-bookstore-primary-light); + --primary-dark: var(--magic-bookstore-primary-dark); + --text-primary: var(--magic-bookstore-text-primary); + --text-secondary: var(--magic-bookstore-text-secondary); + --text-muted: var(--magic-bookstore-text-muted); + --background: var(--magic-bookstore-background); + --surface: var(--magic-bookstore-surface); + --border: var(--magic-bookstore-border); + --accent-gold: var(--magic-bookstore-accent-gold); + --success: var(--magic-bookstore-success); + --warning: var(--magic-bookstore-warning); + --error: var(--magic-bookstore-error); + --font-family: var(--magic-bookstore-font-family); + --text-xs: var(--magic-bookstore-text-xs); + --text-sm: var(--magic-bookstore-text-sm); + --text-base: var(--magic-bookstore-text-base); + --text-lg: var(--magic-bookstore-text-lg); + --text-xl: var(--magic-bookstore-text-xl); + --text-xxl: var(--magic-bookstore-text-xxl); + --font-weight-regular: var(--magic-bookstore-font-weight-regular); + --font-weight-medium: var(--magic-bookstore-font-weight-medium); + --font-weight-semibold: var(--magic-bookstore-font-weight-semibold); + --line-height-body: var(--magic-bookstore-line-height-body); + --line-height-heading: var(--magic-bookstore-line-height-heading); + --spacing-1: var(--magic-bookstore-spacing-1); + --spacing-2: var(--magic-bookstore-spacing-2); + --spacing-3: var(--magic-bookstore-spacing-3); + --spacing-4: var(--magic-bookstore-spacing-4); + --spacing-5: var(--magic-bookstore-spacing-5); + --spacing-6: var(--magic-bookstore-spacing-6); + --border-radius-md: var(--magic-bookstore-border-radius-md); + --border-radius-lg: var(--magic-bookstore-border-radius-lg); + --border-width: var(--magic-bookstore-border-width); + --border-default: var(--magic-bookstore-border-default); + --shadow-subtle: var(--magic-bookstore-shadow-subtle); + --shadow-medium: var(--magic-bookstore-shadow-medium); + --shadow-focus: var(--magic-bookstore-shadow-focus); + --transition-default: var(--magic-bookstore-transition-default); +} + +.haven-theme { + --primary: var(--haven-primary); + --primary-light: var(--haven-primary-light); + --primary-dark: var(--haven-primary-dark); + --text-primary: var(--haven-text-primary); + --text-secondary: var(--haven-text-secondary); + --text-muted: var(--haven-text-muted); + --background: var(--haven-background); + --surface: var(--haven-surface); + --border: var(--haven-border); + --accent-gold: var(--haven-accent-gold); + --success: var(--haven-success); + --warning: var(--haven-warning); + --error: var(--haven-error); + --font-family: var(--haven-font-family); + --text-xs: var(--haven-text-xs); + --text-sm: var(--haven-text-sm); + --text-base: var(--haven-text-base); + --text-lg: var(--haven-text-lg); + --text-xl: var(--haven-text-xl); + --text-xxl: var(--haven-text-xxl); + --font-weight-regular: var(--haven-font-weight-regular); + --font-weight-medium: var(--haven-font-weight-medium); + --font-weight-semibold: var(--haven-font-weight-semibold); + --line-height-body: var(--haven-line-height-body); + --line-height-heading: var(--haven-line-height-heading); + --spacing-1: var(--haven-spacing-1); + --spacing-2: var(--haven-spacing-2); + --spacing-3: var(--haven-spacing-3); + --spacing-4: var(--haven-spacing-4); + --spacing-5: var(--haven-spacing-5); + --spacing-6: var(--haven-spacing-6); + --border-radius-md: var(--haven-border-radius-md); + --border-radius-lg: var(--haven-border-radius-lg); + --border-width: var(--haven-border-width); + --border-default: var(--haven-border-default); + --shadow-subtle: var(--haven-shadow-subtle); + --shadow-medium: var(--haven-shadow-medium); + --shadow-focus: var(--haven-shadow-focus); + --transition-default: var(--haven-transition-default); +} + +.adev-docs-theme { + --primary: var(--adev-docs-primary); + --primary-light: var(--adev-docs-primary-light); + --primary-dark: var(--adev-docs-primary-dark); + --secondary: var(--adev-docs-secondary); + --background: var(--adev-docs-background); + --surface: var(--adev-docs-surface); + --text-primary: var(--adev-docs-text-primary); + --text-secondary: var(--adev-docs-text-secondary); + --text-muted: var(--adev-docs-text-muted); + --border: var(--adev-docs-border); + --code-background: var(--adev-docs-code-background); + --code-text: var(--adev-docs-code-text); + --border-radius-md: var(--adev-docs-border-radius-md); + --border-radius-lg: var(--adev-docs-border-radius-lg); + --shadow-subtle: var(--adev-docs-shadow-subtle); + --shadow-medium: var(--adev-docs-shadow-medium); + --shadow-focus: var(--adev-docs-shadow-focus); + --success: var(--adev-docs-success); + --info: var(--adev-docs-info); + --warning: var(--adev-docs-warning); + --danger: var(--adev-docs-danger); + --font-family: var(--adev-docs-font-family); + --text-xs: var(--adev-docs-text-xs); + --text-sm: var(--adev-docs-text-sm); + --text-base: var(--adev-docs-text-base); + --text-lg: var(--adev-docs-text-lg); + --text-xl: var(--adev-docs-text-xl); + --text-xxl: var(--adev-docs-text-xxl); + --font-weight-regular: var(--adev-docs-font-weight-regular); + --font-weight-medium: var(--adev-docs-font-weight-medium); + --font-weight-semibold: var(--adev-docs-font-weight-semibold); + --line-height-body: var(--adev-docs-line-height-body); + --line-height-heading: var(--adev-docs-line-height-heading); + --spacing-1: var(--adev-docs-spacing-1); + --spacing-2: var(--adev-docs-spacing-2); + --spacing-3: var(--adev-docs-spacing-3); + --spacing-4: var(--adev-docs-spacing-4); + --spacing-5: var(--adev-docs-spacing-5); + --spacing-6: var(--adev-docs-spacing-6); + --border-width: var(--adev-docs-border-width); + --border-default: var(--adev-docs-border-default); + --transition-default: all 0.2s ease-in-out; +} + +body { + font-family: var(--adev-docs-font-family); + color: var(--adev-docs-text-primary); + background-color: var(--adev-docs-background); + line-height: var(--adev-docs-line-height-body); +} + +h1 { + font-size: var(--adev-docs-text-xxl); + font-weight: var(--adev-docs-font-weight-semibold); + margin-bottom: var(--adev-docs-spacing-4); +} + +h2 { + font-size: var(--adev-docs-text-xl); + font-weight: var(--adev-docs-font-weight-semibold); + margin-bottom: var(--adev-docs-spacing-3); +} + +.concept-explanation ul { + list-style: disc inside; +} + +.concept-explanation ol { + list-style: decimal inside; +} + +.concept-explanation ul, +.concept-explanation ol { + margin-bottom: 1em; + padding-left: 1.5em; +} + +.concept-explanation li { + + margin-bottom: 0.5em; + +} + + + +/* Added styles for inline code snippets */ + +code { + + background-color: var(--adev-docs-code-background, #f5f5f5); + + border-radius: var(--adev-docs-border-radius-md, 4px); + + padding: 2px 4px; + + font-family: "Courier New", Courier, monospace; + + font-size: 0.9em; + + color: var(--adev-docs-code-text, #333); + +} + + + +/* Reset styles for code blocks to avoid conflicts with highlight.js */ + +pre code { + + background-color: transparent; + + border-radius: 0; + + padding: 0; + + font-family: inherit; + + font-size: inherit; + + color: inherit; + +} diff --git a/dynamic-sdui-app/tsconfig.app.json b/dynamic-sdui-app/tsconfig.app.json new file mode 100644 index 0000000..ef19921 --- /dev/null +++ b/dynamic-sdui-app/tsconfig.app.json @@ -0,0 +1,17 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [ + "node" + ] + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts" + ] +} diff --git a/dynamic-sdui-app/tsconfig.json b/dynamic-sdui-app/tsconfig.json new file mode 100644 index 0000000..2ab7442 --- /dev/null +++ b/dynamic-sdui-app/tsconfig.json @@ -0,0 +1,33 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/dynamic-sdui-app/tsconfig.spec.json b/dynamic-sdui-app/tsconfig.spec.json new file mode 100644 index 0000000..04df34c --- /dev/null +++ b/dynamic-sdui-app/tsconfig.spec.json @@ -0,0 +1,14 @@ +/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */ +/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine" + ] + }, + "include": [ + "src/**/*.ts" + ] +}