From 5cbe25e731c71b6ecb47feec418f5f938cc116c1 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Tue, 5 Nov 2024 15:29:28 +0800 Subject: [PATCH] Updated docs. Fixed ML module API definitions. [skip CI] --- Assets/Script/Lib/Dora/en/Dora.d.ts | 9 +- Assets/Script/Lib/Dora/en/ML.d.tl | 8 +- Assets/Script/Lib/Dora/zh-Hans/Dora.d.ts | 9 +- Assets/Script/Lib/Dora/zh-Hans/ML.d.tl | 12 +- .../1.using-decision-tree.mdx | 745 +++++ .../2.using-qlearning.mdx | 1172 ++++++++ Docs/docs/tutorial/30.setup-scene.mdx | 2 +- .../51.Using Input/2.using-enhanced-input.mdx | 8 +- .../current.json | 10 +- .../1.using-decision-tree.mdx | 745 +++++ .../2.using-qlearning.mdx | 1170 ++++++++ .../current/tutorial/30.setup-scene.mdx | 2 +- .../51.Using Input/2.using-enhanced-input.mdx | 12 +- Docs/package.json | 12 +- Docs/yarn.lock | 2399 +++++++++++++---- Source/Basic/Application.cpp | 2 +- Source/ML/ML.cpp | 1 + 17 files changed, 5826 insertions(+), 492 deletions(-) create mode 100644 Docs/docs/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx create mode 100644 Docs/docs/tutorial/105.Using Machine Learning/2.using-qlearning.mdx create mode 100644 Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx create mode 100644 Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/2.using-qlearning.mdx diff --git a/Assets/Script/Lib/Dora/en/Dora.d.ts b/Assets/Script/Lib/Dora/en/Dora.d.ts index 2321db3c4..09f748e03 100644 --- a/Assets/Script/Lib/Dora/en/Dora.d.ts +++ b/Assets/Script/Lib/Dora/en/Dora.d.ts @@ -6475,7 +6475,7 @@ class QLearner extends Object { /** * Update Q-value for a state-action pair based on received reward. * @param state Representing the state. - * @param action Representing the action. + * @param action Representing the action. Must be greater than 0. * @param reward Representing the reward received for the action in the state. */ update(state: number, action: number, reward: number): void; @@ -6483,7 +6483,7 @@ class QLearner extends Object { /** * Returns the best action for a given state based on the current Q-values. * @param state The current state. - * @returns The action with the highest Q-value for the given state. + * @returns The action with the highest Q-value for the given state. Returns 0 if no action is available. */ getBestAction(state: number): number; @@ -6504,7 +6504,7 @@ export namespace QLearner { interface QLearnerClass { /** * Construct a state from given hints and condition values. - * @param hints Representing the byte length of provided values. + * @param hints Representing the max number of possible hints. For example, if there are two conditions, and each condition has 3 possible values (0, 1, 2), then the hints array is {3, 3}. * @param values The condition values as discrete values. * @returns The packed state value. */ @@ -6512,7 +6512,7 @@ interface QLearnerClass { /** * Deconstruct a state from given hints to get condition values. - * @param hints Representing the byte length of provided values. + * @param hints Representing the max number of possible hints. For example, if there are two conditions, and each condition has 3 possible values (0, 1, 2), then the hints array is {3, 3}. * @param state The state integer to unpack. * @returns The condition values as discrete values. */ @@ -6551,6 +6551,7 @@ class ML { * @returns The accuracy of the decision tree on the training data. And an error message if an error occurred during building of the decision tree. */ BuildDecisionTreeAsync( + this: void, csvData: string, maxDepth: number, handler: ( diff --git a/Assets/Script/Lib/Dora/en/ML.d.tl b/Assets/Script/Lib/Dora/en/ML.d.tl index c0215d71a..a9dcc2763 100644 --- a/Assets/Script/Lib/Dora/en/ML.d.tl +++ b/Assets/Script/Lib/Dora/en/ML.d.tl @@ -15,13 +15,13 @@ local record QLearner -- Update Q-value for a state-action pair based on received reward. -- @param state (integer) Representing the state. - -- @param action (integer) Representing the action. + -- @param action (integer) Representing the action. Must be greater than 0. -- @param reward (number) Representing the reward received for the action in the state. update: function(self: QLearner, state: integer, action: integer, reward: number) -- Returns the best action for a given state based on the current Q-values. -- @param state (integer) The current state. - -- @return (integer) The action with the highest Q-value for the given state. + -- @return (integer) The action with the highest Q-value for the given state. Returns 0 if no action is available. getBestAction: function(self: QLearner, state: integer): integer -- Load Q-values from a matrix of state-action pairs. @@ -41,13 +41,13 @@ local record QLearnerClass type Type = QLearner -- Construct a state from given hints and condition values. - -- @param hints ({integer}) Representing the byte length of provided values. + -- @param hints ({integer}) Representing the max number of possible hints. For example, if there are two conditions, and each condition has 3 possible values (0, 1, 2), then the hints array is {3, 3}. -- @param values ({integer}) The condition values as discrete values. -- @return (integer) The packed state value. pack: function(self: QLearnerClass, hints: {integer}, values: {integer}): --[[state]] integer -- Deconstruct a state from given hints to get condition values. - -- @param hints ({integer}) Representing the byte length of provided values. + -- @param hints ({integer}) Representing the max number of possible hints. For example, if there are two conditions, and each condition has 3 possible values (0, 1, 2), then the hints array is {3, 3}. -- @param state (integer) The state integer to unpack. -- @return ({integer}) The condition values as discrete values. unpack: function(self: QLearnerClass, hints: {integer}, state: integer): {integer} diff --git a/Assets/Script/Lib/Dora/zh-Hans/Dora.d.ts b/Assets/Script/Lib/Dora/zh-Hans/Dora.d.ts index d36a56984..1f461b357 100644 --- a/Assets/Script/Lib/Dora/zh-Hans/Dora.d.ts +++ b/Assets/Script/Lib/Dora/zh-Hans/Dora.d.ts @@ -6474,7 +6474,7 @@ class QLearner extends Object { /** * 根据接收到的奖励更新状态-动作对的 Q 值。 * @param state 表示状态的值。 - * @param action 表示动作的值。 + * @param action 表示动作的值。必须为大于0的整数。 * @param reward 表示在状态中执行动作所获得的奖励。 */ update(state: number, action: number, reward: number): void; @@ -6482,7 +6482,7 @@ class QLearner extends Object { /** * 根据当前的 Q 值返回特定状态的最佳动作。 * @param state 当前状态。 - * @returns 特定状态下具有最高 Q 值的动作。 + * @returns 特定状态下具有最高 Q 值的动作。返回0表示没有动作。 */ getBestAction(state: number): number; @@ -6503,7 +6503,7 @@ export namespace QLearner { interface QLearnerClass { /** * 根据特定的提示和条件值构造状态。 - * @param hints 提供的值的字节长度。 + * @param hints 表示离散条件有多少种可能的提示。假设有两组条件,取值范围均为0, 1, 2,则提示数组为{3, 3}。 * @param values 离散值的条件值。 * @returns 打包后的状态值。 */ @@ -6511,7 +6511,7 @@ interface QLearnerClass { /** * 解包函数,将状态整数解包为离散值。 - * @param hints 提供的值的字节长度。 + * @param hints 表示离散条件有多少种可能的提示。假设有两组条件,取值范围均为0, 1, 2,则提示数组为{3, 3}。 * @param state 要解包的状态整数。 * @returns 离散值的条件值。 */ @@ -6550,6 +6550,7 @@ class ML { * @returns 决策树在训练数据上的准确度。如果在构建决策树过程中发生错误,则返回错误消息。 */ BuildDecisionTreeAsync( + this: void, csvData: string, maxDepth: number, handler: ( diff --git a/Assets/Script/Lib/Dora/zh-Hans/ML.d.tl b/Assets/Script/Lib/Dora/zh-Hans/ML.d.tl index a061c12ab..698ad3b4f 100644 --- a/Assets/Script/Lib/Dora/zh-Hans/ML.d.tl +++ b/Assets/Script/Lib/Dora/zh-Hans/ML.d.tl @@ -16,13 +16,13 @@ local record QLearner -- 根据收到的奖励值更新一对状态和动作下的Q值。 -- @param state (integer) 表示状态的整数。 - -- @param action (integer) 表示动作的整数。 + -- @param action (integer) 表示动作的整数。必须为大于0的整数。 -- @param reward (number) 表示在状态中采取行动获得的奖励值。 update: function(self: QLearner, state: integer, action: integer, reward: number) -- 基于当前Q值返回给定状态的最佳动作。 -- @param state (integer) 当前状态。 - -- @return (integer) 给定状态下具有最高Q值的动作。 + -- @return (integer) 给定状态下具有最高Q值的动作。返回0表示没有动作。 getBestAction: function(self: QLearner, state: integer): integer -- 从状态-动作对的矩阵中加载Q值。 @@ -41,14 +41,14 @@ end local record QLearnerClass type Type = QLearner - -- 根据给定的数值的字节长度的提示和条件数值构造状态值。 - -- @param hints ({integer}) 表示条件数值的字节长度。 + -- 根据给定的离散条件有多少种可能的提示和当前的条件数值构造状态值。 + -- @param hints ({integer}) 表示离散条件有多少种可能的提示。假设有两组条件,取值范围均为0, 1, 2,则提示数组为{3, 3}。 -- @param values ({integer}) 离散值形式的条件值。 -- @return (integer) 生成的状态值。 pack: function(self: QLearnerClass, hints: {integer}, values: {integer}): --[[state]] integer - -- 通过给定的字节长度的提示解析状态值以获取条件值。 - -- @param hints ({integer}) 表示条件数值的字节长度。 + -- 通过给定的离散条件有多少种可能的提示,解析状态值以获取条件值。 + -- @param hints ({integer}) 表示离散条件有多少种可能的提示。假设有两组条件,取值范围均为0, 1, 2,则提示数组为{3, 3}。 -- @param state (integer) 要解析的状态整数。 -- @return ({integer}) 包含离散值形式的条件值列表。 unpack: function(self: QLearnerClass, hints: {integer}, state: integer): {integer} diff --git a/Docs/docs/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx b/Docs/docs/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx new file mode 100644 index 000000000..fec7dabbb --- /dev/null +++ b/Docs/docs/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx @@ -0,0 +1,745 @@ +import "@site/src/languages/highlight"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Intelligent Game AI with Decision Trees + +## 1. Introduction + +  In game development, **Artificial Intelligence (AI)** plays a crucial role. This tutorial will introduce how to use the **C4.5 decision tree** algorithm provided by the Dora SSR engine to create intelligent game AI. We will learn this process step by step through a simple example. + +### 1.1 What is a Decision Tree? + +  A decision tree is a structure similar to a flowchart that assists in decision-making. Imagine we are playing a game of "guess the animal": + +```mermaid +graph TD +A[Does it have four legs?] -->|Yes| B[Does it bark?] +A -->|No| C[Can it fly?] +B -->|Yes| D[It's a dog] +B -->|No| E[It's a cat] +C -->|Yes| F[It's a bird] +C -->|No| G[It's a snake] +``` + +  This is a simple example of a decision tree. In game AI, we can use a similar structure to make intelligent decisions. + +## 2. Preparation + +  First, we need to prepare training data. Suppose we are developing a simple fighting game AI that needs to decide when to **attack**, **defend**, or **flee**. + +### 2.1 Preparing Training Data (CSV Format) + +  The format of the training data is described as follows: + +- **First line**: Contains the names of all features, such as "Distance," "Enemy Health," etc. +- **Second line**: Defines the data types of each feature, where: + - `C` represents **Categorical** data, like "Near," "Far," etc., which are discrete values. + - `N` represents **Numerical** data, like specific health values. +- **From the third line onwards**: Actual training data, with each line representing a training sample. +- **Last column**: The decision result, which is the action the AI should take. This is the target value the decision tree will learn to predict, which can be a classification or numerical value. + +```csv +Distance,Enemy Health,My Health,Action +C,C,C,C +Near,High,High,Attack +Near,Low,High,Attack +Far,High,Low,Flee +Medium,Medium,Low,Defend +Far,Low,High,Attack +``` + +## 3. Basic Code Implementation + +  Let's train and generate a decision tree with this training data to implement a simple combat AI: + + + + +```lua +local thread = require("thread") +local ML = require("ML") + +-- Prepare training data +local trainingData = [[ +Distance,Enemy Health,My Health,Action +C,C,C,C +Near,High,High,Attack +Near,Low,High,Attack +Far,High,Low,Flee +Medium,Medium,Low,Defend +Far,Low,High,Attack +]] + +-- Build decision tree +function buildDecisionTreeAsync() + local trainingResult = {} + + -- Set maximum depth to 3 + local accuracy, err = ML.BuildDecisionTreeAsync(trainingData, 3, function(depth, name, op, value) + -- Add indentation based on depth + local line = string.rep("\t", depth + 1) + + -- Handle leaf nodes (result nodes) + if op == "return" then + line = line .. 'return "' .. value .. '"' + else + -- Construct conditional statements + local valueStr = (op == '==' and '"' .. value .. '"' or value) + line = line .. "if " .. name .. " " .. op .. " " .. valueStr + end + table.insert(trainingResult, line) + end) + + if err then + print("Error building decision tree:", err) + return + end + + print("Decision tree accuracy:", accuracy) + print("Decision tree structure:\n" .. table.concat(trainingResult, "\n")) + + return trainingResult +end + +-- Test asynchronous decision tree construction with the following code +thread(buildDecisionTreeAsync) +``` + + + + +```tl +local thread = require("thread") +local ML = require("ML") + +-- Prepare training data +local trainingData = [[ +Distance,Enemy Health,My Health,Action +C,C,C,C +Near,High,High,Attack +Near,Low,High,Attack +Far,High,Low,Flee +Medium,Medium,Low,Defend +Far,Low,High,Attack +]] + +-- Build decision tree +local function buildDecisionTreeAsync(): {string} + local trainingResult: {string} = {} + + -- Set maximum depth to 3 + local accuracy, err = ML.BuildDecisionTreeAsync(trainingData, 3, function(depth: integer, name: string, op: ML.Operator, value: string) + -- Add indentation based on depth + local line = string.rep("\t", depth + 1) + + -- Handle leaf nodes (result nodes) + if op == "return" then + line = line .. 'return "' .. value .. '"' + else + -- Construct conditional statements + local valueStr = (op == '==' and '"' .. value .. '"' or value) + line = line .. "if " .. name .. " " .. op .. " " .. valueStr + end + table.insert(trainingResult, line) + end) + + if err then + print("Error building decision tree:", err) + return + end + + print("Decision tree accuracy:", accuracy) + print("Decision tree structure:\n" .. table.concat(trainingResult, "\n")) + + return trainingResult +end + +-- Test asynchronous decision tree construction with the following code +thread(buildDecisionTreeAsync) +``` + + + + +```ts +import { ML, thread } from "Dora"; + +// Prepare training data +const trainingData = ` +Distance,Enemy Health,My Health,Action +C,C,C,C +Near,High,High,Attack +Near,Low,High,Attack +Far,High,Low,Flee +Medium,Medium,Low,Defend +Far,Low,High,Attack +`; + +// Build decision tree +const buildDecisionTreeAsync = () => { + const trainingResult: string[] = []; + + // Set maximum depth to 3 + const [accuracy, err] = ML.BuildDecisionTreeAsync(trainingData, 3, (depth, name, op, value) => { + // Add indentation based on depth + let line = "\t".repeat(depth + 1); + + // Handle leaf nodes (result nodes) + if (op === "return") { + line += `return "${value}"`; + } else { + // Construct conditional statements + const valueStr = (op === "==" ? `"${value}"` : value); + line += `if ${name} ${op} ${valueStr}`; + } + trainingResult.push(line); + }); + + if (err) { + print("Error building decision tree:", err); + return trainingResult; + } + + print("Decision tree accuracy:", accuracy); + print("Decision tree structure:\n" + trainingResult.join("\n")); + + return trainingResult; +}; + +// Test asynchronous decision tree construction with the following code +thread(buildDecisionTreeAsync); +``` + + + + +```yue +_ENV = Dora + +-- Prepare training data +trainingData = [[ +Distance,Enemy Health,My Health,Action +C,C,C,C +Near,High,High,Attack +Near,Low,High,Attack +Far,High,Low,Flee +Medium,Medium,Low,Defend +Far,Low,High,Attack +]] + +-- Build decision tree +buildDecisionTreeAsync = -> + trainingResult = [] + + -- Set maximum depth to 3 + accuracy, err = ML.BuildDecisionTreeAsync trainingData, 3, (depth, name, op, value) -> + -- Add indentation based on depth + line = string.rep "\t", depth + 1 + + -- Handle leaf nodes (result nodes) + if op == "return" + line ..= "return \"#{value}\"" + else + -- Construct conditional statements + valueStr = (op == "==" and "\"#{value}\"" or value) + line ..= "if #{name} #{op} #{valueStr}" + + table.insert trainingResult, line + + if err + print "Error building decision tree: #{err}" + return + + print "Decision tree accuracy: #{accuracy}" + print "Decision tree structure:\n" .. table.concat trainingResult, "\n" + + trainingResult + +-- Test asynchronous decision tree construction with the following code +thread buildDecisionTreeAsync +``` + + + + +### 3.1 Visualizing the Generated Decision Tree + +  The structure of the generated decision tree is as follows: + +```mermaid +graph TD +A[My Health == High?] -->|Yes| B[Return: Attack] +A -->|No| C[Distance == Far?] +C -->|Yes| D[Return: Flee] +C -->|No| E[Return: Defend] +``` + +## 4. Using in the Game + +  Below is a simple follow-up example demonstrating how to apply this AI decision tree in a game character: + + + + +```lua +local yue = require("yue") +local Vec2 = require("Vec2") + +thread(function() + -- Build decision tree + local trainingResult = buildDecisionTreeAsync() + + -- Load decision tree as a YueScript function + local decisionFunction = yue.loadstring( + "(data)->\n" .. + "\t:Distance, :Enemy Health, :My Health = data\n" .. + table.concat(trainingResult, "\n") + )() + + -- Define Character class + local Character = {} + function Character:new() + local char = { + position = Vec2.zero, + health = 100, + maxHealth = 100 + } + setmetatable(char, {__index = Character}) + return char + end + + -- Return state based on health percentage + function Character:getHealthState() + local healthPercent = self.health / self.maxHealth + if healthPercent > 0.7 then return "High" + elseif healthPercent > 0.3 then return "Medium" + else return "Low" end + end + + -- Return state based on actual distance + function Character:calculateDistance(enemy) + local distance = self.position:distance(enemy.position) + if distance < 50 then return "Near" + elseif distance < 150 then return "Medium" + else return "Far" end + end + + -- Decide action + function Character:decideAction(enemy) + return decisionFunction{ + ["Distance"] = self:calculateDistance(enemy), + ["Enemy Health"] = enemy:getHealthState(), + ["My Health"] = self:getHealthState() + } + end + + -- Update character state and take action + function Character:update(enemy) + local action = self:decideAction(enemy) + -- Perform the corresponding action + print("Executing action: " .. action) + end + + -- Create character instance + local character = Character:new() + local enemy = Character:new() + + -- Set enemy position + enemy.position = Vec2(100, 100) + -- Current character should perform "Attack" + character:update(enemy) + + -- Update character health + character.health = 10 + -- Current character should perform "Defend" + character:update(enemy) +end) +``` + + + + +```tl +local yue = require("yue") +local Vec2 = require("Vec2") + +thread(function() + -- Build decision tree + local trainingResult = buildDecisionTreeAsync() + + -- Load decision tree as a YueScript function + local result = yue.loadstring( + "(data)->\n" .. + "\t:Distance, :Enemy Health, :My Health = data\n" .. + table.concat(trainingResult, "\n") + ) + + if result is nil then + return + end + + local record Feature + ["Distance"]: string + ["Enemy Health"]: string + ["My Health"]: string + end + + local decisionFunction = result() as function(Feature): string + + -- Define Character class + local record Character + position: Vec2.Type + health: number + maxHealth: number + end + + function Character:new(): Character + local char = { + position = Vec2.zero, + health = 100, + maxHealth = 100 + } + setmetatable(char, {__index = Character}) + return char + end + + -- Return state based on health percentage + function Character:getHealthState(): string + local healthPercent = self.health / self.maxHealth + if healthPercent > 0.7 then return "High" + elseif healthPercent > 0.3 then return "Medium" + else return "Low" end + end + + -- Return state based on actual distance + function Character:calculateDistance(enemy: Character): string + local distance = self.position:distance(enemy.position) + if distance < 50 then return "Near" + elseif distance < 150 then return "Medium" + else return "Far" end + end + + -- Decide action + function Character:decideAction(enemy: Character): string + return decisionFunction{ + ["Distance"] = self:calculateDistance(enemy), + ["Enemy Health"] = enemy:getHealthState(), + ["My Health"] = self:getHealthState() + } + end + + -- Update character state and take action + function Character:update(enemy: Character) + local action = self:decideAction(enemy) + -- Perform the corresponding action + print("Executing action: " .. action) + end + + -- Create character instance + local character = Character:new() + local enemy = Character:new() + + -- Set enemy position + enemy.position = Vec2(100, 100) + -- Current character should perform "Attack" + character:update(enemy) + + -- Update character health + character.health = 10 + -- Current character should perform "Defend" + character:update(enemy) +end) +``` + + + + +```ts +import { Vec2 } from "Dora"; +const yue = require("yue") + +thread(() => { + // Build decision tree + const trainingResult = buildDecisionTreeAsync(); + + // Load decision tree as a YueScript function + const decisionFunction = yue.loadstring( + "(data)->\n" + + "\t:Distance, :Enemy Health, :My Health = data\n" + + trainingResult.join("\n") + )() as (data: {}) => string; + + // Define Character class + class Character { + position: Vec2.Type + health: number + maxHealth: number + + constructor() { + this.position = Vec2.zero; + this.health = 100; + this.maxHealth = 100; + } + + // Return state based on health percentage + getHealthState() { + const healthPercent = this.health / this.maxHealth; + if (healthPercent > 0.7) return "High"; + else if (healthPercent > 0.3) return "Medium"; + else return "Low"; + } + + // Return state based on actual distance + calculateDistance(enemy: Character) { + const distance = this.position.distance(enemy.position); + if (distance < 50) return "Near"; + else if (distance < 150) return "Medium"; + else return "Far"; + } + + // Decide action + decideAction(enemy: Character) { + return decisionFunction({ + "Distance": this.calculateDistance(enemy), + "Enemy Health": enemy.getHealthState(), + "My Health": this.getHealthState() + }); + } + + // Update character state and take action + update(enemy: Character) { + const action = this.decideAction(enemy); + // Perform the corresponding action + print(`Executing action: ${action}`); + } + }; + + // Create character instance + const character = new Character(); + const enemy = new Character(); + + // Set enemy position + enemy.position = Vec2(100, 100); + // Current character should perform "Attack" + character.update(enemy); + + // Update character health + character.health = 10; + // Current character should perform "Defend" + character.update(enemy); +}); +``` + + + + +```yue +import "yue" + +thread -> + -- Build decision tree + trainingResult = buildDecisionTreeAsync! + + -- Load decision tree as a YueScript function + decisionFunction = yue.loadstring( + "(data)->\n" .. + "\t:Distance, :Enemy Health, :My Health = data\n" .. + table.concat(trainingResult, "\n") + )! + + -- Define Character class + class Character + new: => + @position = Vec2.zero + @health = 100 + @maxHealth = 100 + + -- Return state based on health percentage + getHealthState: => + healthPercent = @health / @maxHealth + if healthPercent > 0.7 then return "High" + elseif healthPercent > 0.3 then return "Medium" + else return "Low" + + -- Return state based on actual distance + calculateDistance: (enemy) => + distance = self.position\distance enemy.position + if distance < 50 then return "Near" + elseif distance < 150 then return "Medium" + else return "Far" + + -- Decide action + decideAction: (enemy) => + return decisionFunction + ["Distance"]: @calculateDistance enemy + ["Enemy Health"]: enemy\getHealthState! + ["My Health"]: @getHealthState! + + -- Update character state and take action + update: (enemy) => + action = @decideAction enemy + -- Perform the corresponding action + print "Executing action: #{action}" + + -- Create character instance + character = Character! + enemy = Character! + + -- Set enemy position + enemy.position = Vec2 100, 100 + -- Current character should perform "Attack" + character\update enemy + + -- Update character health + character.health = 10 + -- Current character should perform "Defend" + character\update enemy +``` + + + + +## 5. Practical Application Notes + +### 5.1 Advantages of Decision Trees + +  **Decision trees**, as a machine learning algorithm, have the following advantages in game AI development: + +- **Easy to understand and implement**: The structure of decision trees is intuitive and resembles human decision-making processes, making it easier for developers to comprehend and implement complex decision logic. +- **Transparent decision process**: Each decision step is clearly visible, facilitating debugging and optimization of AI behavior. +- **High flexibility**: The structure and parameters of the decision tree can be adjusted as needed to align AI behavior with design goals. +- **Efficiency**: Decision trees require only simple conditional checks at runtime, leading to low computational overhead, which is suitable for real-time gaming scenarios. + +### 5.2 Considerations for Use + +  When using decision trees to build game AI, the following points should be noted: + +- **Representativeness of training data**: Ensure that the training data covers various possible game scenarios, allowing AI to handle different states. It is recommended to use real player data as training samples. +- **Avoid overfitting**: The depth of the decision tree should not be too large. A tree that is too deep may overfit the training data, reducing its ability to generalize to new data. Start with a smaller depth and adjust gradually based on performance. +- **Continuous optimization**: Continuously collect new data during gameplay and periodically retrain the model, enabling AI to adapt to changing player strategies. + +## 6. Advanced Optimization Suggestions + +- **Add more features**: For example: + - Skill cooldown times + - Number of available items + - Surrounding terrain information + +- **Dynamically adjust AI behavior**: + +   During the game, you can dynamically update the training data based on player behavior data, retraining the decision tree to make the AI more aligned with the player's style. + + + + + ```lua + function Character:updateAI(enemy, battleAction) + -- Record new battle data + local newTrainingData = string.format("%s,%s,%s,%s\n", + self:calculateDistance(enemy), + enemy:getHealthState(), + self:getHealthState(), + battleAction + ) + trainingData = trainingData .. newTrainingData + -- Periodically retrain the AI + thread(function() + buildDecisionTreeAsync() + -- ... other handling logic + end) + end + ``` + + + + + ```tl + function Character:updateAI(enemy: Character, battleAction: string) + -- Record new battle data + local newTrainingData = string.format("%s,%s,%s,%s\n", + self:calculateDistance(enemy), + enemy:getHealthState(), + self:getHealthState(), + battleAction + ) + trainingData = trainingData .. newTrainingData + -- Periodically retrain the AI + thread(function() + buildDecisionTreeAsync() + -- ... other handling logic + end) + end + ``` + + + + + ```ts + updateAI(enemy: Character, battleAction: string) { + // Record new battle data + const newTrainingData = + `${this.calculateDistance(enemy) + },${enemy.getHealthState() + },${this.getHealthState() + },${battleAction}\n`; + trainingData = trainingData + newTrainingData; + // Periodically retrain the AI + thread(() => { + buildDecisionTreeAsync(); + // ... other handling logic + }); + } + ``` + + + + + ```yue + updateAI: (enemy: Character, battleAction: string) => + -- Record new battle data + newTrainingData = string.format( + "%s,%s,%s,%s\n" + @calculateDistance enemy + enemy\getHealthState! + @getHealthState! + battleAction + ) + trainingData ..= newTrainingData + -- Periodically retrain the AI + thread -> + buildDecisionTreeAsync! + -- ... other handling logic + ``` + + + + +## 7. Frequently Asked Questions + +- **Q: What should be the depth of the decision tree?** + + **A**: It is recommended to set the initial depth to 3 or 4. A tree that is too deep may lead to overfitting, while a tree that is too shallow may not capture complex decision logic. + +- **Q: How can I improve the AI's performance?** + + **A**: You can improve it by: + - Increasing the quantity and diversity of training data + - Adjusting the depth and parameters of the decision tree + - Adding more meaningful features (such as environmental factors, enemy types, etc.) + +- **Q: How much training data is enough?** + + **A**: You can start with 50-100 data points and gradually increase the volume based on the complexity of the game and the results of testing to enhance the AI's accuracy. + +## 8. Conclusion + +  Through this tutorial, we have learned: + +- **Basic concepts of decision trees**: Understanding how decision trees assist in decision-making and their applications in game AI. +- **How to prepare training data**: Mastering the construction of effective training datasets as a foundation for model training. +- **Building decision trees using the ML module in Dora SSR**: Learning how to utilize the tools provided by the engine to quickly construct decision tree models. +- **Applying decision trees in games**: Understanding how to integrate the trained model into game logic for intelligent decision-making. +- **Methods for optimizing and improving AI systems**: Recognizing the importance of continuous optimization and how to enhance AI performance through model and data adjustments. + +  Remember, a great game AI should not only have complex algorithms but also enhance the player's gaming experience. By continuously adjusting and optimizing, you can create an AI that is both fun and challenging. diff --git a/Docs/docs/tutorial/105.Using Machine Learning/2.using-qlearning.mdx b/Docs/docs/tutorial/105.Using Machine Learning/2.using-qlearning.mdx new file mode 100644 index 000000000..1771270a8 --- /dev/null +++ b/Docs/docs/tutorial/105.Using Machine Learning/2.using-qlearning.mdx @@ -0,0 +1,1172 @@ +import "@site/src/languages/highlight"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Developing Gameplay with Q-Learning + +## 1. Introduction + +Welcome to this tutorial! Here, we'll walk you through how to use the Q-Learning reinforcement learning algorithm to develop gameplay in the Dora SSR game engine. Don't worry if you're new to machine learning and game development; this tutorial is designed to be easy to understand. + +## 2. What is Reinforcement Learning and Q-Learning? + +**Reinforcement Learning** is a type of machine learning in which an agent takes actions in an environment to earn rewards or penalties, learning to maximize cumulative rewards. + +**Q-Learning** is a model-free reinforcement learning algorithm. It estimates the maximum expected reward for an action \( a \) taken in a state \( s \) by learning a state-action value function \( Q(s, a) \). + +### 2.1 Applying Q-Learning in Game Development + +In a game, the game character can be seen as the agent, and the game world is the environment. Through Q-Learning, the character can gradually learn the best actions to maximize rewards, like defeating enemies or collecting items, based on different states. + +## 3. Understanding the QLearner Object + +The Dora SSR engine provides a `QLearner` object, which includes the methods needed to implement Q-Learning. Here are the main methods and properties: + +- **pack(hints, values)**: Combines multiple conditions into a unique state value. +- **QLearner(gamma, alpha, maxQ)**: Creates a QLearner instance. +- **update(state, action, reward)**: Updates Q-values based on the reward. +- **getBestAction(state)**: Retrieves the best action for a given state. +- **matrix**: A matrix storing state, action, and corresponding Q-values. +- **load(values)**: Loads Q-values from a known state-action pair matrix. + +### 3.1 QLearner:pack() Detailed Explanation + +#### Function Overview + +The `QLearner.pack()` method combines multiple discrete conditions into a unique state value. It accepts two parameters: + +- **hints**: An integer array indicating the number of possible values for each condition. +- **values**: An integer array representing the current value for each condition. + +#### Why is pack() Necessary? + +In reinforcement learning, states are often made up of multiple features. To store and retrieve these states in a Q-table efficiently, we need to combine these features into a unique state identifier. The `pack()` method serves this purpose. + +#### Working Principle + +Imagine we have two conditions: + +1. Weather conditions with three possibilities: sunny (0), cloudy (1), and rainy (2). +2. Number of enemies with two possibilities: few (0) and many (1). + +Thus, `hints = {3, 2}` represents three values for the first condition and two for the second. + +If it's currently cloudy and there are many enemies, then `values = {1, 1}`. + +Using `pack(hints, values)`, we can convert `values` into a unique state integer. For example: + + + + +```lua +local ML = require("ML") +local state = ML.QLearner:pack({3, 2}, {1, 1}) +print(state) -- Outputs a unique integer representing the current state +``` + + + + +```tl +local ML = require("ML") +local state = ML.QLearner:pack({3, 2}, {1, 1}) +print(state) -- Outputs a unique integer representing the current state +``` + + + + +```ts +import { ML } from "Dora"; +const state = ML.QLearner.pack([3, 2], [1, 1]); +print(state); // Outputs a unique integer representing the current state +``` + + + + +```yue +_ENV = Dora +state = ML.QLearner\pack [3, 2], [1, 1] +print state -- Outputs a unique integer representing the current state +``` + + + + +#### Mathematical Principle + +The `pack()` method combines multiple conditions by encoding each as a binary number and performing bitwise operations to produce a unique integer. + +## 4. Step-by-Step Implementation + +### 4.1 Importing the QLearner Module + +First, import the `ML` module and create a `QLearner` instance: + + + + +```lua +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) -- Adjust gamma, alpha, maxQ as needed +``` + + + + +```tl +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) -- Adjust gamma, alpha, maxQ as needed +``` + + + + +```ts +import { ML } from "Dora"; +const qLearner = ML.QLearner(0.5, 0.5, 100.0); // Adjust gamma, alpha, maxQ as needed +``` + + + + +```yue +_ENV = Dora +qLearner = ML.QLearner 0.5, 0.5, 100.0 -- Adjust gamma, alpha, maxQ as needed +``` + + + + +Let's assume we want the game character to learn which weapon to use in different environments. Our conditions and actions might look like this: + +- **Conditions (State Features)**: + - Environment type (3 types): Forest (0), Desert (1), Snow (2) + - Enemy type (2 types): Infantry (0), Tank (1) +- **Actions**: + - Use handgun (1) + - Use rocket launcher (2) + - Use sniper rifle (3) + +### 4.3 Constructing State Values with the pack() Method + + + + +```lua +local hints = {3, 2} -- Number of values for each condition +local environment = 1 -- Desert +local enemy = 0 -- Infantry +local stateValues = {environment, enemy} +local state = ML.QLearner:pack(hints, stateValues) +``` + + + + +```tl +local hints = {3, 2} -- Number of values for each condition +local environment = 1 -- Desert +local enemy = 0 -- Infantry +local stateValues = {environment, enemy} +local state = ML.QLearner:pack(hints, stateValues) +``` + + + + +```ts +const hints = [3, 2]; // Number of values for each condition +const environment = 1; // Desert +const enemy = 0; // Infantry +const stateValues = [environment, enemy]; +const state = ML.QLearner.pack(hints, stateValues); +``` + + + + +```yue +hints = [3, 2] -- Number of values for each condition +environment = 1 -- Desert +enemy = 0 -- Infantry +stateValues = [environment, enemy] +state = ML.QLearner\pack hints, stateValues +``` + + + + +### 4.4 Choosing an Action + + + + +```lua +local action = qLearner:getBestAction(state) +if action == 0 then -- 0 indicates no best action + -- Choose a random action if no best action exists + action = math.random(1, 3) +end +``` + + + + +```tl +local action = qLearner:getBestAction(state) +if action == 0 then -- 0 indicates no best action + -- Choose a random action if no best action exists + action = math.random(1, 3) +end +``` + + + + +```ts +let action = qLearner.getBestAction(state); +if (action === 0) { // 0 indicates no best action + // Choose a random action if no best action exists + action = Math.floor(Math.random() * 3) + 1; +} +``` + + + + +```yue +action = qLearner\getBestAction state +if action == 0 -- 0 indicates no best action + -- Choose a random action if no best action exists + action = math.random 1, 3 +``` + + + + +### 4.5 Performing the Action and Receiving Rewards + + + + +```lua +local reward = 0 +if action == 1 then + -- Logic for using the handgun + reward = 10 -- Hypothetical reward value +elseif action == 2 then + -- Logic for using the rocket launcher + reward = 20 +elseif action == 3 then + -- Logic for using the sniper rifle + reward = 15 +end +``` + + + + +```tl +local reward = 0 +if action == 1 then + -- Logic for using the handgun + reward = 10 -- Hypothetical reward value +elseif action == 2 then + -- Logic for using the rocket launcher + reward = 20 +elseif action == 3 then + -- Logic for using the sniper rifle + reward = 15 +end +``` + + + + +```ts +let reward = 0; +if (action === 1) { + // Logic for using the handgun + reward = 10; // Hypothetical reward value +} else if (action === 2) { + // Logic for using the rocket launcher + reward = 20; +} else if (action === 3) { + // Logic for using the sniper rifle + reward = 15; +} +``` + + + + +```yue +reward = switch action + when 1 -- Logic for using the handgun + 10 -- Hypothetical reward value + when 2 -- Logic for using the rocket launcher + 20 + when 3 -- Logic for using the sniper rifle + 15 +``` + + + + +### 4.6 Updating Q-Values + + + + +```lua +qLearner:update(state, action, reward) +``` + + + + +```tl +qLearner:update(state, action, reward) +``` + + + + +```ts +qLearner.update(state, action, reward); +``` + + + + +```yue +qLearner\update state, action, reward +``` + + + + +### 4.7 Training Loop + +Place the steps above in a loop to allow the agent to continually learn and update its strategy. A typical Q-Learning training process can be illustrated with the following flowchart: + +```mermaid +graph TD + A[Start] --> B[Observe Environment
Input Random Condition Combination] + B --> C[Use pack to Create State] + C --> D[Select Best Action for Current State] + D --> E{Is there a Best Action?} + E -- Yes --> F[Perform Best Action] + E -- No --> G[Randomly Choose Action] + F --> H[Receive Reward] + G --> H + H --> I[Update Q-Value] + I --> J[Next Round] + J --> B +``` + +## 5. Complete Code Example + +Below is a complete Lua code example demonstrating how to use `QLearner` in the Dora SSR engine to implement simple reinforcement learning. This example allows an agent to learn to choose the best weapon based on different environments and enemy types. + + + + +```lua +-- Import the ML module +local ML = require("ML") + +-- Create a QLearner instance with gamma, alpha, and maxQ set +local qLearner = ML.QLearner(0.5, 0.5, 100.0) + +-- Define the number of possible values for each condition (hints) +-- Environment types: Forest (0), Desert (1), Snowy (2) => 3 types +-- Enemy types: Infantry (0), Tank (1) => 2 types +local hints = {3, 2} + +-- Define action set +-- Use Handgun (1), Use Rocket Launcher (2), Use Sniper Rifle (3) +local actions = {1, 2, 3} + +-- Simulate multiple learning iterations +for episode = 1, 1000 do + -- Randomly generate the current environment and enemy type + local environment = math.random(0, 2) -- 0: Forest, 1: Desert, 2: Snowy + local enemy = math.random(0, 1) -- 0: Infantry, 1: Tank + + -- Use pack() method to combine current conditions into a unique state value + local stateValues = {environment, enemy} + local state = ML.QLearner:pack(hints, stateValues) + + -- Attempt to get the best action for the given state + local action = qLearner:getBestAction(state) + + -- If there is no best action, randomly select an action (exploration) + if action == 0 then + action = actions[math.random(#actions)] + else + -- With a certain probability, choose a random action to explore new strategies (ε-greedy strategy) + local explorationRate = 0.1 -- 10% chance to explore + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end + end + + -- Execute the action and get a reward based on the current environment and enemy type + local reward = 0 + if action == 1 then -- Use Handgun + if enemy == 0 then -- Against Infantry (advantage) + reward = 20 + else -- Against Tank (disadvantage) + reward = -10 + end + elseif action == 2 then -- Use Rocket Launcher + if enemy == 1 then -- Against Tank (advantage) + reward = 30 + else -- Against Infantry (disadvantage) + reward = 0 + end + elseif action == 3 then -- Use Sniper Rifle + if environment == 2 then -- In Snowy environment (advantage) + reward = 25 + else + reward = 10 + end + end + + -- Update Q value + qLearner:update(state, action, reward) +end + +-- Test learning results +print("Learning complete, starting tests...") + +-- Define test scenarios +local testScenarios = { + {environment = 0, enemy = 0}, -- Forest, against Infantry + {environment = 1, enemy = 1}, -- Desert, against Tank + {environment = 2, enemy = 0}, -- Snowy, against Infantry +} + +for i, scenario in ipairs(testScenarios) do + local stateValues = {scenario.environment, scenario.enemy} + local state = ML.QLearner:pack(hints, stateValues) + local action = qLearner:getBestAction(state) + + -- Display test results + local envNames = {"Forest", "Desert", "Snowy"} + local enemyNames = {"Infantry", "Tank"} + local actionNames = {"Handgun", "Rocket Launcher", "Sniper Rifle"} + + print(string.format("Scenario %d: Environment-%s, Enemy-%s => Recommended Use %s", + i, + envNames[scenario.environment + 1], + enemyNames[scenario.enemy + 1], + actionNames[action])) +end +``` + + + + +```tl +-- Import the ML module +local ML = require("ML") + +-- Create a QLearner instance with gamma, alpha, and maxQ set +local qLearner = ML.QLearner(0.5, 0.5, 100.0) + +-- Define the number of possible values for each condition (hints) +-- Environment types: Forest (0), Desert (1), Snowy (2) => 3 types +-- Enemy types: Infantry (0), Tank (1) => 2 types +local hints = {3, 2} + +-- Define action set +-- Use Handgun (1), Use Rocket Launcher (2), Use Sniper Rifle (3) +local actions = {1, 2, 3} + +-- Simulate multiple learning iterations +for episode = 1, 1000 do + -- Randomly generate the current environment and enemy type + local environment = math.random(0, 2) -- 0: Forest, 1: Desert, 2: Snowy + local enemy = math.random(0, 1) -- 0: Infantry, 1: Tank + + -- Use pack() method to combine current conditions into a unique state value + local stateValues = {environment, enemy} + local state = ML.QLearner:pack(hints, stateValues) + + -- Attempt to get the best action for the given state + local action = qLearner:getBestAction(state) + + -- If there is no best action, randomly select an action (exploration) + if action == 0 then + action = actions[math.random(#actions)] + else + -- With a certain probability, choose a random action to explore new strategies (ε-greedy strategy) + local explorationRate = 0.1 -- 10% chance to explore + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end + end + + -- Execute the action and get a reward based on the current environment and enemy type + local reward = 0 + if action == 1 then -- Use Handgun + if enemy == 0 then -- Against Infantry (advantage) + reward = 20 + else -- Against Tank (disadvantage) + reward = -10 + end + elseif action == 2 then -- Use Rocket Launcher + if enemy == 1 then -- Against Tank (advantage) + reward = 30 + else -- Against Infantry (disadvantage) + reward = 0 + end + elseif action == 3 then -- Use Sniper Rifle + if environment == 2 then -- In Snowy environment (advantage) + reward = 25 + else + reward = 10 + end + end + + -- Update Q value + qLearner:update(state, action, reward) +end + +-- Test learning results +print("Learning complete, starting tests...") + +-- Define test scenarios +local testScenarios = { + {environment = 0, enemy = 0}, -- Forest, against Infantry + {environment = 1, enemy = 1}, -- Desert, against Tank + {environment = 2, enemy = 0}, -- Snowy, against Infantry +} + +for i, scenario in ipairs(testScenarios) do + local stateValues = {scenario.environment, scenario.enemy} + local state = ML.QLearner:pack(hints, stateValues) + local action = qLearner:getBestAction(state) + + -- Display test results + local envNames = {"Forest", "Desert", "Snowy"} + local enemyNames = {"Infantry", "Tank"} + local actionNames = {"Handgun", "Rocket Launcher", "Sniper Rifle"} + + print(string.format("Scenario %d: Environment-%s, Enemy-%s => Recommended Use %s", + i, + envNames[scenario.environment + 1], + enemyNames[scenario.enemy + 1], + actionNames[action])) +end +``` + + + + +```ts +// Import the ML module +import { ML } from "Dora"; + +// Create a QLearner instance with gamma, alpha, and maxQ set +const qLearner = ML.QLearner(0.5, 0.5, 100.0); + +// Define the number of possible values for each condition (hints) +// Environment types: Forest (0), Desert (1), Snowy (2) => 3 types +// Enemy types: Infantry (0), Tank (1) => 2 types +const hints = [3, 2]; + +// Define action set +// Use Handgun (1), Use Rocket Launcher (2), Use Sniper Rifle (3) +const actions = [1, 2, 3]; + +// Simulate multiple learning iterations +for (let episode = 1; episode <= 1000; episode++) { + // Randomly generate the current environment and enemy type + const environment = math.random(0, 2); // 0: Forest, 1: Desert, 2: Snowy + const enemy = math.random(0, 1); // 0: Infantry, 1: Tank + + // Use pack() method to combine current conditions into a unique state value + const stateValues = [ + +environment, enemy]; + const state = ML.QLearner.pack(hints, stateValues); + + // Attempt to get the best action for the given state + let action = qLearner.getBestAction(state); + + // If there is no best action, randomly select an action (exploration) + if (action === 0) { + action = actions[math.random(actions.length) - 1]; + } else { + // With a certain probability, choose a random action to explore new strategies (ε-greedy strategy) + const explorationRate = 0.1; // 10% chance to explore + if (math.random() < explorationRate) { + action = actions[math.random(actions.length) - 1]; + } + } + + // Execute the action and get a reward based on the current environment and enemy type + let reward = 0; + if (action === 1) { // Use Handgun + if (enemy === 0) { // Against Infantry (advantage) + reward = 20; + } else { // Against Tank (disadvantage) + reward = -10; + } + } else if (action === 2) { // Use Rocket Launcher + if (enemy === 1) { // Against Tank (advantage) + reward = 30; + } else { // Against Infantry (disadvantage) + reward = 0; + } + } else if (action === 3) { // Use Sniper Rifle + if (environment === 2) { // In Snowy environment (advantage) + reward = 25; + } else { + reward = 10; + } + } + + // Update Q value + qLearner.update(state, action, reward); +} + +// Test learning results +print("Learning complete, starting tests..."); + +// Define test scenarios +const testScenarios = [ + { environment: 0, enemy: 0 }, // Forest, against Infantry + { environment: 1, enemy: 1 }, // Desert, against Tank + { environment: 2, enemy: 0 }, // Snowy, against Infantry +]; + +for (let i = 0; i < testScenarios.length; i++) { + const scenario = testScenarios[i]; + const stateValues = [scenario.environment, scenario.enemy]; + const state = ML.QLearner.pack(hints, stateValues); + const action = qLearner.getBestAction(state); + + // Display test results + const envNames = ["Forest", "Desert", "Snowy"]; + const enemyNames = ["Infantry", "Tank"]; + const actionNames = ["Handgun", "Rocket Launcher", "Sniper Rifle"]; + + print(string.format("Scenario %d: Environment-%s, Enemy-%s => Recommended Use %s", + i + 1, + envNames[scenario.environment], + enemyNames[scenario.enemy], + actionNames[action - 1])); +} +``` + + + + +```yue +-- Import the ML module +_ENV = Dora + +-- Create a QLearner instance with gamma, alpha, and maxQ set +qLearner = ML.QLearner 0.5, 0.5, 100.0 + +-- Define the number of possible values for each condition (hints) +-- Environment types: Forest (0), Desert (1), Snowy (2) => 3 types +-- Enemy types: Infantry (0), Tank (1) => 2 types +hints = [3, 2] + +-- Define action set +-- Use Handgun (1), Use Rocket Launcher (2), Use Sniper Rifle (3) +actions = [1, 2, 3] + +-- Simulate multiple learning iterations +for episode = 1, 1000 + -- Randomly generate the current environment and enemy type + environment = math.random 0, 2 -- 0: Forest, 1: Desert, 2: Snowy + enemy = math.random 0, 1 -- 0: Infantry, 1: Tank + + -- Use pack() method to combine current conditions into a unique state value + stateValues = [environment, enemy] + state = ML.QLearner\pack hints, stateValues + + -- Attempt to get the best action for the given state + action = qLearner\getBestAction state + + -- If there is no best action, randomly select an action (exploration) + if action == 0 + action = actions[math.random #actions] + else + -- With a certain probability, choose a random action to explore new strategies (ε-greedy strategy) + explorationRate = 0.1 -- 10% chance to explore + if math.random! < explorationRate + action = actions[math.random #actions] + + -- Execute the action and get a reward based on the current environment and enemy type + reward = 0 + reward = switch action + when 1 -- Use Handgun + if enemy == 0 -- Against Infantry (advantage) + 20 + else -- Against Tank (disadvantage) + -10 + when 2 -- Use Rocket Launcher + if enemy == 1 -- Against Tank (advantage) + 30 + else -- Against Infantry (disadvantage) + 0 + when 3 -- Use Sniper Rifle + if environment == 2 -- In Snowy environment (advantage) + 25 + else + 10 + + -- Update Q value + qLearner\update state, action, reward + +-- Test learning results +print "Learning complete, starting tests..." + +testScenarios = + * environment: 0 -- Forest, against Infantry + enemy: 0 + * environment: 1 -- Desert, against Tank + enemy: 1 + * environment: 2 -- Snowy, against Infantry + enemy: 0 + +for i, scenario in ipairs testScenarios + stateValues = [scenario.environment, scenario.enemy] + state = ML.QLearner\pack hints, stateValues + action = qLearner\getBestAction state + + -- Display test results + envNames = ["Forest", "Desert", "Snowy"] + enemyNames = ["Infantry", "Tank"] + actionNames = ["Handgun", "Rocket Launcher", "Sniper Rifle"] + + print string.format "Scenario %d: Environment-%s, Enemy-%s => Recommended Use %s", + i, + envNames[scenario.environment + 1], + enemyNames[scenario.enemy + 1], + actionNames[action] +``` + + + + +### 5.1 Code Explanation + +#### 1. Import Modules and Create a QLearner Instance + + + + +```lua +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) +``` + + + + +```tl +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) +``` + + + + +```ts +import { ML } from "Dora"; +const qLearner = ML.QLearner(0.5, 0.5, 100.0); +``` + + + + +```yue +_ENV = Dora +qLearner = ML.QLearner 0.5, 0.5, 100.0 +``` + + + + +Create a QLearner instance and set gamma, alpha, and maxQ. + +- **gamma**: The discount factor, influencing the weight of future rewards. +- **alpha**: The learning rate, determining the influence of new information on Q-value updates. +- **maxQ**: The maximum limit of Q-values to prevent them from growing indefinitely. + +#### 2. Define State Features and Action Set + + + + +```lua +local hints = {3, 2} +local actions = {1, 2, 3} +``` + + + + +```tl +local hints = [3, 2] +local actions = [1, 2, 3] +``` + + + + +```ts +const hints = [3, 2]; +const actions = [1, 2, 3]; +``` + + + + +```yue +hints = [3, 2] +actions = [1, 2, 3] +``` + + + + +Define the number of possible values for each condition (hints) and the action set. Note that the minimum action number starts from 1. + +#### 3. Run Learning Iterations + + + + +```lua +for episode = 1, 1000 do + -- Learning process +end +``` + + + + +```tl +for episode = 1, 1000 do + -- Learning process +end +``` + + + + +```ts +for (let episode = 1; episode <= 1000; episode++) { + // Learning process +} +``` + + + + +```yue +for episode = 1, 1000 + -- Learning process +``` + + + + +Use loops to simulate multiple episodes, allowing the agent to learn from different states. You can set the number of episodes to 1000 or adjust it based on needs—more episodes can help the agent gain more experience. + +#### 4. Randomly Generate Environment and Enemy Type + + + + +```lua +local environment = math.random(0, 2) +local enemy = math.random(0, 1) +``` + + + + +```tl +local environment = math.random 0, 2 +local enemy = math.random 0, 1 +``` + + + + +```ts +const environment = math.random(0, 2); +const enemy = math.random(0, 1); +``` + + + + +```yue +environment = math.random 0, 2 +enemy = math.random 0, 1 +``` + + + + +Simulate different game scenarios where the environment and enemy types are randomly generated. This simulates diverse situations, helping the agent gain more experience. + +#### 5. Construct State Value Using `pack()` Method + + + + +```lua +local stateValues = {environment, enemy} +local state = ML.QLearner:pack(hints, stateValues) +``` + + + + +```tl +local stateValues = [environment, enemy] +local state = ML.QLearner\pack hints, stateValues +``` + + + + +```ts +const stateValues = [environment, enemy]; +const state = ML.QLearner.pack(hints, stateValues); +``` + + + + +```yue +stateValues = [environment, enemy] +state = ML.QLearner\pack hints, stateValues +``` + + + + +Combine multiple conditions generated in this episode into a unique state integer for storage and retrieval in the Q-table. + +#### 6. Choose an Action + + + + +```lua +local action = qLearner:getBestAction(state) +if action == 0 then + action = actions[math.random(#actions)] +else + local explorationRate = 0.1 + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end +end +``` + + + + +```tl +local action = qLearner:getBestAction(state) +if action == 0 then + action = actions[math.random(#actions)] +else + local explorationRate = 0.1 + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end +end +``` + + + + +```ts +if (action === 0) { + action = actions[math.random(actions.length) - 1]; +} else { + const explorationRate = 0.1; + if (math.random() < explorationRate) { + action = actions[math.random(actions.length) - 1]; + } +} +``` + + + + +```yue +action = qLearner\getBestAction state +if action == 0 + action = actions[math.random #actions] +else + explorationRate = 0.1 + if math.random! < explorationRate + action = actions[math.random #actions] +``` + + + + +Use the `getBestAction(state)` method to get the known best action for the current state and employ an `ε-greedy strategy` for exploration. This strategy balances exploiting known information and exploring new options. + +#### 7. Execute Action and Get Reward + + + + +```lua +local reward = 0 +if action == 1 then + -- Calculate reward based on action and current state +end +``` + + + + +```tl +local reward = 0 +if action == 1 then + -- Calculate reward based on action and current state +end +``` + + + + +```ts +let reward = 0; +if (action === 1) { + // Calculate reward based on action and current state +} +``` + + + + +```yue +reward = 0 +reward = switch action + when 1 -- Using pistol + -- Calculate reward based on action and current state +``` + + + + +Set the reward based on game logic. In a real game, the reward might be calculated after a series of actions. + +#### 8. Update Q Value + + + + +```lua +qLearner:update(state, action, reward) +``` + + + + +```tl +qLearner:update(state, action, reward); +``` + + + + +```ts +qLearner.update(state, action, reward); +``` + + + + +```yue +qLearner\update state, action, reward +``` + + + + +Update the Q value with the received reward to improve strategy, allowing the agent to select optimal actions in different states. + +#### 9. Test the Learning Outcome + + + + +```lua +for i, scenario in ipairs(testScenarios) do + -- Test different scenarios to view agent decisions +end +``` + + + + +```tl +for i, scenario in ipairs testScenarios do + -- Test different scenarios to view agent decisions +end +``` + + + + +```ts +for (let i = 0; i < testScenarios.length; i++) { + // Test different scenarios to view agent decisions +} +``` + + + + +```yue +for i, scenario in ipairs testScenarios + -- Test different scenarios to view agent decisions +``` + + + + +Perform tests and display the agent's decisions across different scenarios. Note that the decisions may vary due to randomly generated scenarios. + +### 5.2 Sample Output + +``` +Learning completed, starting tests... +Scenario 1: Environment-Forest, Enemy-Infantry => Suggested weapon: Pistol +Scenario 2: Environment-Desert, Enemy-Tank => Suggested weapon: Rocket Launcher +Scenario 3: Environment-Snow, Enemy-Infantry => Suggested weapon: Sniper Rifle +``` + +## 6. Summary + +With this complete code example, we achieved the following goals: + +- **Using the QLearner:pack() Method**: Combined multiple conditions into a unique state value for easy storage and retrieval in the Q-table. +- **Built a Reinforcement Learning Loop**: Allowed the agent to try actions, gain rewards, and update its strategy across different states. +- **Implemented ε-greedy Strategy**: Balanced following known best strategies while maintaining exploration. +- **Tested Learning Outcomes**: Validated whether the agent learned to select optimal actions in predefined scenarios. + +We hope this example helps you understand how to use the Q-Learning algorithm in the Dora SSR engine to develop game mechanics. For any questions, feel free to join our community for discussion! diff --git a/Docs/docs/tutorial/30.setup-scene.mdx b/Docs/docs/tutorial/30.setup-scene.mdx index 543b321fc..fcbd1fceb 100644 --- a/Docs/docs/tutorial/30.setup-scene.mdx +++ b/Docs/docs/tutorial/30.setup-scene.mdx @@ -10,7 +10,7 @@ Here is a simple example of a game scene. The geometric transformations, color, ```mermaid graph TD - A[Root Node\nDirector.entry] --> B[Child Node 1] + A[Root Node
Director.entry] --> B[Child Node 1] A --> C[Child Node 2] B --> D[Child Node 1.1] B --> E[Child Node 1.2] diff --git a/Docs/docs/tutorial/51.Using Input/2.using-enhanced-input.mdx b/Docs/docs/tutorial/51.Using Input/2.using-enhanced-input.mdx index 4d9a5bcbb..091db7312 100644 --- a/Docs/docs/tutorial/51.Using Input/2.using-enhanced-input.mdx +++ b/Docs/docs/tutorial/51.Using Input/2.using-enhanced-input.mdx @@ -72,8 +72,8 @@ Here is an example of a tree-nested trigger definition used to describe a trigge ```mermaid graph TD - A[Sequence\nDetect Sequence] -->|Hold down| B[KeyHold\nKey LCtrl] - A -->|And press| C[KeyDown\nKey C] + A[Sequence
Detect Sequence] -->|Hold down| B[KeyHold
Key LCtrl] + A -->|And press| C[KeyDown
Key C] ``` The corresponding trigger code definition: @@ -125,8 +125,8 @@ Here is a trigger definition for pressing and holding the keyboard `Enter` key o ```mermaid graph TD - A[Selector\nSelector] -->|Hold down| B[KeyHold\nKey Return] - A -->|Or hold down| C[ButtonHold\nButton A] + A[Selector
Selector] -->|Hold down| B[KeyHold
Key Return] + A -->|Or hold down| C[ButtonHold
Button A] ``` The corresponding trigger code definition: diff --git a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current.json b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current.json index 03f677f87..8c5a833fe 100644 --- a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current.json +++ b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current.json @@ -261,7 +261,7 @@ }, "sidebar.apiSidebar.doc.Sprite": { "message": "Sprite", - "description": "The label for the doc item Sprite in sidebar apiSidebar, linking to the doc api/Class/Grid" + "description": "The label for the doc item Sprite in sidebar apiSidebar, linking to the doc api/Class/Sprite" }, "sidebar.apiSidebar.doc.Texture2D": { "message": "Texture2D", @@ -706,5 +706,13 @@ "sidebar.tutorialSidebar.category.Using Input": { "message": "如何处理输入事件", "description": "The label for category Using Input in sidebar tutorialSidebar" + }, + "sidebar.tutorialSidebar.category.Using Machine Learning": { + "message": "如何使用机器学习", + "description": "The label for category Using Machine Learning in sidebar tutorialSidebar" + }, + "sidebar.apiSidebar.doc.Grid": { + "message": "Grid", + "description": "The label for the doc item Grid in sidebar apiSidebar, linking to the doc api/Class/Grid" } } diff --git a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx new file mode 100644 index 000000000..22e46c457 --- /dev/null +++ b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/1.using-decision-tree.mdx @@ -0,0 +1,745 @@ +import "@site/src/languages/highlight"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# 使用决策树实现智能游戏 AI + +## 1. 简介 + +  在游戏开发中,**人工智能(AI)** 扮演着至关重要的角色。本教程将介绍如何利用 Dora SSR 引擎提供的 **C4.5 决策树** 算法来创建智能的游戏 AI。我们将通过一个简单的示例,逐步学习这一过程。 + +### 1.1 什么是决策树? + +  决策树是一种类似于流程图的结构,用于辅助决策。想象一下我们在玩“猜动物”的游戏: + +```mermaid +graph TD +A[是否有四条腿?] -->|是| B[会叫汪汪吗?] +A -->|否| C[会飞吗?] +B -->|是| D[是狗] +B -->|否| E[是猫] +C -->|是| F[是鸟] +C -->|否| G[是蛇] +``` + +  这就是一个简单的决策树示例。在游戏 AI 中,我们可以使用类似的结构来做出智能决策。 + +## 2. 准备工作 + +  首先,我们需要准备训练数据。假设我们正在开发一个简单的格斗游戏 AI,需要决定何时**攻击**、**防守**或**逃跑**。 + +### 2.1 准备训练数据(CSV 格式) + +  训练数据的格式说明: + +- **第一行**:包含所有特征的名称,例如“距离”、“敌人血量”等。 +- **第二行**:定义每个特征的数据类型,其中: + - `C` 表示**分类**(Categorical)数据,如“近”、“远”等离散值。 + - `N` 表示**数值**(Numerical)数据,如具体的血量数值。 +- **第三行开始**:实际的训练数据,每行代表一个训练样本。 +- **最后一列**:决策结果,即 AI 应采取的行动,这是决策树要学习预测的目标值,可以是分类值或数值。 + +```csv +距离,敌人血量,我方血量,行为 +C,C,C,C +近,高,高,攻击 +近,低,高,攻击 +远,高,低,逃跑 +中,中,低,防守 +远,低,高,攻击 +``` + +## 3. 基础代码实现 + +  让我们通过这组训练数据训练并生成一个决策树,以实现简单的战斗 AI: + + + + +```lua +local thread = require("thread") +local ML = require("ML") + +-- 准备训练数据 +local trainingData = [[ +距离,敌人血量,我方血量,行为 +C,C,C,C +近,高,高,攻击 +近,低,高,攻击 +远,高,低,逃跑 +中,中,低,防守 +远,低,高,攻击 +]] + +-- 构建决策树 +function buildDecisionTreeAsync() + local trainingResult = {} + + -- 最大深度设置为 3 + local accuracy, err = ML.BuildDecisionTreeAsync(trainingData, 3, function(depth, name, op, value) + -- 根据深度添加缩进 + local line = string.rep("\t", depth + 1) + + -- 处理叶子节点(结果节点) + if op == "return" then + line = line .. 'return "' .. value .. '"' + else + -- 构建条件语句 + local valueStr = (op == '==' and '"' .. value .. '"' or value) + line = line .. "if " .. name .. " " .. op .. " " .. valueStr + end + table.insert(trainingResult, line) + end) + + if err then + print("构建决策树时出错:", err) + return + end + + print("决策树准确度:", accuracy) + print("决策树结构:\n" .. table.concat(trainingResult, "\n")) + + return trainingResult +end + +-- 用下面的代码测试异步构建决策树 +thread(buildDecisionTreeAsync) +``` + + + + +```tl +local thread = require("thread") +local ML = require("ML") + +-- 准备训练数据 +local trainingData = [[ +距离,敌人血量,我方血量,行为 +C,C,C,C +近,高,高,攻击 +近,低,高,攻击 +远,高,低,逃跑 +中,中,低,防守 +远,低,高,攻击 +]] + +-- 构建决策树 +local function buildDecisionTreeAsync(): {string} + local trainingResult: {string} = {} + + -- 最大深度设置为 3 + local accuracy, err = ML.BuildDecisionTreeAsync(trainingData, 3, function(depth: integer, name: string, op: ML.Operator, value: string) + -- 根据深度添加缩进 + local line = string.rep("\t", depth + 1) + + -- 处理叶子节点(结果节点) + if op == "return" then + line = line .. 'return "' .. value .. '"' + else + -- 构建条件语句 + local valueStr = (op == '==' and '"' .. value .. '"' or value) + line = line .. "if " .. name .. " " .. op .. " " .. valueStr + end + table.insert(trainingResult, line) + end) + + if err then + print("构建决策树时出错:", err) + return + end + + print("决策树准确度:", accuracy) + print("决策树结构:\n" .. table.concat(trainingResult, "\n")) + + return trainingResult +end + +-- 用下面的代码测试异步构建决策树 +thread(buildDecisionTreeAsync) +``` + + + + +```ts +import { ML, thread } from "Dora"; + +// 准备训练数据 +const trainingData = ` +距离,敌人血量,我方血量,行为 +C,C,C,C +近,高,高,攻击 +近,低,高,攻击 +远,高,低,逃跑 +中,中,低,防守 +远,低,高,攻击 +`; + +// 构建决策树 +const buildDecisionTreeAsync = () => { + const trainingResult: string[] = []; + + // 最大深度设置为 3 + const [accuracy, err] = ML.BuildDecisionTreeAsync(trainingData, 3, (depth, name, op, value) => { + // 根据深度添加缩进 + let line = "\t".repeat(depth + 1); + + // 处理叶子节点(结果节点) + if (op === "return") { + line += `return "${value}"`; + } else { + // 构建条件语句 + const valueStr = (op === "==" ? `"${value}"` : value); + line += `if ${name} ${op} ${valueStr}`; + } + trainingResult.push(line); + }); + + if (err) { + print("构建决策树时出错:", err); + return trainingResult; + } + + print("决策树准确度:", accuracy); + print("决策树结构:\n" + trainingResult.join("\n")); + + return trainingResult; +}; + +// 用下面的代码测试异步构建决策树 +thread(buildDecisionTreeAsync); +``` + + + + +```yue +_ENV = Dora + +-- 准备训练数据 +trainingData = [[ +距离,敌人血量,我方血量,行为 +C,C,C,C +近,高,高,攻击 +近,低,高,攻击 +远,高,低,逃跑 +中,中,低,防守 +远,低,高,攻击 +]] + +-- 构建决策树 +buildDecisionTreeAsync = -> + trainingResult = [] + + -- 最大深度设置为 3 + accuracy, err = ML.BuildDecisionTreeAsync trainingData, 3, (depth, name, op, value) -> + -- 根据深度添加缩进 + line = string.rep "\t", depth + 1 + + -- 处理叶子节点(结果节点) + if op == "return" + line ..= "return \"#{value}\"" + else + -- 构建条件语句 + valueStr = (op == "==" and "\"#{value}\"" or value) + line ..= "if #{name} #{op} #{valueStr}" + + table.insert trainingResult, line + + if err + print "构建决策树时出错: #{err}" + return + + print "决策树准确度: #{accuracy}" + print "决策树结构:\n" .. table.concat trainingResult, "\n" + + trainingResult + +-- 用下面的代码测试异步构建决策树 +thread buildDecisionTreeAsync +``` + + + + +### 3.1 可视化生成的决策树 + +  生成的决策树结构如下: + +```mermaid +graph TD +A[我方血量 == 高?] -->|是| B[返回:攻击] +A -->|否| C[距离 == 远?] +C -->|是| D[返回:逃跑] +C -->|否| E[返回:防守] +``` + +## 4. 在游戏中使用 + +  下面是一个简单的续写示例,展示如何在游戏角色中应用这个 AI 决策树: + + + + +```lua +local yue = require("yue") +local Vec2 = require("Vec2") + +thread(function() + -- 构建决策树 + local trainingResult = buildDecisionTreeAsync() + + -- 加载决策树为一个 YueScript 函数 + local decisionFunction = yue.loadstring( + "(data)->\n" .. + "\t:距离, :敌人血量, :我方血量 = data\n" .. + table.concat(trainingResult, "\n") + )() + + -- 定义角色类 + local Character = {} + function Character:new() + local char = { + position = Vec2.zero, + health = 100, + maxHealth = 100 + } + setmetatable(char, {__index = Character}) + return char + end + + -- 根据血量百分比返回状态 + function Character:getHealthState() + local healthPercent = self.health / self.maxHealth + if healthPercent > 0.7 then return "高" + elseif healthPercent > 0.3 then return "中" + else return "低" end + end + + -- 根据实际距离返回状态 + function Character:calculateDistance(enemy) + local distance = self.position:distance(enemy.position) + if distance < 50 then return "近" + elseif distance < 150 then return "中" + else return "远" end + end + + -- 决定行动 + function Character:decideAction(enemy) + return decisionFunction{ + ["距离"] = self:calculateDistance(enemy), + ["敌人血量"] = enemy:getHealthState(), + ["我方血量"] = self:getHealthState() + } + end + + -- 更新角色状态并采取行动 + function Character:update(enemy) + local action = self:decideAction(enemy) + -- 执行对应的行为 + print("执行动作:" .. action) + end + + -- 创建角色实例 + local character = Character:new() + local enemy = Character:new() + + -- 设置敌人的位置 + enemy.position = Vec2(100, 100) + -- 当前角色应执行“攻击” + character:update(enemy) + + -- 更新角色血量 + character.health = 10 + -- 当前角色应执行“防守” + character:update(enemy) +end) +``` + + + + +```tl +local yue = require("yue") +local Vec2 = require("Vec2") + +thread(function() + -- 构建决策树 + local trainingResult = buildDecisionTreeAsync() + + -- 加载决策树为一个 YueScript 函数 + local result = yue.loadstring( + "(data)->\n" .. + "\t:距离, :敌人血量, :我方血量 = data\n" .. + table.concat(trainingResult, "\n") + ) + + if result is nil then + return + end + + local record Feature + ["距离"]: string + ["敌人血量"]: string + ["我方血量"]: string + end + + local decisionFunction = result() as function(Feature): string + + -- 定义角色类 + local record Character + position: Vec2.Type + health: number + maxHealth: number + end + + function Character:new(): Character + local char = { + position = Vec2.zero, + health = 100, + maxHealth = 100 + } + setmetatable(char, {__index = Character}) + return char + end + + -- 根据血量百分比返回状态 + function Character:getHealthState(): string + local healthPercent = self.health / self.maxHealth + if healthPercent > 0.7 then return "高" + elseif healthPercent > 0.3 then return "中" + else return "低" end + end + + -- 根据实际距离返回状态 + function Character:calculateDistance(enemy: Character): string + local distance = self.position:distance(enemy.position) + if distance < 50 then return "近" + elseif distance < 150 then return "中" + else return "远" end + end + + -- 决定行动 + function Character:decideAction(enemy: Character): string + return decisionFunction{ + ["距离"] = self:calculateDistance(enemy), + ["敌人血量"] = enemy:getHealthState(), + ["我方血量"] = self:getHealthState() + } + end + + -- 更新角色状态并采取行动 + function Character:update(enemy: Character) + local action = self:decideAction(enemy) + -- 执行对应的行为 + print("执行动作:" .. action) + end + + -- 创建角色实例 + local character = Character:new() + local enemy = Character:new() + + -- 设置敌人的位置 + enemy.position = Vec2(100, 100) + -- 当前角色应执行“攻击” + character:update(enemy) + + -- 更新角色血量 + character.health = 10 + -- 当前角色应执行“防守” + character:update(enemy) +end) +``` + + + + +```ts +import { Vec2 } from "Dora"; +const yue = require("yue") + +thread(() => { + // 构建决策树 + const trainingResult = buildDecisionTreeAsync(); + + // 加载决策树为一个 YueScript 函数 + const decisionFunction = yue.loadstring( + "(data)->\n" + + "\t:距离, :敌人血量, :我方血量 = data\n" + + trainingResult.join("\n") + )() as (data: {}) => string; + + // 定义角色类 + class Character { + position: Vec2.Type + health: number + maxHealth: number + + constructor() { + this.position = Vec2.zero; + this.health = 100; + this.maxHealth = 100; + } + + // 根据血量百分比返回状态 + getHealthState() { + const healthPercent = this.health / this.maxHealth; + if (healthPercent > 0.7) return "高"; + else if (healthPercent > 0.3) return "中"; + else return "低"; + } + + // 根据实际距离返回状态 + calculateDistance(enemy: Character) { + const distance = this.position.distance(enemy.position); + if (distance < 50) return "近"; + else if (distance < 150) return "中"; + else return "远"; + } + + // 决定行动 + decideAction(enemy: Character) { + return decisionFunction({ + "距离": this.calculateDistance(enemy), + "敌人血量": enemy.getHealthState(), + "我方血量": this.getHealthState() + }); + } + + // 更新角色状态并采取行动 + update(enemy: Character) { + const action = this.decideAction(enemy); + // 执行对应的行为 + print(`执行动作:${action}`); + } + }; + + // 创建角色实例 + const character = new Character(); + const enemy = new Character(); + + // 设置敌人的位置 + enemy.position = Vec2(100, 100); + // 当前角色应执行“攻击” + character.update(enemy); + + // 更新角色血量 + character.health = 10; + // 当前角色应执行“防守” + character.update(enemy); +}); +``` + + + + +```yue +import "yue" + +thread -> + -- 构建决策树 + trainingResult = buildDecisionTreeAsync! + + -- 加载决策树为一个 YueScript 函数 + decisionFunction = yue.loadstring( + "(data)->\n" .. + "\t:距离, :敌人血量, :我方血量 = data\n" .. + table.concat(trainingResult, "\n") + )! + + -- 定义角色类 + class Character + new: => + @position = Vec2.zero + @health = 100 + @maxHealth = 100 + + -- 根据血量百分比返回状态 + getHealthState: => + healthPercent = @health / @maxHealth + if healthPercent > 0.7 then return "高" + elseif healthPercent > 0.3 then return "中" + else return "低" + + -- 根据实际距离返回状态 + calculateDistance: (enemy) => + distance = self.position\distance enemy.position + if distance < 50 then return "近" + elseif distance < 150 then return "中" + else return "远" + + -- 决定行动 + decideAction: (enemy) => + return decisionFunction + ["距离"]: @calculateDistance enemy + ["敌人血量"]: enemy\getHealthState! + ["我方血量"]: @getHealthState! + + -- 更新角色状态并采取行动 + update: (enemy) => + action = @decideAction enemy + -- 执行对应的行为 + print "执行动作:#{action}" + + -- 创建角色实例 + character = Character! + enemy = Character! + + -- 设置敌人的位置 + enemy.position = Vec2 100, 100 + -- 当前角色应执行“攻击” + character\update enemy + + -- 更新角色血量 + character.health = 10 + -- 当前角色应执行“防守” + character\update enemy +``` + + + + +## 5. 实际运用说明 + +### 5.1 决策树的优势 + +  **决策树**作为一种机器学习算法,在游戏 AI 开发中具有以下优势: + +- **易于理解和实现**:决策树的结构直观,类似于人类的决策过程,便于开发者理解和实现复杂的决策逻辑。 +- **透明的决策过程**:每个决策步骤都是清晰可见的,方便调试和优化 AI 的行为。 +- **灵活性强**:可以根据游戏需求,随时调整决策树的结构和参数,使 AI 行为更符合设计目标。 +- **高效性**:决策树在运行时仅需简单的条件判断,计算开销小,适合实时性要求高的游戏场景。 + +### 5.2 使用注意事项 + +  在使用决策树构建游戏 AI 时,需要注意以下几点: + +- **训练数据的代表性**:确保训练数据覆盖各种可能的游戏情景,使 AI 能够应对不同的状态。建议使用真实玩家的数据作为训练样本。 +- **避免过拟合**:决策树深度不宜过大,过深的树可能过度拟合训练数据,降低对新数据的泛化能力。可以从较小的深度开始,根据效果逐步调整。 +- **持续优化**:在游戏运行过程中,持续收集新的数据,定期重新训练模型,使 AI 能够适应玩家的策略变化。 + +## 6. 进阶优化建议 + +- **添加更多特征**:例如: + - 技能冷却时间 + - 可用道具数量 + - 周围地形信息 + +- **动态调整 AI 行为**: + +   在游戏过程中,可以根据玩家的行为数据,动态更新训练数据,重新训练决策树,使 AI 更贴近玩家的风格。 + + + + + ```lua + function Character:updateAI(enemy, battleAction) + -- 记录新的战斗数据 + local newTrainingData = string.format("%s,%s,%s,%s\n", + self:calculateDistance(enemy), + enemy:getHealthState(), + self:getHealthState(), + battleAction + ) + trainingData = trainingData .. newTrainingData + -- 定期重新训练 AI + thread(function() + buildDecisionTreeAsync() + -- ... 其他处理逻辑 + end) + end + ``` + + + + + ```tl + function Character:updateAI(enemy: Character, battleAction: string) + -- 记录新的战斗数据 + local newTrainingData = string.format("%s,%s,%s,%s\n", + self:calculateDistance(enemy), + enemy:getHealthState(), + self:getHealthState(), + battleAction + ) + trainingData = trainingData .. newTrainingData + -- 定期重新训练 AI + thread(function() + buildDecisionTreeAsync() + -- ... 其他处理逻辑 + end) + end + ``` + + + + + ```ts + updateAI(enemy: Character, battleAction: string) { + // 记录新的战斗数据 + const newTrainingData = + `${this.calculateDistance(enemy) + },${enemy.getHealthState() + },${this.getHealthState() + },${battleAction}\n`; + trainingData = trainingData + newTrainingData; + // 定期重新训练 AI + thread(() => { + buildDecisionTreeAsync(); + // ... 其他处理逻辑 + }); + } + ``` + + + + + ```yue + updateAI: (enemy: Character, battleAction: string) => + -- 记录新的战斗数据 + newTrainingData = string.format( + "%s,%s,%s,%s\n" + @calculateDistance enemy + enemy\getHealthState! + @getHealthState! + battleAction + ) + trainingData ..= newTrainingData + -- 定期重新训练 AI + thread -> + buildDecisionTreeAsync! + -- ... 其他处理逻辑 + ``` + + + + +## 7. 常见问题解答 + +- **Q: 决策树的深度应该设定为多少?** + + **A**: 建议初始深度设置为 3 或 4。深度过大可能导致过拟合,深度过小可能无法捕捉复杂的决策逻辑。 + +- **Q: 如何改进 AI 的表现?** + + **A**: 可以通过以下方式改进: + - 增加训练数据的数量和多样性 + - 调整决策树的深度和参数 + - 添加更多有意义的特征(如环境因素、敌人类型等) + +- **Q: 需要多少训练数据才够?** + + **A**: 起初可以使用 50-100 条数据,根据游戏复杂度和测试结果,逐步增加数据量以提升 AI 的准确性。 + +## 8. 总结 + +  通过本教程,我们学习了: + +- **决策树的基本概念**:理解了决策树如何辅助决策,以及其在游戏 AI 中的应用。 +- **如何准备训练数据**:掌握了构建有效训练数据集的方法,为模型训练打下基础。 +- **使用 Dora SSR 的 ML 模块构建决策树**:学会了如何利用引擎提供的工具,快速构建决策树模型。 +- **在游戏中实际应用决策树**:了解了如何将训练好的模型整合到游戏逻辑中,实现智能决策。 +- **优化和改进 AI 系统的方法**:认识到持续优化的重要性,以及如何通过调整模型和数据来提升 AI 的表现。 + +  记住,一个优秀的游戏 AI 不仅要有复杂的算法,更要能提升玩家的游戏体验。通过不断地调整和优化,你可以创造出既有趣又具有挑战性的游戏 AI。 diff --git a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/2.using-qlearning.mdx b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/2.using-qlearning.mdx new file mode 100644 index 000000000..f8809a3df --- /dev/null +++ b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/105.Using Machine Learning/2.using-qlearning.mdx @@ -0,0 +1,1170 @@ +import "@site/src/languages/highlight"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# 使用 Q-Learning 开发游戏玩法 + +## 1. 引言 + +  欢迎来到本教程!在这里,我们将一步一步地学习如何在 Dora SSR 游戏引擎中使用 Q-Learning 强化学习算法来开发游戏玩法。即使您对机器学习和游戏开发并不熟悉,也无需担心。本教程将以通俗易懂的方式为您讲解。 + +## 2. 什么是强化学习和 Q-Learning? + +  **强化学习**是一种机器学习方法,它通过让智能体(agent)在环境中采取行动,从而获得奖励或惩罚,来学习如何最大化累积奖励。 + +  **Q-Learning** 是一种无模型的强化学习算法。它通过学习一个状态-动作值函数 \( Q(s, a) \),来估计在状态 \( s \) 下采取动作 \( a \) 所能获得的最大期望收益。 + +### 2.1 在游戏开发中应用 Q-Learning + +  在游戏中,您可以将游戏角色视为智能体,游戏环境就是角色所处的世界。通过 Q-Learning,角色可以在游戏互动过程中,逐步学习到在不同状态下采取何种行动来获得最大收益,例如击败敌人、收集道具等。 + +## 3. 了解 QLearner 对象 + +  在 Dora SSR 引擎中,我们有一个 `QLearner` 对象,它提供了实现 Q-Learning 所需的方法。以下是主要的方法和属性: + +- **pack(hints, values)**:将多个条件组合成一个唯一的状态值。 +- **QLearner(gamma, alpha, maxQ)**:创建一个 QLearner 实例。 +- **update(state, action, reward)**:根据奖励更新 Q 值。 +- **getBestAction(state)**:获取在给定状态下的最佳动作。 +- **matrix**:一个存储状态、动作和对应的 Q 值的矩阵。 +- **load(values)**:从已知的状态-动作对矩阵加载 Q 值。 + +### 3.1 QLearner:pack() 的详细解释 + +#### 功能概述 + +  `QLearner.pack()` 方法用于将多个离散条件组合成一个唯一的状态值。它接受两个参数: + +- **hints**:一个整数数组,表示每个条件可能的取值数量。 +- **values**:一个整数数组,表示当前每个条件的取值。 + +#### 为什么需要 pack()? + +  在强化学习中,状态通常是由多个特征组合而成的。为了方便在 Q 表中存储和查找,我们需要将这些特征组合成一个唯一的状态标识。`pack()` 方法就是实现这个功能的工具。 + +#### 工作原理 + +  假设我们有两个条件: + +1. 天气状况,有 3 种可能:晴天(0)、阴天(1)、雨天(2)。 +2. 敌人数量,有 2 种可能:少(0)、多(1)。 + +  因此,`hints = {3, 2}`,表示第一个条件有 3 种取值,第二个条件有 2 种取值。 + +  如果当前是阴天且敌人数量多,那么 `values = {1, 1}`。 + +  使用 `pack(hints, values)`,我们可以将 `values` 转换为一个唯一的状态整数。例如: + + + + +```lua +local ML = require("ML") +local state = ML.QLearner:pack({3, 2}, {1, 1}) +print(state) -- 输出一个整数,表示当前的唯一状态 +``` + + + + +```tl +local ML = require("ML") +local state = ML.QLearner:pack({3, 2}, {1, 1}) +print(state) -- 输出一个整数,表示当前的唯一状态 +``` + + + + +```ts +import { ML } from "Dora"; +const state = ML.QLearner.pack([3, 2], [1, 1]); +print(state); // 输出一个整数,表示当前的唯一状态 +``` + + + + +```yue +_ENV = Dora +state = ML.QLearner\pack [3, 2], [1, 1] +print state -- 输出一个整数,表示当前的唯一状态 +``` + + + + +#### 数学原理 + +  `pack()` 方法通过对每个条件的取值进行编码,将多个条件组合成一个整数。这是通过将每个条件的取值转换为二进制数进行位操作来实现的。 + +## 4. 实战步骤 + +### 4.1 导入 QLearner 模块 + +  首先,我们需要导入 `ML` 模块并创建一个 `QLearner` 实例: + + + + +```lua +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) -- 可以根据需要调整参数 gamma, alpha, maxQ +``` + + + + +```tl +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) -- 可以根据需要调整参数 gamma, alpha, maxQ +``` + + + + +```ts +import { ML } from "Dora"; +const qLearner = ML.QLearner(0.5, 0.5, 100.0); // 可以根据需要调整参数 gamma, alpha, maxQ +``` + + + + +```yue +_ENV = Dora +qLearner = ML.QLearner 0.5, 0.5, 100.0 -- 可以根据需要调整参数 gamma, alpha, maxQ +``` + + + + +  假设我们要让游戏角色学习在不同环境下选择合适的武器。我们的条件和动作可能如下: + +- **条件(状态特征)**: + - 环境类型(3 种):森林(0)、沙漠(1)、雪地(2) + - 敌人类型(2 种):步兵(0)、坦克(1) +- **动作**: + - 使用手枪(1) + - 使用火箭筒(2) + - 使用狙击枪(3) + +### 4.3 使用 pack() 方法构建状态值 + + + + +```lua +local hints = {3, 2} -- 每个条件的取值数量 +local environment = 1 -- 沙漠 +local enemy = 0 -- 步兵 +local stateValues = {environment, enemy} +local state = ML.QLearner:pack(hints, stateValues) +``` + + + + +```tl +local hints = {3, 2} -- 每个条件的取值数量 +local environment = 1 -- 沙漠 +local enemy = 0 -- 步兵 +local stateValues = {environment, enemy} +local state = ML.QLearner:pack(hints, stateValues) +``` + + + + +```ts +const hints = [3, 2]; // 每个条件的取值数量 +const environment = 1; // 沙漠 +const enemy = 0; // 步兵 +const stateValues = [environment, enemy]; +const state = ML.QLearner.pack(hints, stateValues); +``` + + + + +```yue +hints = [3, 2] -- 每个条件的取值数量 +environment = 1 -- 沙漠 +enemy = 0 -- 步兵 +stateValues = [environment, enemy] +state = ML.QLearner\pack hints, stateValues +``` + + + + +### 4.4 选择动作 + + + + +```lua +local action = qLearner:getBestAction(state) +if action == 0 then -- 0 表示没有最佳动作 + -- 如果没有最佳动作,随机选择一个 + action = math.random(1, 3) +end +``` + + + + +```tl +local action = qLearner:getBestAction(state) +if action == 0 then -- 0 表示没有最佳动作 + -- 如果没有最佳动作,随机选择一个 + action = math.random(1, 3) +end +``` + + + + +```ts +const action = qLearner.getBestAction(state); +if (action === 0) { // 0 表示没有最佳动作 + // 如果没有最佳动作,随机选择一个 + action = Math.floor(Math.random() * 3) + 1; +} +``` + + + + +```yue +action = qLearner\getBestAction state +if action == 0 -- 0 表示没有最佳动作 + -- 如果没有最佳动作,随机选择一个 + action = math.random 1, 3 +``` + + + + +### 4.5 执行动作并获得奖励 + + + + +```lua +local reward = 0 +if action == 1 then + -- 使用手枪的逻辑 + reward = 10 -- 假设的奖励值 +elseif action == 2 then + -- 使用火箭筒的逻辑 + reward = 20 +elseif action == 3 then + -- 使用狙击枪的逻辑 + reward = 15 +end +``` + + + + +```tl +local reward = 0 +if action == 1 then + -- 使用手枪的逻辑 + reward = 10 -- 假设的奖励值 +elseif action == 2 then + -- 使用火箭筒的逻辑 + reward = 20 +elseif action == 3 then + -- 使用狙击枪的逻辑 + reward = 15 +end +``` + + + + +```ts +let reward = 0; +if (action === 1) { + // 使用手枪的逻辑 + reward = 10; // 假设的奖励值 +} else if (action === 2) { + // 使用火箭筒的逻辑 + reward = 20; +} else if (action === 3) { + // 使用狙击枪的逻辑 + reward = 15; +} +``` + + + + +```yue +reward = switch action + when 1 -- 使用手枪的逻辑 + 10 -- 假设的奖励值 + when 2 -- 使用火箭筒的逻辑 + 20 + when 3 -- 使用狙击枪的逻辑 + 15 +``` + + + + +### 4.6 更新 Q 值 + + + + +```lua +qLearner:update(state, action, reward) +``` + + + + +```tl +qLearner:update(state, action, reward) +``` + + + + +```ts +qLearner.update(state, action, reward); +``` + + + + +```yue +qLearner\update state, action, reward +``` + + + + +### 4.7 循环训练 + +  将上述步骤放入一个迭代循环中,让智能体不断地学习和更新策略。智能体通常的 Q-Learning 学习过程可以参考下面一个简单的流程图: + +```mermaid +graph TD + A[开始] --> B[观察环境
输入随机的条件组合] + B --> C[使用 pack 构建为状态] + C --> D[选择当前状态下最佳动作] + D --> E{是否有最佳动作?} + E -- 是 --> F[执行最佳动作] + E -- 否 --> G[随机选择动作] + F --> H[获得奖励] + G --> H + H --> I[更新 Q 值] + I --> J[下一回合] + J --> B +``` + +## 5. 完整的代码示例 + +  下面是一个完整的 Lua 代码示例,演示如何在 Dora SSR 引擎中使用 `QLearner` 来实现简单的强化学习。这个示例将让一个智能体学习在不同的环境和敌人类型下选择最佳的武器。 + + + + +```lua +-- 导入 ML 模块 +local ML = require("ML") + +-- 创建一个 QLearner 实例,设置 gamma、alpha 和 maxQ +local qLearner = ML.QLearner(0.5, 0.5, 100.0) + +-- 定义每个条件可能的取值数量(hints) +-- 环境类型:森林(0)、沙漠(1)、雪地(2) => 3 种 +-- 敌人类型:步兵(0)、坦克(1) => 2 种 +local hints = {3, 2} + +-- 定义动作集 +-- 使用手枪(1)、使用火箭筒(2)、使用狙击枪(3) +local actions = {1, 2, 3} + +-- 模拟多次学习迭代 +for episode = 1, 1000 do + -- 随机生成当前环境和敌人类型 + local environment = math.random(0, 2) -- 0: 森林, 1: 沙漠, 2: 雪地 + local enemy = math.random(0, 1) -- 0: 步兵, 1: 坦克 + + -- 使用 pack() 方法将当前条件组合成唯一的状态值 + local stateValues = {environment, enemy} + local state = ML.QLearner:pack(hints, stateValues) + + -- 尝试获取给定状态下的最佳动作 + local action = qLearner:getBestAction(state) + + -- 如果没有最佳动作,随机选择一个动作(探索) + if action == 0 then + action = actions[math.random(#actions)] + else + -- 有一定概率选择随机动作以探索新的策略(ε-贪心策略) + local explorationRate = 0.1 -- 10% 的概率进行探索 + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end + end + + -- 执行动作并根据当前环境和敌人类型获取奖励 + local reward = 0 + if action == 1 then -- 使用手枪 + if enemy == 0 then -- 对付步兵(优势) + reward = 20 + else -- 对付坦克(劣势) + reward = -10 + end + elseif action == 2 then -- 使用火箭筒 + if enemy == 1 then -- 对付坦克(优势) + reward = 30 + else -- 对付步兵(劣势) + reward = 0 + end + elseif action == 3 then -- 使用狙击枪 + if environment == 2 then -- 在雪地环境中(优势) + reward = 25 + else + reward = 10 + end + end + + -- 更新 Q 值 + qLearner:update(state, action, reward) +end + +-- 测试学习结果 +print("学习完成,开始测试...") + +-- 定义测试场景 +local testScenarios = { + {environment = 0, enemy = 0}, -- 森林,对付步兵 + {environment = 1, enemy = 1}, -- 沙漠,对付坦克 + {environment = 2, enemy = 0}, -- 雪地,对付步兵 +} + +for i, scenario in ipairs(testScenarios) do + local stateValues = {scenario.environment, scenario.enemy} + local state = ML.QLearner:pack(hints, stateValues) + local action = qLearner:getBestAction(state) + + -- 显示测试结果 + local envNames = {"森林", "沙漠", "雪地"} + local enemyNames = {"步兵", "坦克"} + local actionNames = {"手枪", "火箭筒", "狙击枪"} + + print(string.format("场景 %d: 环境-%s, 敌人-%s => 建议使用 %s", + i, + envNames[scenario.environment + 1], + enemyNames[scenario.enemy + 1], + actionNames[action])) +end +``` + + + + +```tl +-- 导入 ML 模块 +local ML = require("ML") + +-- 创建一个 QLearner 实例,设置 gamma、alpha 和 maxQ +local qLearner = ML.QLearner(0.5, 0.5, 100.0) + +-- 定义每个条件可能的取值数量(hints) +-- 环境类型:森林(0)、沙漠(1)、雪地(2) => 3 种 +-- 敌人类型:步兵(0)、坦克(1) => 2 种 +local hints = {3, 2} + +-- 定义动作集 +-- 使用手枪(1)、使用火箭筒(2)、使用狙击枪(3) +local actions = {1, 2, 3} + +-- 模拟多次学习迭代 +for episode = 1, 1000 do + -- 随机生成当前环境和敌人类型 + local environment = math.random(0, 2) -- 0: 森林, 1: 沙漠, 2: 雪地 + local enemy = math.random(0, 1) -- 0: 步兵, 1: 坦克 + + -- 使用 pack() 方法将当前条件组合成唯一的状态值 + local stateValues = {environment, enemy} + local state = ML.QLearner:pack(hints, stateValues) + + -- 尝试获取给定状态下的最佳动作 + local action = qLearner:getBestAction(state) + + -- 如果没有最佳动作,随机选择一个动作(探索) + if action == 0 then + action = actions[math.random(#actions)] + else + -- 有一定概率选择随机动作以探索新的策略(ε-贪心策略) + local explorationRate = 0.1 -- 10% 的概率进行探索 + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end + end + + -- 执行动作并根据当前环境和敌人类型获取奖励 + local reward = 0 + if action == 1 then -- 使用手枪 + if enemy == 0 then -- 对付步兵(优势) + reward = 20 + else -- 对付坦克(劣势) + reward = -10 + end + elseif action == 2 then -- 使用火箭筒 + if enemy == 1 then -- 对付坦克(优势) + reward = 30 + else -- 对付步兵(劣势) + reward = 0 + end + elseif action == 3 then -- 使用狙击枪 + if environment == 2 then -- 在雪地环境中(优势) + reward = 25 + else + reward = 10 + end + end + + -- 更新 Q 值 + qLearner:update(state, action, reward) +end + +-- 测试学习结果 +print("学习完成,开始测试...") + +-- 定义测试场景 +local testScenarios = { + {environment = 0, enemy = 0}, -- 森林,对付步兵 + {environment = 1, enemy = 1}, -- 沙漠,对付坦克 + {environment = 2, enemy = 0}, -- 雪地,对付步兵 +} + +for i, scenario in ipairs(testScenarios) do + local stateValues = {scenario.environment, scenario.enemy} + local state = ML.QLearner:pack(hints, stateValues) + local action = qLearner:getBestAction(state) + + -- 显示测试结果 + local envNames = {"森林", "沙漠", "雪地"} + local enemyNames = {"步兵", "坦克"} + local actionNames = {"手枪", "火箭筒", "狙击枪"} + + print(string.format("场景 %d: 环境-%s, 敌人-%s => 建议使用 %s", + i, + envNames[scenario.environment + 1], + enemyNames[scenario.enemy + 1], + actionNames[action])) +end +``` + + + + +```ts +// 导入 ML 模块 +import { ML } from "Dora"; + +// 创建一个 QLearner 实例,设置 gamma、alpha 和 maxQ +const qLearner = ML.QLearner(0.5, 0.5, 100.0); + +// 定义每个条件可能的取值数量(hints) +// 环境类型:森林(0)、沙漠(1)、雪地(2) => 3 种 +// 敌人类型:步兵(0)、坦克(1) => 2 种 +const hints = [3, 2]; + +// 定义动作集 +// 使用手枪(1)、使用火箭筒(2)、使用狙击枪(3) +const actions = [1, 2, 3]; + +// 模拟多次学习迭代 +for (let episode = 1; episode <= 1000; episode++) { + // 随机生成当前环境和敌人类型 + const environment = math.random(0, 2); // 0: 森林, 1: 沙漠, 2: 雪地 + const enemy = math.random(0, 1); // 0: 步兵, 1: 坦克 + + // 使用 pack() 方法将当前条件组合成唯一的状态值 + const stateValues = [environment, enemy]; + const state = ML.QLearner.pack(hints, stateValues); + + // 尝试获取给定状态下的最佳动作 + let action = qLearner.getBestAction(state); + + // 如果没有最佳动作,随机选择一个动作(探索) + if (action === 0) { + action = actions[math.random(actions.length) - 1]; + } else { + // 有一定概率选择随机动作以探索新的策略(ε-贪心策略) + const explorationRate = 0.1; // 10% 的概率进行探索 + if (math.random() < explorationRate) { + action = actions[math.random(actions.length) - 1]; + } + } + + // 执行动作并根据当前环境和敌人类型获取奖励 + let reward = 0; + if (action === 1) { // 使用手枪 + if (enemy === 0) { // 对付步兵(优势) + reward = 20; + } else { // 对付坦克(劣势) + reward = -10; + } + } else if (action === 2) { // 使用火箭筒 + if (enemy === 1) { // 对付坦克(优势) + reward = 30; + } else { // 对付步兵(劣势) + reward = 0; + } + } else if (action === 3) { // 使用狙击枪 + if (environment === 2) { // 在雪地环境中(优势) + reward = 25; + } else { + reward = 10; + } + } + + // 更新 Q 值 + qLearner.update(state, action, reward); +} + +// 测试学习结果 +print("学习完成,开始测试..."); + +// 定义测试场景 +const testScenarios = [ + { environment: 0, enemy: 0 }, // 森林,对付步兵 + { environment: 1, enemy: 1 }, // 沙漠,对付坦克 + { environment: 2, enemy: 0 }, // 雪地,对付步兵 +]; + +for (let i = 0; i < testScenarios.length; i++) { + const scenario = testScenarios[i]; + const stateValues = [scenario.environment, scenario.enemy]; + const state = ML.QLearner.pack(hints, stateValues); + const action = qLearner.getBestAction(state); + + // 显示测试结果 + const envNames = ["森林", "沙漠", "雪地"]; + const enemyNames = ["步兵", "坦克"]; + const actionNames = ["手枪", "火箭筒", "狙击枪"]; + + print(string.format("场景 %d: 环境-%s, 敌人-%s => 建议使用 %s", + i + 1, + envNames[scenario.environment], + enemyNames[scenario.enemy], + actionNames[action - 1])); +} +``` + + + + +```yue +-- 导入 ML 模块 +_ENV = Dora + +-- 创建一个 QLearner 实例,设置 gamma、alpha 和 maxQ +qLearner = ML.QLearner 0.5, 0.5, 100.0 + +-- 定义每个条件可能的取值数量(hints) +-- 环境类型:森林(0)、沙漠(1)、雪地(2) => 3 种 +-- 敌人类型:步兵(0)、坦克(1) => 2 种 +hints = [3, 2] + +-- 定义动作集 +-- 使用手枪(1)、使用火箭筒(2)、使用狙击枪(3) +actions = [1, 2, 3] + +-- 模拟多次学习迭代 +for episode = 1, 1000 + -- 随机生成当前环境和敌人类型 + environment = math.random 0, 2 -- 0: 森林, 1: 沙漠, 2: 雪地 + enemy = math.random 0, 1 -- 0: 步兵, 1: 坦克 + + -- 使用 pack() 方法将当前条件组合成唯一的状态值 + stateValues = [environment, enemy] + state = ML.QLearner\pack hints, stateValues + + -- 尝试获取给定状态下的最佳动作 + action = qLearner\getBestAction state + + -- 如果没有最佳动作,随机选择一个动作(探索) + if action == 0 + action = actions[math.random #actions] + else + -- 有一定概率选择随机动作以探索新的策略(ε-贪心策略) + explorationRate = 0.1 -- 10% 的概率进行探索 + if math.random! < explorationRate + action = actions[math.random #actions] + + -- 执行动作并根据当前环境和敌人类型获取奖励 + reward = 0 + reward = switch action + when 1 -- 使用手枪 + if enemy == 0 -- 对付步兵(优势) + 20 + else -- 对付坦克(劣势) + -10 + when 2 -- 使用火箭筒 + if enemy == 1 -- 对付坦克(优势) + 30 + else -- 对付步兵(劣势) + 0 + when 3 -- 使用狙击枪 + if environment == 2 -- 在雪地环境中(优势) + 25 + else + 10 + + -- 更新 Q 值 + qLearner\update state, action, reward + +-- 测试学习结果 +print "学习完成,开始测试..." + +testScenarios = + * environment: 0 -- 森林,对付步兵 + enemy: 0 + * environment: 1 -- 沙漠,对付坦克 + enemy: 1 + * environment: 2 -- 雪地,对付步兵 + enemy: 0 + +for i, scenario in ipairs testScenarios + stateValues = [scenario.environment, scenario.enemy] + state = ML.QLearner\pack hints, stateValues + action = qLearner\getBestAction state + + -- 显示测试结果 + envNames = ["森林", "沙漠", "雪地"] + enemyNames = ["步兵", "坦克"] + actionNames = ["手枪", "火箭筒", "狙击枪"] + + print string.format "场景 %d: 环境-%s, 敌人-%s => 建议使用 %s", + i, + envNames[scenario.environment + 1], + enemyNames[scenario.enemy + 1], + actionNames[action] +``` + + + + +### 5.1 代码详解 + +#### 1. 导入模块并创建 QLearner 实例 + + + + +```lua +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) +``` + + + + +```tl +local ML = require("ML") +local qLearner = ML.QLearner(0.5, 0.5, 100.0) +``` + + + + +```ts +import { ML } from "Dora"; +const qLearner = ML.QLearner(0.5, 0.5, 100.0); +``` + + + + +```yue +_ENV = Dora +qLearner = ML.QLearner 0.5, 0.5, 100.0 +``` + + + + +  创建一个 QLearner 实例,设置 gamma、alpha 和 maxQ。 + +- **gamma**:折扣因子,影响未来奖励的权重。 +- **alpha**:学习率,决定新信息对 Q 值更新的影响程度。 +- **maxQ**:Q 值的最大限制,防止 Q 值无限增长。 + +#### 2. 定义状态特征和动作集 + + + + +```lua +local hints = {3, 2} +local actions = {1, 2, 3} +``` + + + + +```tl +local hints = [3, 2] +local actions = [1, 2, 3] +``` + + + + +```ts +const hints = [3, 2]; +const actions = [1, 2, 3]; +``` + + + + +```yue +hints = [3, 2] +actions = [1, 2, 3] +``` + + + + +  定义每个条件可能的取值数量(hints),以及动作集。注意动作的编号最小从 1 开始。 + +#### 3. 进行学习迭代 + + + + +```lua +for episode = 1, 1000 do + -- 学习过程 +end +``` + + + + +```tl +for episode = 1, 1000 do + -- 学习过程 +end +``` + + + + +```ts +for (let episode = 1; episode <= 1000; episode++) { + // 学习过程 +} +``` + + + + +```yue +for episode = 1, 1000 + -- 学习过程 +``` + + + + +  通过循环模拟多个回合,让智能体在不同的状态下学习。注意这里的回合数可以设置为 1000 次,也可以根据实际情况调整,越多的回合数可以让智能体学习到更多的经验。 + +#### 4. 随机生成环境和敌人类型 + + + + +```lua +local environment = math.random(0, 2) +local enemy = math.random(0, 1) +``` + + + + +```tl +local environment = math.random 0, 2 +local enemy = math.random 0, 1 +``` + + + + +```ts +const environment = math.random(0, 2); +const enemy = math.random(0, 1); +``` + + + + +```yue +environment = math.random 0, 2 +enemy = math.random 0, 1 +``` + + + + +  模拟不同的游戏场景,环境类型和敌人类型都是随机生成的,这样可以模拟出更多的场景,让智能体学习到更多的经验。当然你也可以考虑修改代码直接枚举所有可能的场景,这样可以让智能体学习到最优解的策略。但是当你的游戏场景条件的组合空间很大时,直接枚举所有的场景组合可能是不现实的。Dora SSR 提供的 QLearner 模块可以支持的场景组合空间受到 `pack` 方法的实现所限制,理论上可以支持的场景组合空间大小为 `2^64` 种(因为会将条件编码为 64 位整数的状态)。实际可能很难达到这个上限,但是当条件组合空间很大时,直接枚举所有场景组合的计算量会非常大。 + +#### 5. 使用 pack() 方法构建状态值 + + + + +```lua +local stateValues = {environment, enemy} +local state = ML.QLearner:pack(hints, stateValues) +``` + + + + +```tl +local stateValues = [environment, enemy] +local state = ML.QLearner\pack hints, stateValues +``` + + + + +```ts +const stateValues = [environment, enemy]; +const state = ML.QLearner.pack(hints, stateValues); +``` + + + + +```yue +stateValues = [environment, enemy] +state = ML.QLearner\pack hints, stateValues +``` + + + + +  将当前回合随机得到的多个条件组合成唯一的状态整数,便于在 Q 表中存储和检索。 + +#### 6. 选择动作 + + + + +```lua +local action = qLearner:getBestAction(state) +if action == 0 then + action = actions[math.random(#actions)] +else + local explorationRate = 0.1 + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end +end +``` + + + + +```tl +local action = qLearner:getBestAction(state) +if action == 0 then + action = actions[math.random(#actions)] +else + local explorationRate = 0.1 + if math.random() < explorationRate then + action = actions[math.random(#actions)] + end +end +``` + + + + +```ts +if (action === 0) { + action = actions[math.random(actions.length) - 1]; +} else { + const explorationRate = 0.1; + if (math.random() < explorationRate) { + action = actions[math.random(actions.length) - 1]; + } +} +``` + + + + +```yue +action = qLearner\getBestAction state +if action == 0 + action = actions[math.random #actions] +else + explorationRate = 0.1 + if math.random! < explorationRate + action = actions[math.random #actions] +``` + + + + +  使用 `getBestAction(state)` 方法获取当前状态下已知的最佳动作,并使用 `ε-贪心策略`,有一定概率选择随机动作进行探索。`ε-贪心策略` 是强化学习中常用的一种策略,用于在探索和利用之间找到平衡,可以防止智能体过早收敛到局部最优解,从而可能得到更好的训练表现。 + +#### 7. 执行动作并获取奖励 + + + + +```lua +local reward = 0 +if action == 1 then + -- 根据动作和当前状态,计算奖励值 +end +``` + + + + +```tl +local reward = 0 +if action == 1 then + -- 根据动作和当前状态,计算奖励值 +end +``` + + + + +```ts +let reward = 0; +if (action === 1) { + // 根据动作和当前状态,计算奖励值 +} +``` + + + + +```yue +reward = 0 +reward = switch action + when 1 -- 使用手枪 + -- 根据动作和当前状态,计算奖励值 +``` + + + + +  奖励的设定根据游戏逻辑,可以调整。在实际的游戏中,奖励的计算可能还需要再等待一系列动作的执行后再判断结果,不会像这里这么简单。 + +#### 8. 更新 Q 值 + + + + +```lua +qLearner:update(state, action, reward) +``` + + + + +```tl +qLearner:update(state, action, reward); +``` + + + + +```ts +qLearner.update(state, action, reward); +``` + + + + +```yue +qLearner\update state, action, reward +``` + + + + +  使用获得的奖励更新 Q 值,优化策略,让智能体在不同的状态下选择最佳的动作。并完成本回合的迭代训练。 + +#### 9. 测试学习结果 + + + + +```lua +for i, scenario in ipairs(testScenarios) do + -- 测试不同的场景,查看智能体的决策 +end +``` + + + + +```tl +for i, scenario in ipairs testScenarios do + -- 测试不同的场景,查看智能体的决策 +end +``` + + + + +```ts +for (let i = 0; i < testScenarios.length; i++) { + // 测试不同的场景,查看智能体的决策 +} +``` + + + + +```yue +for i, scenario in ipairs testScenarios + -- 测试不同的场景,查看智能体的决策 +``` + + + + +  进行测试,并输出智能体在不同场景下的决策。注意因为这里是随机生成的场景,所以智能体的决策因为随机到的场景不同,可能并不能得到最佳的训练决策的结果。 + +### 5.2 运行结果示例 + +``` +学习完成,开始测试... +场景 1: 环境-森林, 敌人-步兵 => 建议使用 手枪 +场景 2: 环境-沙漠, 敌人-坦克 => 建议使用 火箭筒 +场景 3: 环境-雪地, 敌人-步兵 => 建议使用 狙击枪 +``` + +## 6. 总结 + +  通过上述完整的代码示例,我们实现了以下目标: + +- **使用 QLearner:pack() 方法**:将多个条件组合成唯一的状态值,便于在 Q 表中存储和检索。 +- **构建了强化学习循环**:让智能体在不同的状态下尝试动作、获取奖励、更新策略。 +- **实现了 ε-贪心策略**:在利用已知最佳策略的同时,保持一定的探索新策略的能力。 +- **测试了学习效果**:通过预设的测试场景,验证智能体是否学会了选择最佳动作。 + +  希望这个示例能帮助您更深入地理解如何在 Dora SSR 引擎中使用 Q-Learning 算法来开发游戏玩法。如有任何疑问,欢迎到我们的社区一起来探讨! diff --git a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/30.setup-scene.mdx b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/30.setup-scene.mdx index e386db634..dd803d7ee 100644 --- a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/30.setup-scene.mdx +++ b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/30.setup-scene.mdx @@ -10,7 +10,7 @@ import TabItem from '@theme/TabItem'; ```mermaid graph TD - A[根节点\nDirector.entry] --> B[子节点1] + A[根节点
Director.entry] --> B[子节点1] A --> C[子节点2] B --> D[子节点1.1] B --> E[子节点1.2] diff --git a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/51.Using Input/2.using-enhanced-input.mdx b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/51.Using Input/2.using-enhanced-input.mdx index 369418759..301575125 100644 --- a/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/51.Using Input/2.using-enhanced-input.mdx +++ b/Docs/i18n/zh-Hans/docusaurus-plugin-content-docs/current/tutorial/51.Using Input/2.using-enhanced-input.mdx @@ -58,9 +58,9 @@ import TabItem from '@theme/TabItem'; ```mermaid graph TD - A[一个输入上下文\n(Input Context)] -->|包含多个动作定义| B[动作定义\n(Action)] + A[一个输入上下文
(Input Context)] -->|包含多个动作定义| B[动作定义
(Action)] A --> F[上下文的名称] - B -->|包含以树形结构嵌套的触发器| C[触发器\n(Trigger)] + B -->|包含以树形结构嵌套的触发器| C[触发器
(Trigger)] B --> G[动作的名称] C -->|描述多种触发事件源| D[按键、手柄、轴等] C -->|发送包含当前输入状态的全局事件| E[Ongoing、Completed、Canceled] @@ -72,8 +72,8 @@ graph TD ```mermaid graph TD - A[Sequence\n检测序列] -->|持续按下| B[KeyHold\n按键 LCtrl] - A -->|并按下| C[KeyDown\n按键 C] + A[Sequence
检测序列] -->|持续按下| B[KeyHold
按键 LCtrl] + A -->|并按下| C[KeyDown
按键 C] ```   对应的触发器代码定义: @@ -125,8 +125,8 @@ Trigger.Sequence [ ```mermaid graph TD - A[Selector\n选择器] -->|长按| B[KeyHold\n按键 Return] - A -->|或长按| C[ButtonHold\n按钮 A] + A[Selector
选择器] -->|长按| B[KeyHold
按键 Return] + A -->|或长按| C[ButtonHold
按钮 A] ```   对应的触发器代码定义: diff --git a/Docs/package.json b/Docs/package.json index 6354b2bda..dd6a7aea7 100644 --- a/Docs/package.json +++ b/Docs/package.json @@ -15,13 +15,13 @@ "typecheck": "tsc" }, "dependencies": { - "@docusaurus/core": "^3.5.2", - "@docusaurus/preset-classic": "^3.5.2", - "@docusaurus/theme-mermaid": "^3.5.2", - "@easyops-cn/docusaurus-search-local": "^0.44.4", - "@mdx-js/react": "^3.0.0", + "@docusaurus/core": "^3.6.0", + "@docusaurus/preset-classic": "^3.6.0", + "@docusaurus/theme-mermaid": "^3.6.0", + "@easyops-cn/docusaurus-search-local": "^0.45.0", + "@mdx-js/react": "^3.1.0", "clsx": "^2.1.1", - "prism-react-renderer": "^2.3.1", + "prism-react-renderer": "^2.4.0", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/Docs/yarn.lock b/Docs/yarn.lock index 8c577cc50..20d0f7f90 100644 --- a/Docs/yarn.lock +++ b/Docs/yarn.lock @@ -163,6 +163,19 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" +"@antfu/install-pkg@^0.4.0": + version "0.4.1" + resolved "https://registry.npmmirror.com/@antfu/install-pkg/-/install-pkg-0.4.1.tgz#d1d7f3be96ecdb41581629cafe8626d1748c0cf1" + integrity sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw== + dependencies: + package-manager-detector "^0.2.0" + tinyexec "^0.3.0" + +"@antfu/utils@^0.7.10": + version "0.7.10" + resolved "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz#ae829f170158e297a9b6a28f161a8e487d00814d" + integrity sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.25.7", "@babel/code-frame@^7.8.3": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7" @@ -171,11 +184,25 @@ "@babel/highlight" "^7.25.7" picocolors "^1.0.0" +"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": + version "7.26.2" + resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7", "@babel/compat-data@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.25.8.tgz#0376e83df5ab0eb0da18885c0140041f0747a402" integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA== +"@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": + version "7.26.2" + resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" + integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + "@babel/core@^7.21.3", "@babel/core@^7.23.3": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/core/-/core-7.25.8.tgz#a57137d2a51bbcffcfaeba43cb4dd33ae3e0e1c6" @@ -197,6 +224,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.25.9": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.23.3", "@babel/generator@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56" @@ -207,6 +255,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" +"@babel/generator@^7.25.9", "@babel/generator@^7.26.0": + version "7.26.2" + resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" + integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== + dependencies: + "@babel/parser" "^7.26.2" + "@babel/types" "^7.26.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972" @@ -214,6 +273,13 @@ dependencies: "@babel/types" "^7.25.7" +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== + dependencies: + "@babel/types" "^7.25.9" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz#d721650c1f595371e0a23ee816f1c3c488c0d622" @@ -222,6 +288,14 @@ "@babel/traverse" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" + integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4" @@ -233,6 +307,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b" @@ -246,6 +331,19 @@ "@babel/traverse" "^7.25.7" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83" + integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.25.9" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz#dcb464f0e2cdfe0c25cc2a0a59c37ab940ce894e" @@ -255,6 +353,15 @@ regexpu-core "^6.1.1" semver "^6.3.1" +"@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" + integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.1.1" + semver "^6.3.1" + "@babel/helper-define-polyfill-provider@^0.6.2": version "0.6.2" resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" @@ -274,6 +381,14 @@ "@babel/traverse" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-imports@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472" @@ -282,6 +397,14 @@ "@babel/traverse" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-module-transforms@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a" @@ -292,6 +415,15 @@ "@babel/helper-validator-identifier" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-optimise-call-expression@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a" @@ -299,11 +431,23 @@ dependencies: "@babel/types" "^7.25.7" +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c" integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw== +"@babel/helper-plugin-utils@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + "@babel/helper-remap-async-to-generator@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz#9efdc39df5f489bcd15533c912b6c723a0a65021" @@ -313,6 +457,15 @@ "@babel/helper-wrap-function" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-replace-supers@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5" @@ -322,6 +475,15 @@ "@babel/helper-optimise-call-expression" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/helper-replace-supers@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5" + integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/helper-simple-access@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0" @@ -330,6 +492,14 @@ "@babel/traverse" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/helper-simple-access@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" + integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c" @@ -338,21 +508,44 @@ "@babel/traverse" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helper-string-parser@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54" integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5" integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729" integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ== +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + "@babel/helper-wrap-function@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz#9f6021dd1c4fdf4ad515c809967fc4bac9a70fe7" @@ -362,6 +555,15 @@ "@babel/traverse" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/helpers@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.25.7.tgz#091b52cb697a171fe0136ab62e54e407211f09c2" @@ -370,6 +572,14 @@ "@babel/template" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + "@babel/highlight@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5" @@ -387,6 +597,13 @@ dependencies: "@babel/types" "^7.25.8" +"@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": + version "7.26.2" + resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" + integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== + dependencies: + "@babel/types" "^7.26.0" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz#93969ac50ef4d68b2504b01b758af714e4cbdd64" @@ -395,6 +612,14 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz#a338d611adb9dcd599b8b1efa200c88ebeffe046" @@ -402,6 +627,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz#c5f755e911dfac7ef6957300c0f9c4a8c18c06f4" @@ -409,6 +641,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz#3b7ea04492ded990978b6deaa1dfca120ad4455a" @@ -418,6 +657,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" "@babel/plugin-transform-optional-chaining" "^7.25.7" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz#9622b1d597a703aa3a921e6f58c9c2d9a028d2c5" @@ -426,6 +674,14 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" @@ -445,6 +701,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-import-attributes@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz#d78dd0499d30df19a598e63ab895e21b909bc43f" @@ -452,6 +715,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165" @@ -459,6 +729,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-syntax-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-typescript@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b" @@ -466,6 +743,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-syntax-typescript@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -481,6 +765,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-async-generator-functions@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz#3331de02f52cc1f2c75b396bec52188c85b0b1ec" @@ -490,6 +781,15 @@ "@babel/helper-remap-async-to-generator" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/plugin-transform-async-generator-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2" + integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/plugin-transform-async-to-generator@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52" @@ -499,6 +799,15 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/helper-remap-async-to-generator" "^7.25.7" +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz#e0b8843d5571719a2f1bf7e284117a3379fcc17c" @@ -506,6 +815,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-block-scoped-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458" + integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-block-scoping@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a" @@ -513,6 +829,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1" + integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-class-properties@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz#a389cfca7a10ac80e3ff4c75fca08bd097ad1523" @@ -521,6 +844,14 @@ "@babel/helper-create-class-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-class-static-block@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz#a8af22028920fe404668031eceb4c3aadccb5262" @@ -529,6 +860,14 @@ "@babel/helper-create-class-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-classes@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz#5103206cf80d02283bbbd044509ea3b65d0906bb" @@ -541,6 +880,18 @@ "@babel/traverse" "^7.25.7" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz#7f621f0aa1354b5348a935ab12e3903842466f65" @@ -549,6 +900,14 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/template" "^7.25.7" +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/plugin-transform-destructuring@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz#f6f26a9feefb5aa41fd45b6f5838901b5333d560" @@ -556,6 +915,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-dotall-regex@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz#9d775c4a3ff1aea64045300fcd4309b4a610ef02" @@ -564,6 +930,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-duplicate-keys@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz#fbba7d1155eab76bd4f2a038cbd5d65883bd7a93" @@ -571,6 +945,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz#102b31608dcc22c08fbca1894e104686029dc141" @@ -579,6 +960,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-dynamic-import@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz#f1edbe75b248cf44c70c8ca8ed3818a668753aaa" @@ -586,6 +975,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz#5961a3a23a398faccd6cddb34a2182807d75fb5f" @@ -594,6 +990,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-exponentiation-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" + integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-export-namespace-from@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz#d1988c3019a380b417e0516418b02804d3858145" @@ -601,6 +1005,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-for-of@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz#0acfea0f27aa290818b5b48a5a44b3f03fc13669" @@ -609,6 +1020,14 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" +"@babel/plugin-transform-for-of@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755" + integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-function-name@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz#7e394ccea3693902a8b50ded8b6ae1fa7b8519fd" @@ -618,6 +1037,15 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/plugin-transform-json-strings@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz#6fb3ec383a2ea92652289fdba653e3f9de722694" @@ -625,6 +1053,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-literals@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz#70cbdc742f2cfdb1a63ea2cbd018d12a60b213c3" @@ -632,6 +1067,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz#01868ff92daa9e525b4c7902aa51979082a05710" @@ -639,6 +1081,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-member-expression-literals@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz#0a36c3fbd450cc9e6485c507f005fa3d1bc8fca5" @@ -646,6 +1095,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-modules-amd@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz#bb4e543b5611f6c8c685a2fd485408713a3adf3d" @@ -654,6 +1110,14 @@ "@babel/helper-module-transforms" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-modules-commonjs@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd" @@ -663,6 +1127,15 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/helper-simple-access" "^7.25.7" +"@babel/plugin-transform-modules-commonjs@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" + integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-simple-access" "^7.25.9" + "@babel/plugin-transform-modules-systemjs@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz#8b14d319a177cc9c85ef8b0512afd429d9e2e60b" @@ -673,6 +1146,16 @@ "@babel/helper-validator-identifier" "^7.25.7" "@babel/traverse" "^7.25.7" +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/plugin-transform-modules-umd@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz#00ee7a7e124289549381bfb0e24d87fd7f848367" @@ -681,6 +1164,14 @@ "@babel/helper-module-transforms" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz#a2f3f6d7f38693b462542951748f0a72a34d196d" @@ -689,6 +1180,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-new-target@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz#52b2bde523b76c548749f38dc3054f1f45e82bc9" @@ -696,6 +1195,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz#befb4900c130bd52fccf2b926314557987f1b552" @@ -703,6 +1209,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949" + integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-numeric-separator@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz#91e370486371637bd42161052f2602c701386891" @@ -710,6 +1223,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-object-rest-spread@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz#0904ac16bcce41df4db12d915d6780f85c7fb04b" @@ -719,6 +1239,15 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/plugin-transform-parameters" "^7.25.7" +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-object-super@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz#582a9cea8cf0a1e02732be5b5a703a38dedf5661" @@ -727,6 +1256,14 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/helper-replace-supers" "^7.25.7" +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz#2649b86a3bb202c6894ec81a6ddf41b94d8f3103" @@ -734,6 +1271,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-optional-chaining@^7.25.7", "@babel/plugin-transform-optional-chaining@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz#f46283b78adcc5b6ab988a952f989e7dce70653f" @@ -742,6 +1286,14 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-parameters@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz#80c38b03ef580f6d6bffe1c5254bb35986859ac7" @@ -749,6 +1301,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-private-methods@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz#c790a04f837b4bd61d6b0317b43aa11ff67dce80" @@ -757,6 +1316,14 @@ "@babel/helper-create-class-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-private-property-in-object@^7.25.8": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz#1234f856ce85e061f9688764194e51ea7577c434" @@ -766,6 +1333,15 @@ "@babel/helper-create-class-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-property-literals@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz#a8612b4ea4e10430f00012ecf0155662c7d6550d" @@ -773,6 +1349,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-react-constant-elements@^7.21.3": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.7.tgz#b7f18dcdfac137a635a3f1242ea7c931df82a666" @@ -787,6 +1370,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-react-display-name@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d" + integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-react-jsx-development@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz#2fbd77887b8fa2942d7cb61edf1029ea1b048554" @@ -794,6 +1384,13 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.25.7" +"@babel/plugin-transform-react-jsx-development@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7" + integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz#f5e2af6020a562fe048dd343e571c4428e6c5632" @@ -805,6 +1402,17 @@ "@babel/plugin-syntax-jsx" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz#6d0b8dadb2d3c5cbb8ade68c5efd49470b0d65f7" @@ -813,6 +1421,14 @@ "@babel/helper-annotate-as-pure" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-react-pure-annotations@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62" + integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-regenerator@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz#6eb006e6d26f627bc2f7844a9f19770721ad6f3e" @@ -821,6 +1437,22 @@ "@babel/helper-plugin-utils" "^7.25.7" regenerator-transform "^0.15.2" +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b" + integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-reserved-words@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz#dc56b25e02afaabef3ce0c5b06b0916e8523e995" @@ -828,6 +1460,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-runtime@^7.22.9": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz#435a4fab67273f00047dc806e05069c9c6344e12" @@ -840,6 +1479,18 @@ babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" +"@babel/plugin-transform-runtime@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea" + integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + semver "^6.3.1" + "@babel/plugin-transform-shorthand-properties@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz#92690a9c671915602d91533c278cc8f6bf12275f" @@ -847,6 +1498,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-spread@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz#df83e899a9fc66284ee601a7b738568435b92998" @@ -855,6 +1513,14 @@ "@babel/helper-plugin-utils" "^7.25.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-sticky-regex@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz#341c7002bef7f29037be7fb9684e374442dd0d17" @@ -862,6 +1528,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-template-literals@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz#e566c581bb16d8541dd8701093bb3457adfce16b" @@ -869,6 +1542,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-template-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1" + integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-typeof-symbol@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz#debb1287182efd20488f126be343328c679b66eb" @@ -876,6 +1556,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-typeof-symbol@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b" + integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-typescript@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz#8fc7c3d28ddd36bce45b9b48594129d0e560cfbe" @@ -887,6 +1574,17 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7" "@babel/plugin-syntax-typescript" "^7.25.7" +"@babel/plugin-transform-typescript@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849" + integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-syntax-typescript" "^7.25.9" + "@babel/plugin-transform-unicode-escapes@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz#973592b6d13a914794e1de8cf1383e50e0f87f81" @@ -894,6 +1592,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz#25349197cce964b1343f74fa7cfdf791a1b1919e" @@ -902,6 +1607,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-unicode-regex@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz#f93a93441baf61f713b6d5552aaa856bfab34809" @@ -910,6 +1623,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz#d1b3295d29e0f8f4df76abc909ad1ebee919560c" @@ -918,6 +1639,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.7" "@babel/helper-plugin-utils" "^7.25.7" +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.22.9": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.25.8.tgz#dc6b719627fb29cd9cccbbbe041802fd575b524c" @@ -992,6 +1721,81 @@ core-js-compat "^3.38.1" semver "^6.3.1" +"@babel/preset-env@^7.25.9": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1" + integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw== + dependencies: + "@babel/compat-data" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.25.9" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.25.9" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.25.9" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.25.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.25.9" + "@babel/plugin-transform-typeof-symbol" "^7.25.9" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.10.6" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.38.1" + semver "^6.3.1" + "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" @@ -1013,6 +1817,18 @@ "@babel/plugin-transform-react-jsx-development" "^7.25.7" "@babel/plugin-transform-react-pure-annotations" "^7.25.7" +"@babel/preset-react@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e" + integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-transform-react-display-name" "^7.25.9" + "@babel/plugin-transform-react-jsx" "^7.25.9" + "@babel/plugin-transform-react-jsx-development" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations" "^7.25.9" + "@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.22.5": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz#43c5b68eccb856ae5b52274b77b1c3c413cde1b7" @@ -1024,6 +1840,17 @@ "@babel/plugin-transform-modules-commonjs" "^7.25.7" "@babel/plugin-transform-typescript" "^7.25.7" +"@babel/preset-typescript@^7.25.9": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d" + integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.25.9" + "@babel/plugin-transform-typescript" "^7.25.9" + "@babel/runtime-corejs3@^7.22.6": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.25.7.tgz#29ca319b1272e9d78faa3f7ee891d0af63c53aa2" @@ -1032,6 +1859,14 @@ core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" +"@babel/runtime-corejs3@^7.25.9": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz#5af6bed16073eb4a0191233d61e158a5c768c430" + integrity sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w== + dependencies: + core-js-pure "^3.30.2" + regenerator-runtime "^0.14.0" + "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" @@ -1039,6 +1874,13 @@ dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.25.9": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + "@babel/template@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769" @@ -1048,6 +1890,15 @@ "@babel/parser" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/traverse@^7.22.8", "@babel/traverse@^7.25.7": version "7.25.7" resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8" @@ -1061,6 +1912,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.25.9": + version "7.25.9" + resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" + integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/generator" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/template" "^7.25.9" + "@babel/types" "^7.25.9" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.21.3", "@babel/types@^7.25.7", "@babel/types@^7.25.8", "@babel/types@^7.4.4": version "7.25.8" resolved "https://registry.npmmirror.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1" @@ -1070,10 +1934,50 @@ "@babel/helper-validator-identifier" "^7.25.7" to-fast-properties "^2.0.0" -"@braintree/sanitize-url@^6.0.1": - version "6.0.4" - resolved "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" - integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== +"@babel/types@^7.25.9", "@babel/types@^7.26.0": + version "7.26.0" + resolved "https://registry.npmmirror.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" + integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@braintree/sanitize-url@^7.0.1": + version "7.1.0" + resolved "https://registry.npmmirror.com/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz#048e48aab4f1460e3121e22aa62459d16653dc85" + integrity sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg== + +"@chevrotain/cst-dts-gen@11.0.3": + version "11.0.3" + resolved "https://registry.npmmirror.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz#5e0863cc57dc45e204ccfee6303225d15d9d4783" + integrity sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ== + dependencies: + "@chevrotain/gast" "11.0.3" + "@chevrotain/types" "11.0.3" + lodash-es "4.17.21" + +"@chevrotain/gast@11.0.3": + version "11.0.3" + resolved "https://registry.npmmirror.com/@chevrotain/gast/-/gast-11.0.3.tgz#e84d8880323fe8cbe792ef69ce3ffd43a936e818" + integrity sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q== + dependencies: + "@chevrotain/types" "11.0.3" + lodash-es "4.17.21" + +"@chevrotain/regexp-to-ast@11.0.3": + version "11.0.3" + resolved "https://registry.npmmirror.com/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz#11429a81c74a8e6a829271ce02fc66166d56dcdb" + integrity sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA== + +"@chevrotain/types@11.0.3": + version "11.0.3" + resolved "https://registry.npmmirror.com/@chevrotain/types/-/types-11.0.3.tgz#f8a03914f7b937f594f56eb89312b3b8f1c91848" + integrity sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ== + +"@chevrotain/utils@11.0.3": + version "11.0.3" + resolved "https://registry.npmmirror.com/@chevrotain/utils/-/utils-11.0.3.tgz#e39999307b102cff3645ec4f5b3665f5297a2224" + integrity sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ== "@colors/colors@1.5.0": version "1.5.0" @@ -1100,28 +2004,80 @@ "@docsearch/css" "3.6.2" algoliasearch "^4.19.1" -"@docusaurus/core@3.5.2", "@docusaurus/core@^3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/core/-/core-3.5.2.tgz#3adedb90e7b6104592f1231043bd6bf91680c39c" - integrity sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w== +"@docusaurus/babel@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/babel/-/babel-3.6.0.tgz#735a003207925bd782dd08ffa5d8b3503c1f8d72" + integrity sha512-7CsoQFiadoq7AHSUIQNkI/lGfg9AQ2ZBzsf9BqfZGXkHwWDy6twuohEaG0PgQv1npSRSAB2dioVxhRSErnqKNA== dependencies: - "@babel/core" "^7.23.3" - "@babel/generator" "^7.23.3" + "@babel/core" "^7.25.9" + "@babel/generator" "^7.25.9" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.22.9" - "@babel/preset-env" "^7.22.9" - "@babel/preset-react" "^7.22.5" - "@babel/preset-typescript" "^7.22.5" - "@babel/runtime" "^7.22.6" - "@babel/runtime-corejs3" "^7.22.6" - "@babel/traverse" "^7.22.8" - "@docusaurus/cssnano-preset" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" - autoprefixer "^10.4.14" + "@babel/plugin-transform-runtime" "^7.25.9" + "@babel/preset-env" "^7.25.9" + "@babel/preset-react" "^7.25.9" + "@babel/preset-typescript" "^7.25.9" + "@babel/runtime" "^7.25.9" + "@babel/runtime-corejs3" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@docusaurus/logger" "3.6.0" + "@docusaurus/utils" "3.6.0" + babel-plugin-dynamic-import-node "^2.3.3" + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/bundler@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/bundler/-/bundler-3.6.0.tgz#bdd060ba4d009211348e4e973a3bf4861cf0996b" + integrity sha512-o5T9HXkPKH0OQAifTxEXaebcO8kaz3tU1+wlIShZ2DKJHlsyWX3N4rToWBHroWnV/ZCT2XN3kLRzXASqrnb9Tw== + dependencies: + "@babel/core" "^7.25.9" + "@docusaurus/babel" "3.6.0" + "@docusaurus/cssnano-preset" "3.6.0" + "@docusaurus/logger" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils" "3.6.0" + autoprefixer "^10.4.14" + babel-loader "^9.2.1" + clean-css "^5.3.2" + copy-webpack-plugin "^11.0.0" + css-loader "^6.8.1" + css-minimizer-webpack-plugin "^5.0.1" + cssnano "^6.1.2" + file-loader "^6.2.0" + html-minifier-terser "^7.2.0" + mini-css-extract-plugin "^2.9.1" + null-loader "^4.0.1" + postcss "^8.4.26" + postcss-loader "^7.3.3" + react-dev-utils "^12.0.1" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + url-loader "^4.1.1" + webpack "^5.95.0" + webpackbar "^6.0.1" + +"@docusaurus/core@3.5.2": + version "3.5.2" + resolved "https://registry.npmmirror.com/@docusaurus/core/-/core-3.5.2.tgz#3adedb90e7b6104592f1231043bd6bf91680c39c" + integrity sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w== + dependencies: + "@babel/core" "^7.23.3" + "@babel/generator" "^7.23.3" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-runtime" "^7.22.9" + "@babel/preset-env" "^7.22.9" + "@babel/preset-react" "^7.22.5" + "@babel/preset-typescript" "^7.22.5" + "@babel/runtime" "^7.22.6" + "@babel/runtime-corejs3" "^7.22.6" + "@babel/traverse" "^7.22.8" + "@docusaurus/cssnano-preset" "3.5.2" + "@docusaurus/logger" "3.5.2" + "@docusaurus/mdx-loader" "3.5.2" + "@docusaurus/utils" "3.5.2" + "@docusaurus/utils-common" "3.5.2" + "@docusaurus/utils-validation" "3.5.2" + autoprefixer "^10.4.14" babel-loader "^9.1.3" babel-plugin-dynamic-import-node "^2.3.3" boxen "^6.2.1" @@ -1174,6 +2130,55 @@ webpack-merge "^5.9.0" webpackbar "^5.0.2" +"@docusaurus/core@3.6.0", "@docusaurus/core@^3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/core/-/core-3.6.0.tgz#b23fc7e253a49cc3e5ac9e091354f497cc0b101b" + integrity sha512-lvRgMoKJJSRDt9+HhAqFcICV4kp/mw1cJJrLxIw4Q2XZnFGM1XUuwcbuaqWmGog+NcOLZaPCcCtZbn60EMCtjQ== + dependencies: + "@docusaurus/babel" "3.6.0" + "@docusaurus/bundler" "3.6.0" + "@docusaurus/logger" "3.6.0" + "@docusaurus/mdx-loader" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" + boxen "^6.2.1" + chalk "^4.1.2" + chokidar "^3.5.3" + cli-table3 "^0.6.3" + combine-promises "^1.1.0" + commander "^5.1.0" + core-js "^3.31.1" + del "^6.1.1" + detect-port "^1.5.1" + escape-html "^1.0.3" + eta "^2.2.0" + eval "^0.1.8" + fs-extra "^11.1.1" + html-tags "^3.3.1" + html-webpack-plugin "^5.6.0" + leven "^3.1.0" + lodash "^4.17.21" + p-map "^4.0.0" + prompts "^2.4.2" + react-dev-utils "^12.0.1" + react-helmet-async "^1.3.0" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-router "^5.3.4" + react-router-config "^5.1.1" + react-router-dom "^5.3.4" + rtl-detect "^1.0.4" + semver "^7.5.4" + serve-handler "^6.1.6" + shelljs "^0.8.5" + tslib "^2.6.0" + update-notifier "^6.0.2" + webpack "^5.95.0" + webpack-bundle-analyzer "^4.10.2" + webpack-dev-server "^4.15.2" + webpack-merge "^6.0.1" + "@docusaurus/cssnano-preset@3.5.2": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz#6c1f2b2f9656f978c4694c84ab24592b04dcfab3" @@ -1184,6 +2189,16 @@ postcss-sort-media-queries "^5.2.0" tslib "^2.6.0" +"@docusaurus/cssnano-preset@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.0.tgz#02378e53e9568ed5fc8871d4fc158ea96fd7421c" + integrity sha512-h3jlOXqqzNSoU+C4CZLNpFtD+v2xr1UBf4idZpwMgqid9r6lb5GS7tWKnQnauio6OipacbHbDXEX3JyT1PlDkg== + dependencies: + cssnano-preset-advanced "^6.1.2" + postcss "^8.4.38" + postcss-sort-media-queries "^5.2.0" + tslib "^2.6.0" + "@docusaurus/logger@3.5.2": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/logger/-/logger-3.5.2.tgz#1150339ad56844b30734115c19c580f3b25cf5ed" @@ -1192,6 +2207,14 @@ chalk "^4.1.2" tslib "^2.6.0" +"@docusaurus/logger@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/logger/-/logger-3.6.0.tgz#c7349c2636087f55f573a60a3c7f69b87d59974d" + integrity sha512-BcQhoXilXW0607cH/kO6P5Gt5KxCGfoJ+QDKNf3yO2S09/RsITlW+0QljXPbI3DklTrHrhRDmgGk1yX4nUhWTA== + dependencies: + chalk "^4.1.2" + tslib "^2.6.0" + "@docusaurus/mdx-loader@3.5.2": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz#99781641372c5037bcbe09bb8ade93a0e0ada57d" @@ -1222,6 +2245,36 @@ vfile "^6.0.1" webpack "^5.88.1" +"@docusaurus/mdx-loader@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/mdx-loader/-/mdx-loader-3.6.0.tgz#f8ba7af9d59473a7182f6a9307e0432f8dce905b" + integrity sha512-GhRzL1Af/AdSSrGesSPOU/iP/aXadTGmVKuysCxZDrQR2RtBtubQZ9aw+KvdFVV7R4K/CsbgD6J5oqrXlEPk3Q== + dependencies: + "@docusaurus/logger" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" + "@mdx-js/mdx" "^3.0.0" + "@slorber/remark-comment" "^1.0.0" + escape-html "^1.0.3" + estree-util-value-to-estree "^3.0.1" + file-loader "^6.2.0" + fs-extra "^11.1.1" + image-size "^1.0.2" + mdast-util-mdx "^3.0.0" + mdast-util-to-string "^4.0.0" + rehype-raw "^7.0.0" + remark-directive "^3.0.0" + remark-emoji "^4.0.0" + remark-frontmatter "^5.0.0" + remark-gfm "^4.0.0" + stringify-object "^3.3.0" + tslib "^2.6.0" + unified "^11.0.3" + unist-util-visit "^5.0.0" + url-loader "^4.1.1" + vfile "^6.0.1" + webpack "^5.88.1" + "@docusaurus/module-type-aliases@3.5.2", "@docusaurus/module-type-aliases@^3.5.2": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz#4e8f9c0703e23b2e07ebfce96598ec83e4dd2a9e" @@ -1235,19 +2288,32 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@6.0.0" -"@docusaurus/plugin-content-blog@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz#649c07c34da7603645f152bcebdf75285baed16b" - integrity sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg== +"@docusaurus/module-type-aliases@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.0.tgz#44083c34a53db1dde06364b4e7f2d144fa2d5394" + integrity sha512-szTrIN/6/fuk0xkf3XbRfdTFJzRQ8d1s3sQj5++58wltrT7v3yn1149oc9ryYjMpRcbsarGloQwMu7ofPe4XPg== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/types" "3.6.0" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@6.0.0" + +"@docusaurus/plugin-content-blog@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.0.tgz#9128175b4c3ce885d9090183d74c60813844ea8d" + integrity sha512-o4aT1/E0Ldpzs/hQff5uyoSriAhS/yqBhqSn+fvSw465AaqRsva6O7CZSYleuBq6x2bewyE3QJq2PcTiHhAd8g== + dependencies: + "@docusaurus/core" "3.6.0" + "@docusaurus/logger" "3.6.0" + "@docusaurus/mdx-loader" "3.6.0" + "@docusaurus/theme-common" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" cheerio "1.0.0-rc.12" feed "^4.2.2" fs-extra "^11.1.1" @@ -1259,7 +2325,30 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.5.2", "@docusaurus/plugin-content-docs@^2 || ^3": +"@docusaurus/plugin-content-docs@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.0.tgz#15cae4bf81da0b0ddce09d53b10b7209116ea9c2" + integrity sha512-c5gZOxocJKO/Zev2MEZInli+b+VNswDGuKHE6QtFgidhAJonwjh2kwj967RvWFaMMk62HlLJLZ+IGK2XsVy4Aw== + dependencies: + "@docusaurus/core" "3.6.0" + "@docusaurus/logger" "3.6.0" + "@docusaurus/mdx-loader" "3.6.0" + "@docusaurus/module-type-aliases" "3.6.0" + "@docusaurus/theme-common" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" + "@types/react-router-config" "^5.0.7" + combine-promises "^1.1.0" + fs-extra "^11.1.1" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.6.0" + utility-types "^3.10.0" + webpack "^5.88.1" + +"@docusaurus/plugin-content-docs@^2 || ^3": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz#adcf6c0bd9a9818eb192ab831e0069ee62d31505" integrity sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ== @@ -1282,118 +2371,119 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz#2b59e43f5bc5b5176ff01835de706f1c65c2e68b" - integrity sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/plugin-content-pages@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.0.tgz#5dd284bf063baaba1e0305c90b1dd0d5acc7e466" + integrity sha512-RKHhJrfkadHc7+tt1cP48NWifOrhkSRMPdXNYytzhoQrXlP6Ph+3tfQ4/n+nT0S3Y9+wwRxYqRqA380ZLt+QtQ== + dependencies: + "@docusaurus/core" "3.6.0" + "@docusaurus/mdx-loader" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-debug@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz#c25ca6a59e62a17c797b367173fe80c06fdf2f65" - integrity sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA== +"@docusaurus/plugin-debug@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-debug/-/plugin-debug-3.6.0.tgz#0a6da9ba31a0acb176ae2762b4d6b96b1906c826" + integrity sha512-o8T1Rl94COLdSlKvjYLQpRJQRU8WWZ8EX1B0yV0dQLNN8reyH7MQW+6z1ig4sQFfH3pnjPWVGHfuEjcib5m7Eg== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" + "@docusaurus/core" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils" "3.6.0" fs-extra "^11.1.1" react-json-view-lite "^1.2.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz#1143e78d1461d3c74a2746f036d25b18d4a2608d" - integrity sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ== +"@docusaurus/plugin-google-analytics@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.0.tgz#9e8245eef1bee95e44ef2af92ce3e844a8e93e64" + integrity sha512-kgRFbfpi6Hshj75YUztKyEMtI/kw0trPRwoTN4g+W1NK99R/vh8phTvhBTIMnDbetU79795LkwfG0rZ/ce6zWQ== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/core" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz#60b5a9e1888c4fa16933f7c5cb5f2f2c31caad3a" - integrity sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA== +"@docusaurus/plugin-google-gtag@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.0.tgz#bed8381fe3ab357d56a565f657e38d8ea6272703" + integrity sha512-nqu4IfjaO4UX+dojHL2BxHRS+sKj31CIMWYo49huQ3wTET0Oc3u/WGTaKd3ShTPDhkgiRhTOSTPUwJWrU55nHg== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/core" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" "@types/gtag.js" "^0.0.12" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz#7a37334d2e7f00914d61ad05bc09391c4db3bfda" - integrity sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg== +"@docusaurus/plugin-google-tag-manager@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.0.tgz#326382de05888ea4317837be736eabd635adbc71" + integrity sha512-OU6c5xI0nOVbEc9eImGvvsgNWe4vGm97t/W3aLHjWsHyNk3uwFNBQMHRvBUwAi9k/K3kyC5E7DWnc67REhdLOw== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/core" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz#9c940b27f3461c54d65295cf4c52cb20538bd360" - integrity sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/plugin-sitemap@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.0.tgz#c7c93f75f03391ca9071da48563fc4faa84966bc" + integrity sha512-YB5XMdf9FjLhgbHY/cDbYhVxsgcpPIjxY9769HUgFOB7GVzItTLOR71W035R1BiR2CA5QAn3XOSg36WLRxlhQQ== + dependencies: + "@docusaurus/core" "3.6.0" + "@docusaurus/logger" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/preset-classic@^3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz#977f78510bbc556aa0539149eef960bb7ab52bd9" - integrity sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/plugin-content-blog" "3.5.2" - "@docusaurus/plugin-content-docs" "3.5.2" - "@docusaurus/plugin-content-pages" "3.5.2" - "@docusaurus/plugin-debug" "3.5.2" - "@docusaurus/plugin-google-analytics" "3.5.2" - "@docusaurus/plugin-google-gtag" "3.5.2" - "@docusaurus/plugin-google-tag-manager" "3.5.2" - "@docusaurus/plugin-sitemap" "3.5.2" - "@docusaurus/theme-classic" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/theme-search-algolia" "3.5.2" - "@docusaurus/types" "3.5.2" - -"@docusaurus/theme-classic@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz#602ddb63d987ab1f939e3760c67bc1880f01c000" - integrity sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/module-type-aliases" "3.5.2" - "@docusaurus/plugin-content-blog" "3.5.2" - "@docusaurus/plugin-content-docs" "3.5.2" - "@docusaurus/plugin-content-pages" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/theme-translations" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/preset-classic@^3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/preset-classic/-/preset-classic-3.6.0.tgz#71561f366a266be571022764eb8b9e5618f573eb" + integrity sha512-kpGNdQzr/Dpm7o3b1iaQrz4DMDx3WIeBbl4V4P4maa2zAQkTdlaP4CMgA5oKrRrpqPLnQFsUM/b+qf2glhl2Tw== + dependencies: + "@docusaurus/core" "3.6.0" + "@docusaurus/plugin-content-blog" "3.6.0" + "@docusaurus/plugin-content-docs" "3.6.0" + "@docusaurus/plugin-content-pages" "3.6.0" + "@docusaurus/plugin-debug" "3.6.0" + "@docusaurus/plugin-google-analytics" "3.6.0" + "@docusaurus/plugin-google-gtag" "3.6.0" + "@docusaurus/plugin-google-tag-manager" "3.6.0" + "@docusaurus/plugin-sitemap" "3.6.0" + "@docusaurus/theme-classic" "3.6.0" + "@docusaurus/theme-common" "3.6.0" + "@docusaurus/theme-search-algolia" "3.6.0" + "@docusaurus/types" "3.6.0" + +"@docusaurus/theme-classic@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/theme-classic/-/theme-classic-3.6.0.tgz#8f34b65c85f5082deb3633a893974d2eee309121" + integrity sha512-sAXNfwPL6uRD+BuHuKXZfAXud7SS7IK/JdrPuzyQxdO1gJKzI5GFfe1ED1QoJDNWJWJ01JHE5rSnwYLEADc2rQ== + dependencies: + "@docusaurus/core" "3.6.0" + "@docusaurus/logger" "3.6.0" + "@docusaurus/mdx-loader" "3.6.0" + "@docusaurus/module-type-aliases" "3.6.0" + "@docusaurus/plugin-content-blog" "3.6.0" + "@docusaurus/plugin-content-docs" "3.6.0" + "@docusaurus/plugin-content-pages" "3.6.0" + "@docusaurus/theme-common" "3.6.0" + "@docusaurus/theme-translations" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" - infima "0.2.0-alpha.44" + infima "0.2.0-alpha.45" lodash "^4.17.21" nprogress "^0.2.0" postcss "^8.4.26" @@ -1422,32 +2512,50 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-mermaid@^3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.5.2.tgz#7d64289e6f2493b9fc0d5f2e8f66da4c9d884db8" - integrity sha512-7vWCnIe/KoyTN1Dc55FIyqO5hJ3YaV08Mr63Zej0L0mX1iGzt+qKSmeVUAJ9/aOalUhF0typV0RmNUSy5FAmCg== +"@docusaurus/theme-common@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/theme-common/-/theme-common-3.6.0.tgz#9a061d278df76da0f70a9465cd0b7299c14d03d3" + integrity sha512-frjlYE5sRs+GuPs4XXlp9aMLI2O4H5FPpznDAXBrCm+8EpWRiIb443ePMxM3IyMCQ5bwFlki0PI9C+r4apstnw== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/module-type-aliases" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" - mermaid "^10.4.0" + "@docusaurus/mdx-loader" "3.6.0" + "@docusaurus/module-type-aliases" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + clsx "^2.0.0" + parse-numeric-range "^1.3.0" + prism-react-renderer "^2.3.0" tslib "^2.6.0" + utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@3.5.2": - version "3.5.2" - resolved "https://registry.npmmirror.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz#466c83ca7e8017d95ae6889ccddc5ef8bf6b61c6" - integrity sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA== +"@docusaurus/theme-mermaid@^3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.6.0.tgz#0a79b76950aee8e2856a3e39f1c1050eb237c1c9" + integrity sha512-5t7zzBnnJa4BBcGo9bEfTM48DxD/+CVbFkfiRnFXheWjMrMm5a+IP10igEQ4zyDC+QgatbzLAxkj4GRYpYTauA== + dependencies: + "@docusaurus/core" "3.6.0" + "@docusaurus/module-type-aliases" "3.6.0" + "@docusaurus/theme-common" "3.6.0" + "@docusaurus/types" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" + mermaid ">=10.4" + tslib "^2.6.0" + +"@docusaurus/theme-search-algolia@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.0.tgz#47dcfca68f50163abce411dd9b181855a9ec9c83" + integrity sha512-4IwRUkxjrisR8LXBHeE4d2btraWdMficbgiVL3UHvJURmyvgzMBZQP8KrK8rjdXeu8SuRxSmeV6NSVomRvdbEg== dependencies: "@docsearch/react" "^3.5.2" - "@docusaurus/core" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/plugin-content-docs" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/theme-translations" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/core" "3.6.0" + "@docusaurus/logger" "3.6.0" + "@docusaurus/plugin-content-docs" "3.6.0" + "@docusaurus/theme-common" "3.6.0" + "@docusaurus/theme-translations" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-validation" "3.6.0" algoliasearch "^4.18.0" algoliasearch-helper "^3.13.3" clsx "^2.0.0" @@ -1457,7 +2565,15 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.5.2", "@docusaurus/theme-translations@^2 || ^3": +"@docusaurus/theme-translations@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/theme-translations/-/theme-translations-3.6.0.tgz#93994e931f340c1712c81ac80dbab5750c24634f" + integrity sha512-L555X8lWE3fv8VaF0Bc1VnAgi10UvRKFcvADHiYR7Gj37ItaWP5i7xLHsSw7fi/SHTXe5wfIeCFNqUYHyCOHAQ== + dependencies: + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/theme-translations@^2 || ^3": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz#38f9ebf2a5d860397022206a05fef66c08863c89" integrity sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw== @@ -1480,6 +2596,21 @@ webpack "^5.88.1" webpack-merge "^5.9.0" +"@docusaurus/types@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/types/-/types-3.6.0.tgz#8fa82332a7c7b8093b5c55e1115f5854ce484978" + integrity sha512-jADLgoZGWhAzThr+mRiyuFD4OUzt6jHnb7NRArRKorgxckqUBaPyFOau9hhbcSTHtU6ceyeWjN7FDt7uG2Hplw== + dependencies: + "@mdx-js/mdx" "^3.0.0" + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.9.2" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.95.0" + webpack-merge "^5.9.0" + "@docusaurus/utils-common@3.5.2", "@docusaurus/utils-common@^2 || ^3": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/utils-common/-/utils-common-3.5.2.tgz#4d7f5e962fbca3e2239d80457aa0e4bd3d8f7e0a" @@ -1487,6 +2618,13 @@ dependencies: tslib "^2.6.0" +"@docusaurus/utils-common@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/utils-common/-/utils-common-3.6.0.tgz#11855ea503132bbcaba6ca4d351293ff10a75d34" + integrity sha512-diUDNfbw33GaZMmKwdTckT2IBfVouXLXRD+zphH9ywswuaEIKqixvuf5g41H7MBBrlMsxhna3uTMoB4B/OPDcA== + dependencies: + tslib "^2.6.0" + "@docusaurus/utils-validation@3.5.2", "@docusaurus/utils-validation@^2 || ^3": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz#1b2b2f02082781cc8ce713d4c85e88d6d2fc4eb3" @@ -1501,6 +2639,20 @@ lodash "^4.17.21" tslib "^2.6.0" +"@docusaurus/utils-validation@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/utils-validation/-/utils-validation-3.6.0.tgz#5557ca14fa64ac29e6f70e61006be721395ecde5" + integrity sha512-CRHiKKJEKA0GFlfOf71JWHl7PtwOyX0+Zg9ep9NFEZv6Lcx3RJ9nhl7p8HRjPL6deyYceavM//BsfW4pCI4BtA== + dependencies: + "@docusaurus/logger" "3.6.0" + "@docusaurus/utils" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + fs-extra "^11.2.0" + joi "^17.9.2" + js-yaml "^4.1.0" + lodash "^4.17.21" + tslib "^2.6.0" + "@docusaurus/utils@3.5.2", "@docusaurus/utils@^2 || ^3": version "3.5.2" resolved "https://registry.npmmirror.com/@docusaurus/utils/-/utils-3.5.2.tgz#17763130215f18d7269025903588ef7fb373e2cb" @@ -1527,6 +2679,32 @@ utility-types "^3.10.0" webpack "^5.88.1" +"@docusaurus/utils@3.6.0": + version "3.6.0" + resolved "https://registry.npmmirror.com/@docusaurus/utils/-/utils-3.6.0.tgz#192785da6fd62dfd83d6f1879c3aa45547f5df23" + integrity sha512-VKczAutI4mptiAw/WcYEu5WeVhQ6Q1zdIUl64SGw9K++9lziH+Kt10Ee8l2dMpRkiUk6zzK20kMNlX2WCUwXYQ== + dependencies: + "@docusaurus/logger" "3.6.0" + "@docusaurus/utils-common" "3.6.0" + "@svgr/webpack" "^8.1.0" + escape-string-regexp "^4.0.0" + file-loader "^6.2.0" + fs-extra "^11.1.1" + github-slugger "^1.5.0" + globby "^11.1.0" + gray-matter "^4.0.3" + jiti "^1.20.0" + js-yaml "^4.1.0" + lodash "^4.17.21" + micromatch "^4.0.5" + prompts "^2.4.2" + resolve-pathname "^3.0.0" + shelljs "^0.8.5" + tslib "^2.6.0" + url-loader "^4.1.1" + utility-types "^3.10.0" + webpack "^5.88.1" + "@easyops-cn/autocomplete.js@^0.38.1": version "0.38.1" resolved "https://registry.npmmirror.com/@easyops-cn/autocomplete.js/-/autocomplete.js-0.38.1.tgz#46dff5795a9a032fa9b9250fdf63ca6c61c07629" @@ -1535,10 +2713,10 @@ cssesc "^3.0.0" immediate "^3.2.3" -"@easyops-cn/docusaurus-search-local@^0.44.4": - version "0.44.6" - resolved "https://registry.npmmirror.com/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.44.6.tgz#d1a64bbf602bc8313ce766e1e79075b1c1bcecc9" - integrity sha512-DiCz6Ag7Xbj27NFaKzvJEfMCW5o7/Ad9ZYuJ7TShwk8XmMnyr1nxJYLn1WpmJ2pzvR20Wt0zcn4u5MfpiLuFLw== +"@easyops-cn/docusaurus-search-local@^0.45.0": + version "0.45.0" + resolved "https://registry.npmmirror.com/@easyops-cn/docusaurus-search-local/-/docusaurus-search-local-0.45.0.tgz#7101d59c9359b50b1add306d2504a09bd7176adb" + integrity sha512-ccJjeYmBHrv2v8Y9eQnH79S0PEKcogACKkEatEKPcad7usQj/14jA9POUUUYW/yougLSXghwe+uIncbuUBuBFg== dependencies: "@docusaurus/plugin-content-docs" "^2 || ^3" "@docusaurus/theme-translations" "^2 || ^3" @@ -1591,6 +2769,24 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@iconify/types@^2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" + integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== + +"@iconify/utils@^2.1.32": + version "2.1.33" + resolved "https://registry.npmmirror.com/@iconify/utils/-/utils-2.1.33.tgz#cbf7242a52fd0ec58c42d37d28e4406b5327e8c0" + integrity sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw== + dependencies: + "@antfu/install-pkg" "^0.4.0" + "@antfu/utils" "^0.7.10" + "@iconify/types" "^2.0.0" + debug "^4.3.6" + kolorist "^1.8.0" + local-pkg "^0.5.0" + mlly "^1.7.1" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1691,6 +2887,20 @@ dependencies: "@types/mdx" "^2.0.0" +"@mdx-js/react@^3.1.0": + version "3.1.0" + resolved "https://registry.npmmirror.com/@mdx-js/react/-/react-3.1.0.tgz#c4522e335b3897b9a845db1dbdd2f966ae8fb0ed" + integrity sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ== + dependencies: + "@types/mdx" "^2.0.0" + +"@mermaid-js/parser@^0.3.0": + version "0.3.0" + resolved "https://registry.npmmirror.com/@mermaid-js/parser/-/parser-0.3.0.tgz#7a28714599f692f93df130b299fa1aadc9f9c8ab" + integrity sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA== + dependencies: + langium "3.0.0" + "@napi-rs/wasm-runtime@^0.2.3": version "0.2.5" resolved "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.5.tgz#b6f5079408305fe6a3529ccb2bb8ba8d9b7a02e7" @@ -2047,23 +3257,216 @@ dependencies: "@types/node" "*" -"@types/d3-scale-chromatic@^3.0.0": +"@types/d3-array@*": + version "3.2.1" + resolved "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== + +"@types/d3-axis@*": + version "3.0.6" + resolved "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" + integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-brush@*": + version "3.0.6" + resolved "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" + integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-chord@*": + version "3.0.6" + resolved "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" + integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-contour@*": + version "3.0.6" + resolved "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" + integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== + dependencies: + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.4" + resolved "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" + integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== + +"@types/d3-dispatch@*": + version "3.0.6" + resolved "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz#096efdf55eb97480e3f5621ff9a8da552f0961e7" + integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== + +"@types/d3-drag@*": + version "3.0.7" + resolved "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.7" + resolved "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== + +"@types/d3-ease@*": + version "3.0.2" + resolved "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-fetch@*": + version "3.0.7" + resolved "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.10" + resolved "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== + +"@types/d3-format@*": + version "3.0.4" + resolved "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== + +"@types/d3-geo@*": + version "3.1.0" + resolved "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*": + version "3.1.7" + resolved "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b" + integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== + +"@types/d3-interpolate@*": + version "3.0.4" + resolved "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.0" + resolved "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a" + integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ== + +"@types/d3-polygon@*": + version "3.0.2" + resolved "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" + integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== + +"@types/d3-quadtree@*": + version "3.0.6" + resolved "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== + +"@types/d3-random@*": + version "3.0.3" + resolved "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb" + integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== + +"@types/d3-scale-chromatic@*": version "3.0.3" resolved "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== -"@types/d3-scale@^4.0.3": +"@types/d3-scale@*": version "4.0.8" resolved "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== dependencies: "@types/d3-time" "*" +"@types/d3-selection@*": + version "3.0.11" + resolved "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== + +"@types/d3-shape@*": + version "3.1.6" + resolved "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72" + integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time-format@*": + version "4.0.3" + resolved "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" + integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== + "@types/d3-time@*": version "3.0.3" resolved "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== +"@types/d3-timer@*": + version "3.0.2" + resolved "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + +"@types/d3-transition@*": + version "3.0.9" + resolved "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.9.tgz#1136bc57e9ddb3c390dccc9b5ff3b7d2b8d94706" + integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@*": + version "3.0.8" + resolved "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^7.4.3": + version "7.4.3" + resolved "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" + integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + "@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -2071,6 +3474,29 @@ dependencies: "@types/ms" "*" +"@types/dompurify@^3.0.5": + version "3.0.5" + resolved "https://registry.npmmirror.com/@types/dompurify/-/dompurify-3.0.5.tgz#02069a2fcb89a163bacf1a788f73cb415dd75cb7" + integrity sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg== + dependencies: + "@types/trusted-types" "*" + +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + "@types/estree-jsx@^1.0.0": version "1.0.5" resolved "https://registry.npmmirror.com/@types/estree-jsx/-/estree-jsx-1.0.5.tgz#858a88ea20f34fe65111f005a689fa1ebf70dc18" @@ -2078,7 +3504,7 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== @@ -2123,6 +3549,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/geojson@*": + version "7946.0.14" + resolved "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613" + integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg== + "@types/gtag.js@^0.0.12": version "0.0.12" resolved "https://registry.npmmirror.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" @@ -2181,18 +3612,11 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/mdast@^3.0.0": - version "3.0.15" - resolved "https://registry.npmmirror.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" - integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== - dependencies: - "@types/unist" "^2" - "@types/mdast@^4.0.0", "@types/mdast@^4.0.2": version "4.0.4" resolved "https://registry.npmmirror.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" @@ -2336,12 +3760,17 @@ dependencies: "@types/node" "*" +"@types/trusted-types@*": + version "2.0.7" + resolved "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/unist@*", "@types/unist@^3.0.0": version "3.0.3" resolved "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== -"@types/unist@^2", "@types/unist@^2.0.0": +"@types/unist@^2.0.0": version "2.0.11" resolved "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== @@ -2531,6 +3960,11 @@ acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2: resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.12.1, acorn@^8.14.0: + version "8.14.0" + resolved "https://registry.npmmirror.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + address@^1.0.1, address@^1.1.2: version "1.2.2" resolved "https://registry.npmmirror.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" @@ -2618,6 +4052,13 @@ ansi-align@^3.0.1: dependencies: string-width "^4.1.0" +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" @@ -2640,7 +4081,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2709,7 +4150,7 @@ autoprefixer@^10.4.14, autoprefixer@^10.4.19: picocolors "^1.0.1" postcss-value-parser "^4.2.0" -babel-loader@^9.1.3: +babel-loader@^9.1.3, babel-loader@^9.2.1: version "9.2.1" resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== @@ -3033,6 +4474,25 @@ cheerio@^1.0.0: undici "^6.19.5" whatwg-mimetype "^4.0.0" +chevrotain-allstar@~0.3.0: + version "0.3.1" + resolved "https://registry.npmmirror.com/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz#b7412755f5d83cc139ab65810cdb00d8db40e6ca" + integrity sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw== + dependencies: + lodash-es "^4.17.21" + +chevrotain@~11.0.3: + version "11.0.3" + resolved "https://registry.npmmirror.com/chevrotain/-/chevrotain-11.0.3.tgz#88ffc1fb4b5739c715807eaeedbbf200e202fc1b" + integrity sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw== + 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" + chokidar@^3.4.2, chokidar@^3.5.3: version "3.6.0" resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -3207,6 +4667,11 @@ concat-map@0.0.1: resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -3236,6 +4701,11 @@ consola@^2.15.3: resolved "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.npmmirror.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -3314,6 +4784,13 @@ cose-base@^1.0.0: dependencies: layout-base "^1.0.0" +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + dependencies: + layout-base "^2.0.0" + cosmiconfig@^6.0.0: version "6.0.0" resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" @@ -3511,7 +4988,14 @@ cytoscape-cose-bilkent@^4.1.0: dependencies: cose-base "^1.0.0" -cytoscape@^3.28.1: +cytoscape-fcose@^2.2.0: + version "2.2.0" + resolved "https://registry.npmmirror.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.29.2: version "3.30.3" resolved "https://registry.npmmirror.com/cytoscape/-/cytoscape-3.30.3.tgz#1b2726bbfa6673f643488a81147354841c252352" integrity sha512-HncJ9gGJbVtw7YXtIs3+6YAFSSiKsom0amWc33Z7QbylbY2JGMrA0yz4EwrdTScZxnwclXeEZHzO5pxoy0ZE4g== @@ -3751,7 +5235,7 @@ d3-zoom@3: d3-selection "2 - 3" d3-transition "2 - 3" -d3@^7.4.0, d3@^7.8.2: +d3@^7.9.0: version "7.9.0" resolved "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== @@ -3787,15 +5271,15 @@ d3@^7.4.0, d3@^7.8.2: d3-transition "3" d3-zoom "3" -dagre-d3-es@7.0.10: - version "7.0.10" - resolved "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" - integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== +dagre-d3-es@7.0.11: + version "7.0.11" + resolved "https://registry.npmmirror.com/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz#2237e726c0577bfe67d1a7cfd2265b9ab2c15c40" + integrity sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw== dependencies: - d3 "^7.8.2" + d3 "^7.9.0" lodash-es "^4.17.21" -dayjs@^1.11.7: +dayjs@^1.11.10: version "1.11.13" resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== @@ -3812,7 +5296,7 @@ debug@2.6.9, debug@^2.6.0: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.6: version "4.3.7" resolved "https://registry.npmmirror.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -3947,11 +5431,6 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" -diff@^5.0.0: - version "5.2.0" - resolved "https://registry.npmmirror.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4010,7 +5489,7 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -"dompurify@^3.0.5 <3.1.7": +"dompurify@^3.0.11 <3.1.7": version "3.1.6" resolved "https://registry.npmmirror.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2" integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ== @@ -4068,11 +5547,6 @@ electron-to-chromium@^1.5.28: resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.38.tgz#c6a14e1506717c5a46d439580d7424d8d5860180" integrity sha512-VbeVexmZ1IFh+5EfrYz1I0HTzHVIlJa112UEWhciPyeOcKJGeTv6N8WnG4wsQB81DGCaVEGhpSb6o6a8WYFXXg== -elkjs@^0.9.0: - version "0.9.3" - resolved "https://registry.npmmirror.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161" - integrity sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4422,6 +5896,13 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmmirror.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -4752,6 +6233,11 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" +hachure-fill@^0.5.2: + version "0.5.2" + resolved "https://registry.npmmirror.com/hachure-fill/-/hachure-fill-0.5.2.tgz#d19bc4cc8750a5962b47fb1300557a85fcf934cc" + integrity sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -5001,6 +6487,17 @@ html-webpack-plugin@^5.5.3: pretty-error "^4.0.0" tapable "^2.0.0" +html-webpack-plugin@^5.6.0: + version "5.6.3" + resolved "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz#a31145f0fee4184d53a794f9513147df1e653685" + integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + htmlparser2@^6.1.0: version "6.1.0" resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" @@ -5164,10 +6661,10 @@ indent-string@^4.0.0: resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infima@0.2.0-alpha.44: - version "0.2.0-alpha.44" - resolved "https://registry.npmmirror.com/infima/-/infima-0.2.0-alpha.44.tgz#9cd9446e473b44d49763f48efabe31f32440861d" - integrity sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ== +infima@0.2.0-alpha.45: + version "0.2.0-alpha.45" + resolved "https://registry.npmmirror.com/infima/-/infima-0.2.0-alpha.45.tgz#542aab5a249274d81679631b492973dd2c1e7466" + integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== inflight@^1.0.4: version "1.0.6" @@ -5549,7 +7046,7 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -khroma@^2.0.0: +khroma@^2.1.0: version "2.1.0" resolved "https://registry.npmmirror.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== @@ -5571,10 +7068,21 @@ kleur@^3.0.3: resolved "https://registry.npmmirror.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.npmmirror.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +langium@3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/langium/-/langium-3.0.0.tgz#4938294eb57c59066ef955070ac4d0c917b26026" + integrity sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg== + dependencies: + chevrotain "~11.0.3" + chevrotain-allstar "~0.3.0" + vscode-languageserver "~9.0.1" + vscode-languageserver-textdocument "~1.0.11" + vscode-uri "~3.0.8" latest-version@^7.0.0: version "7.0.0" @@ -5596,6 +7104,11 @@ layout-base@^1.0.0: resolved "https://registry.npmmirror.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.npmmirror.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== + leven@^3.1.0: version "3.1.0" resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5630,6 +7143,14 @@ loader-utils@^3.2.0: resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== +local-pkg@^0.5.0: + version "0.5.0" + resolved "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" + integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== + dependencies: + mlly "^1.4.2" + pkg-types "^1.0.3" + locate-path@^3.0.0: version "3.0.0" resolved "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -5652,7 +7173,7 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" -lodash-es@^4.17.21: +lodash-es@4.17.21, lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== @@ -5728,11 +7249,23 @@ markdown-extensions@^2.0.0: resolved "https://registry.npmmirror.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + markdown-table@^3.0.0: version "3.0.3" resolved "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== +marked@^13.0.2: + version "13.0.3" + resolved "https://registry.npmmirror.com/marked/-/marked-13.0.3.tgz#5c5b4a5d0198060c7c9bc6ef9420a7fed30f822d" + integrity sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA== + mdast-util-directive@^3.0.0: version "3.0.0" resolved "https://registry.npmmirror.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" @@ -5757,24 +7290,6 @@ mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" -mdast-util-from-markdown@^1.3.0: - version "1.3.1" - resolved "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - mdast-util-from-markdown@^2.0.0: version "2.0.1" resolved "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz#32a6e8f512b416e1f51eb817fc64bd867ebcd9cc" @@ -5960,13 +7475,6 @@ mdast-util-to-markdown@^2.0.0: unist-util-visit "^5.0.0" zwitch "^2.0.0" -mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string@^4.0.0: version "4.0.0" resolved "https://registry.npmmirror.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" @@ -6011,59 +7519,38 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@^10.4.0: - version "10.9.3" - resolved "https://registry.npmmirror.com/mermaid/-/mermaid-10.9.3.tgz#90bc6f15c33dbe5d9507fed31592cc0d88fee9f7" - integrity sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw== - dependencies: - "@braintree/sanitize-url" "^6.0.1" - "@types/d3-scale" "^4.0.3" - "@types/d3-scale-chromatic" "^3.0.0" - cytoscape "^3.28.1" +mermaid@>=10.4: + version "11.4.0" + resolved "https://registry.npmmirror.com/mermaid/-/mermaid-11.4.0.tgz#e510f45700ed4b31e1dc327b3a405ad9f6907ca3" + integrity sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA== + dependencies: + "@braintree/sanitize-url" "^7.0.1" + "@iconify/utils" "^2.1.32" + "@mermaid-js/parser" "^0.3.0" + "@types/d3" "^7.4.3" + "@types/dompurify" "^3.0.5" + cytoscape "^3.29.2" cytoscape-cose-bilkent "^4.1.0" - d3 "^7.4.0" + cytoscape-fcose "^2.2.0" + d3 "^7.9.0" d3-sankey "^0.12.3" - dagre-d3-es "7.0.10" - dayjs "^1.11.7" - dompurify "^3.0.5 <3.1.7" - elkjs "^0.9.0" + dagre-d3-es "7.0.11" + dayjs "^1.11.10" + dompurify "^3.0.11 <3.1.7" katex "^0.16.9" - khroma "^2.0.0" + khroma "^2.1.0" lodash-es "^4.17.21" - mdast-util-from-markdown "^1.3.0" - non-layered-tidy-tree-layout "^2.0.2" - stylis "^4.1.3" + marked "^13.0.2" + roughjs "^4.6.6" + stylis "^4.3.1" ts-dedent "^2.2.0" - uuid "^9.0.0" - web-worker "^1.2.0" + uuid "^9.0.1" methods@~1.1.2: version "1.1.2" resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromark-core-commonmark@^1.0.1: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - micromark-core-commonmark@^2.0.0: version "2.0.1" resolved "https://registry.npmmirror.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz#9a45510557d068605c6e9a80f282b2bb8581e43d" @@ -6255,15 +7742,6 @@ micromark-extension-mdxjs@^3.0.0: micromark-util-combine-extensions "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-destination@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" @@ -6273,16 +7751,6 @@ micromark-factory-destination@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - micromark-factory-label@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" @@ -6324,16 +7792,6 @@ micromark-factory-space@^2.0.0: micromark-util-character "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-title@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" @@ -6344,16 +7802,6 @@ micromark-factory-title@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-whitespace@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" @@ -6380,13 +7828,6 @@ micromark-util-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-chunked@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" @@ -6394,15 +7835,6 @@ micromark-util-chunked@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-util-classify-character@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" @@ -6412,14 +7844,6 @@ micromark-util-classify-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - micromark-util-combine-extensions@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" @@ -6428,13 +7852,6 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-chunked "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.1" resolved "https://registry.npmmirror.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" @@ -6442,16 +7859,6 @@ micromark-util-decode-numeric-character-reference@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-decode-string@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" @@ -6462,11 +7869,6 @@ micromark-util-decode-string@^2.0.0: micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== - micromark-util-encode@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" @@ -6486,23 +7888,11 @@ micromark-util-events-to-acorn@^2.0.0: micromark-util-types "^2.0.0" vfile-message "^4.0.0" -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== - micromark-util-html-tag-name@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-normalize-identifier@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" @@ -6510,13 +7900,6 @@ micromark-util-normalize-identifier@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== - dependencies: - micromark-util-types "^1.0.0" - micromark-util-resolve-all@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" @@ -6524,15 +7907,6 @@ micromark-util-resolve-all@^2.0.0: dependencies: micromark-util-types "^2.0.0" -micromark-util-sanitize-uri@^1.0.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-sanitize-uri@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" @@ -6542,16 +7916,6 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-encode "^2.0.0" micromark-util-symbol "^2.0.0" -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - micromark-util-subtokenize@^2.0.0: version "2.0.1" resolved "https://registry.npmmirror.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz#76129c49ac65da6e479c09d0ec4b5f29ec6eace5" @@ -6572,7 +7936,7 @@ micromark-util-symbol@^2.0.0: resolved "https://registry.npmmirror.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: +micromark-util-types@^1.0.0: version "1.1.0" resolved "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== @@ -6582,29 +7946,6 @@ micromark-util-types@^2.0.0: resolved "https://registry.npmmirror.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.npmmirror.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - micromark@^4.0.0: version "4.0.0" resolved "https://registry.npmmirror.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" @@ -6693,6 +8034,14 @@ mini-css-extract-plugin@^2.7.6: schema-utils "^4.0.0" tapable "^2.2.1" +mini-css-extract-plugin@^2.9.1: + version "2.9.2" + resolved "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -6710,10 +8059,15 @@ minimist@^1.2.0: resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.npmmirror.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +mlly@^1.4.2, mlly@^1.7.1, mlly@^1.7.2: + version "1.7.2" + resolved "https://registry.npmmirror.com/mlly/-/mlly-1.7.2.tgz#21c0d04543207495b8d867eff0ac29fac9a023c0" + integrity sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA== + dependencies: + acorn "^8.12.1" + pathe "^1.1.2" + pkg-types "^1.2.0" + ufo "^1.5.4" mrmime@^2.0.0: version "2.0.0" @@ -6781,11 +8135,6 @@ node-releases@^2.0.18: resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== -non-layered-tidy-tree-layout@^2.0.2: - version "2.0.2" - resolved "https://registry.npmmirror.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" - integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -6820,6 +8169,14 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +null-loader@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/null-loader/-/null-loader-4.0.1.tgz#8e63bd3a2dd3c64236a4679428632edd0a6dbc6a" + integrity sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -6967,6 +8324,11 @@ package-json@^8.1.0: registry-url "^6.0.0" semver "^7.3.7" +package-manager-detector@^0.2.0: + version "0.2.2" + resolved "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-0.2.2.tgz#fbbc8afe87cdaee471ca9b89c3700236c6d2d9e5" + integrity sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -7046,6 +8408,11 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-data-parser@0.1.0, path-data-parser@^0.1.0: + version "0.1.0" + resolved "https://registry.npmmirror.com/path-data-parser/-/path-data-parser-0.1.0.tgz#8f5ba5cc70fc7becb3dcefaea08e2659aba60b8c" + integrity sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -7103,6 +8470,11 @@ path-type@^4.0.0: resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + periscopic@^3.0.0: version "3.1.0" resolved "https://registry.npmmirror.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" @@ -7129,6 +8501,15 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" +pkg-types@^1.0.3, pkg-types@^1.2.0: + version "1.2.1" + resolved "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.2.1.tgz#6ac4e455a5bb4b9a6185c1c79abd544c901db2e5" + integrity sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw== + dependencies: + confbox "^0.1.8" + mlly "^1.7.2" + pathe "^1.1.2" + pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.npmmirror.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" @@ -7136,6 +8517,19 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +points-on-curve@0.2.0, points-on-curve@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/points-on-curve/-/points-on-curve-0.2.0.tgz#7dbb98c43791859434284761330fa893cb81b4d1" + integrity sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A== + +points-on-path@^0.2.1: + version "0.2.1" + resolved "https://registry.npmmirror.com/points-on-path/-/points-on-path-0.2.1.tgz#553202b5424c53bed37135b318858eacff85dd52" + integrity sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g== + dependencies: + path-data-parser "0.1.0" + points-on-curve "0.2.0" + postcss-calc@^9.0.1: version "9.0.1" resolved "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-9.0.1.tgz#a744fd592438a93d6de0f1434c572670361eb6c6" @@ -7438,7 +8832,7 @@ pretty-time@^1.1.0: resolved "https://registry.npmmirror.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^2.3.0, prism-react-renderer@^2.3.1: +prism-react-renderer@^2.3.0, prism-react-renderer@^2.4.0: version "2.4.0" resolved "https://registry.npmmirror.com/prism-react-renderer/-/prism-react-renderer-2.4.0.tgz#c5ea692029c2f8b3fd04f63662d04ffd4eaf10a0" integrity sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw== @@ -7914,6 +9308,11 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -7982,6 +9381,16 @@ robust-predicates@^3.0.2: resolved "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== +roughjs@^4.6.6: + version "4.6.6" + resolved "https://registry.npmmirror.com/roughjs/-/roughjs-4.6.6.tgz#1059f49a5e0c80dee541a005b20cc322b222158b" + integrity sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ== + dependencies: + hachure-fill "^0.5.2" + path-data-parser "^0.1.0" + points-on-curve "^0.2.0" + points-on-path "^0.2.1" + rtl-detect@^1.0.4: version "1.1.2" resolved "https://registry.npmmirror.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" @@ -8009,13 +9418,6 @@ rw@1: resolved "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.npmmirror.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8135,7 +9537,7 @@ serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-handler@^6.1.5: +serve-handler@^6.1.5, serve-handler@^6.1.6: version "6.1.6" resolved "https://registry.npmmirror.com/serve-handler/-/serve-handler-6.1.6.tgz#50803c1d3e947cd4a341d617f8209b22bd76cfa1" integrity sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ== @@ -8380,7 +9782,7 @@ statuses@2.0.1: resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -std-env@^3.0.1: +std-env@^3.0.1, std-env@^3.7.0: version "3.7.0" resolved "https://registry.npmmirror.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== @@ -8434,7 +9836,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -8490,7 +9892,7 @@ stylehacks@^6.1.1: browserslist "^4.23.0" postcss-selector-parser "^6.0.16" -stylis@^4.1.3: +stylis@^4.3.1: version "4.3.4" resolved "https://registry.npmmirror.com/stylis/-/stylis-4.3.4.tgz#ca5c6c4a35c4784e4e93a2a24dc4e9fa075250a4" integrity sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now== @@ -8590,6 +9992,11 @@ tiny-warning@^1.0.0: resolved "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyexec@^0.3.0: + version "0.3.1" + resolved "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.1.tgz#0ab0daf93b43e2c211212396bdb836b468c97c98" + integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -8632,6 +10039,11 @@ tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0: resolved "https://registry.npmmirror.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^1.0.1: version "1.4.0" resolved "https://registry.npmmirror.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" @@ -8662,6 +10074,11 @@ typescript@^5.3.2: resolved "https://registry.npmmirror.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== +ufo@^1.5.4: + version "1.5.4" + resolved "https://registry.npmmirror.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== + undici-types@~6.19.2: version "6.19.8" resolved "https://registry.npmmirror.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" @@ -8741,13 +10158,6 @@ unist-util-position@^5.0.0: dependencies: "@types/unist" "^3.0.0" -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position@^4.0.0: version "4.0.0" resolved "https://registry.npmmirror.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" @@ -8851,21 +10261,11 @@ uuid@^8.3.2: resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: +uuid@^9.0.1: version "9.0.1" resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.npmmirror.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - value-equal@^1.0.1: version "1.0.1" resolved "https://registry.npmmirror.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -8900,6 +10300,41 @@ vfile@^6.0.0, vfile@^6.0.1: "@types/unist" "^3.0.0" vfile-message "^4.0.0" +vscode-jsonrpc@8.2.0: + version "8.2.0" + resolved "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz#f43dfa35fb51e763d17cd94dcca0c9458f35abf9" + integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== + +vscode-languageserver-protocol@3.17.5: + version "3.17.5" + resolved "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz#864a8b8f390835572f4e13bd9f8313d0e3ac4bea" + integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== + dependencies: + vscode-jsonrpc "8.2.0" + vscode-languageserver-types "3.17.5" + +vscode-languageserver-textdocument@~1.0.11: + version "1.0.12" + resolved "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== + +vscode-languageserver-types@3.17.5: + version "3.17.5" + resolved "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== + +vscode-languageserver@~9.0.1: + version "9.0.1" + resolved "https://registry.npmmirror.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz#500aef82097eb94df90d008678b0b6b5f474015b" + integrity sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g== + dependencies: + vscode-languageserver-protocol "3.17.5" + +vscode-uri@~3.0.8: + version "3.0.8" + resolved "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + watchpack@^2.4.1: version "2.4.2" resolved "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" @@ -8920,12 +10355,7 @@ web-namespaces@^2.0.0: resolved "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -web-worker@^1.2.0: - version "1.3.0" - resolved "https://registry.npmmirror.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" - integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== - -webpack-bundle-analyzer@^4.9.0: +webpack-bundle-analyzer@^4.10.2, webpack-bundle-analyzer@^4.9.0: version "4.10.2" resolved "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== @@ -8954,7 +10384,7 @@ webpack-dev-middleware@^5.3.4: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.15.1: +webpack-dev-server@^4.15.1, webpack-dev-server@^4.15.2: version "4.15.2" resolved "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== @@ -8999,6 +10429,15 @@ webpack-merge@^5.9.0: flat "^5.0.2" wildcard "^2.0.0" +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" + webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" @@ -9033,6 +10472,35 @@ webpack@^5.88.1: watchpack "^2.4.1" webpack-sources "^3.2.3" +webpack@^5.95.0: + version "5.96.1" + resolved "https://registry.npmmirror.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c" + integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.14.0" + browserslist "^4.24.0" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + webpackbar@^5.0.2: version "5.0.2" resolved "https://registry.npmmirror.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" @@ -9043,6 +10511,20 @@ webpackbar@^5.0.2: pretty-time "^1.1.0" std-env "^3.0.1" +webpackbar@^6.0.1: + version "6.0.1" + resolved "https://registry.npmmirror.com/webpackbar/-/webpackbar-6.0.1.tgz#5ef57d3bf7ced8b19025477bc7496ea9d502076b" + integrity sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q== + dependencies: + ansi-escapes "^4.3.2" + chalk "^4.1.2" + consola "^3.2.3" + figures "^3.2.0" + markdown-table "^2.0.0" + pretty-time "^1.1.0" + std-env "^3.7.0" + wrap-ansi "^7.0.0" + websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" @@ -9090,11 +10572,20 @@ widest-line@^4.0.1: dependencies: string-width "^5.0.1" -wildcard@^2.0.0: +wildcard@^2.0.0, wildcard@^2.0.1: version "2.0.1" resolved "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" diff --git a/Source/Basic/Application.cpp b/Source/Basic/Application.cpp index ec69aa792..194b728cb 100644 --- a/Source/Basic/Application.cpp +++ b/Source/Basic/Application.cpp @@ -32,7 +32,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI #include #define DORA_VERSION "1.5.19"_slice -#define DORA_REVISION "6"_slice +#define DORA_REVISION "7"_slice #if BX_PLATFORM_ANDROID #include diff --git a/Source/ML/ML.cpp b/Source/ML/ML.cpp index 2f6d71cd9..f17fc6cd7 100644 --- a/Source/ML/ML.cpp +++ b/Source/ML/ML.cpp @@ -18,6 +18,7 @@ NS_BEGIN(ML) void BuildDecisionTreeAsync(String data, int maxDepth, const std::function& handleTree) { + data.trimSpace(); auto dataStr = std::make_shared(data.rawData(), data.size()); SharedAsyncThread.run( [dataStr, maxDepth]() {