From f9761b7b84143df2467e58902d808d61fab1d2c5 Mon Sep 17 00:00:00 2001 From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com> Date: Wed, 9 Apr 2025 22:39:12 -0400 Subject: [PATCH] Try fix prettier format --- docs/.vuepress/config.ts | 28 +- docs/.vuepress/config/index.ts | 4 +- docs/.vuepress/config/navbar/en.ts | 14 +- docs/.vuepress/config/navbar/index.ts | 6 +- docs/.vuepress/config/navbar/ru.ts | 14 +- docs/.vuepress/config/navbar/zh.ts | 14 +- docs/.vuepress/config/sidebar/en.ts | 230 +- docs/.vuepress/config/sidebar/index.ts | 6 +- docs/.vuepress/config/sidebar/ru.ts | 214 +- docs/.vuepress/config/sidebar/zh.ts | 214 +- .../.vuepress/plugins/mermaid/node/mermaid.ts | 21 +- docs/.vuepress/theme.ts | 127 +- docs/.vuepress/theme/components/Mermaid.vue | 25 +- docs/.vuepress/theme/index.ts | 1 - docs/about/news.md | 6 +- docs/config/api.md | 9 +- docs/config/dns.md | 10 +- docs/config/features/browser_dialer.md | 14 +- docs/config/features/multiple.md | 6 +- docs/config/inbounds/wireguard.md | 9 +- docs/config/metrics.md | 169 +- docs/config/observatory.md | 12 +- docs/config/outbounds/dns.md | 2 +- docs/config/outbounds/freedom.md | 16 +- docs/config/outbounds/loopback.md | 6 +- docs/config/outbounds/vmess.md | 1 - docs/config/outbounds/wireguard.md | 5 +- docs/config/policy.md | 2 +- docs/config/reverse.md | 63 +- docs/config/routing.md | 27 +- docs/config/transport.md | 9 +- docs/config/transports/httpupgrade.md | 6 +- docs/config/transports/websocket.md | 6 +- docs/development/intro/guide.md | 10 +- docs/document/command.md | 14 +- docs/document/config.md | 7 +- docs/document/install.md | 2 +- docs/document/level-0/ch04-security.md | 2 +- docs/document/level-0/ch05-webpage.md | 10 +- docs/document/level-2/redirect.md | 11 +- docs/document/level-2/tproxy.md | 2 +- .../transparent_proxy/transparent_proxy.md | 1 + docs/document/level-2/warp.md | 82 +- docs/en/about/news.md | 7 +- docs/en/config/api.md | 12 +- docs/en/config/dns.md | 8 +- docs/en/config/features/browser_dialer.md | 12 +- docs/en/config/inbounds/shadowsocks.md | 10 +- docs/en/config/inbounds/vless.md | 4 +- docs/en/config/inbounds/wireguard.md | 4 +- docs/en/config/log.md | 6 +- docs/en/config/metrics.md | 170 +- docs/en/config/observatory.md | 12 +- docs/en/config/outbounds/freedom.md | 36 +- docs/en/config/outbounds/loopback.md | 20 +- docs/en/config/outbounds/wireguard.md | 16 +- docs/en/config/transport.md | 2 +- docs/en/config/transports/httpupgrade.md | 8 +- docs/en/config/transports/websocket.md | 2 +- docs/en/document/command.md | 6 + docs/en/document/install.md | 2 +- docs/en/document/level-0/ch01-preface.md | 3 +- docs/en/document/level-0/ch02-preparation.md | 2 +- docs/en/document/level-0/ch07-xray-server.md | 414 +- docs/ru/README.md | 9 +- docs/ru/about/news.md | 8 +- docs/ru/config/README.md | 20 +- docs/ru/config/api.md | 13 +- docs/ru/config/dns.md | 26 +- docs/ru/config/fakedns.md | 4 - docs/ru/config/features/browser_dialer.md | 13 +- docs/ru/config/features/env.md | 2 +- docs/ru/config/features/fallback.md | 2 - docs/ru/config/features/multiple.md | 8 +- docs/ru/config/features/xtls.md | 2 - docs/ru/config/inbound.md | 19 +- docs/ru/config/inbounds/http.md | 4 +- docs/ru/config/inbounds/shadowsocks.md | 12 +- docs/ru/config/inbounds/socks.md | 3 +- docs/ru/config/inbounds/trojan.md | 4 - docs/ru/config/inbounds/vmess.md | 2 - docs/ru/config/inbounds/wireguard.md | 7 +- docs/ru/config/log.md | 15 +- docs/ru/config/metrics.md | 173 +- docs/ru/config/observatory.md | 17 +- docs/ru/config/outbound.md | 15 +- docs/ru/config/outbounds/blackhole.md | 6 +- docs/ru/config/outbounds/freedom.md | 6 +- docs/ru/config/outbounds/http.md | 3 - docs/ru/config/outbounds/loopback.md | 8 +- docs/ru/config/outbounds/shadowsocks.md | 13 +- docs/ru/config/outbounds/socks.md | 3 - docs/ru/config/outbounds/trojan.md | 6 - docs/ru/config/outbounds/vless.md | 3 - docs/ru/config/outbounds/vmess.md | 4 - docs/ru/config/outbounds/wireguard.md | 3 +- docs/ru/config/policy.md | 4 - docs/ru/config/reverse.md | 86 +- docs/ru/config/routing.md | 35 +- docs/ru/config/stats.md | 2 +- docs/ru/config/transport.md | 56 +- docs/ru/config/transports/grpc.md | 2 - docs/ru/config/transports/httpupgrade.md | 5 +- docs/ru/config/transports/mkcp.md | 5 +- docs/ru/config/transports/websocket.md | 3 +- docs/ru/development/README.md | 2 - docs/ru/development/intro/compile.md | 2 - docs/ru/development/intro/design.md | 4 - docs/ru/development/intro/guide.md | 5 +- docs/ru/development/protocols/mkcp.md | 14 +- docs/ru/development/protocols/muxcool.md | 18 +- docs/ru/development/protocols/vless.md | 6 +- docs/ru/development/protocols/vmess.md | 19 +- docs/ru/document/README.md | 3 +- docs/ru/document/command.md | 10 +- docs/ru/document/config.md | 10 +- docs/ru/document/document.md | 2 - docs/ru/document/install.md | 2 +- docs/ru/document/level-0/ch01-preface.md | 12 +- docs/ru/document/level-0/ch02-preparation.md | 4 +- docs/ru/document/level-0/ch03-ssh.md | 14 +- docs/ru/document/level-0/ch04-security.md | 138 +- docs/ru/document/level-0/ch05-webpage.md | 47 +- docs/ru/document/level-0/ch06-certificates.md | 28 +- docs/ru/document/level-0/ch07-xray-server.md | 20 +- docs/ru/document/level-0/ch08-xray-clients.md | 76 +- docs/ru/document/level-0/ch09-appendix.md | 72 +- docs/ru/document/level-1/fallbacks-lv1.md | 78 +- .../ru/document/level-1/fallbacks-with-sni.md | 2 - docs/ru/document/level-1/routing-lv1-part1.md | 52 +- docs/ru/document/level-1/routing-lv1-part2.md | 84 +- docs/ru/document/level-1/work.md | 4 +- docs/ru/document/level-2/README.md | 4 +- docs/ru/document/level-2/iptables_gid.md | 3 +- .../level-2/nginx_or_haproxy_tls_tunnel.md | 47 +- docs/ru/document/level-2/redirect.md | 15 +- docs/ru/document/level-2/tproxy.md | 12 +- .../document/level-2/tproxy_ipv4_and_ipv6.md | 32 +- docs/ru/document/level-2/traffic_stats.md | 4 +- .../transparent_proxy/transparent_proxy.md | 1 + docs/ru/document/level-2/warp.md | 103 +- pnpm-lock.yaml | 7206 +++++++++++------ tsconfig.json | 16 +- vite.config.js | 8 +- 144 files changed, 6723 insertions(+), 4280 deletions(-) diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 992ac3f..04778cc 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -4,22 +4,22 @@ import { webpackBundler } from "@vuepress/bundler-webpack"; import { UserConfig, defineUserConfig } from "vuepress/cli"; import { searchPlugin } from "@vuepress/plugin-search"; import markdownItFootnote from "markdown-it-footnote"; -import theme from './theme.js' -import { registerComponentsPlugin } from '@vuepress/plugin-register-components' -import process from 'node:process' +import theme from "./theme.js"; +import { registerComponentsPlugin } from "@vuepress/plugin-register-components"; +import process from "node:process"; // import { getDirname, path } from '@vuepress/utils' -import { getDirname, path } from 'vuepress/utils' -import { MermaidPlugin } from './plugins/mermaid/node/mermaid' +import { getDirname, path } from "vuepress/utils"; +import { MermaidPlugin } from "./plugins/mermaid/node/mermaid"; import i18nPlugin from "vuepress-plugin-i18n"; -const __dirname = getDirname(import.meta.url) -console.log('>>> __dirname -> ', __dirname) +const __dirname = getDirname(import.meta.url); +console.log(">>> __dirname -> ", __dirname); const isProduction = process.env.NODE_ENV === "production"; const useVite = process.env.XRAY_DOCS_USE_VITE === "true"; console.log( "bundler:", - isProduction && !useVite ? "@vuepress/webpack" : "@vuepress/vite" + isProduction && !useVite ? "@vuepress/webpack" : "@vuepress/vite", ); export default defineUserConfig({ @@ -31,13 +31,13 @@ export default defineUserConfig({ en: { lang: "en-US", untranslated: { - title: "Untranslated" + title: "Untranslated", }, outdated: { - title: "Outdated" - } - } - } + title: "Outdated", + }, + }, + }, }), searchPlugin({ locales: { @@ -47,7 +47,7 @@ export default defineUserConfig({ }, }), registerComponentsPlugin({ - componentsDir: path.resolve(__dirname, './theme/components'), + componentsDir: path.resolve(__dirname, "./theme/components"), }), ], base: "/", diff --git a/docs/.vuepress/config/index.ts b/docs/.vuepress/config/index.ts index e931492..4c2bb19 100755 --- a/docs/.vuepress/config/index.ts +++ b/docs/.vuepress/config/index.ts @@ -1,3 +1,3 @@ // export * from './head' -export * from './navbar/index.js' -export * from './sidebar/index.js' +export * from "./navbar/index.js"; +export * from "./sidebar/index.js"; diff --git a/docs/.vuepress/config/navbar/en.ts b/docs/.vuepress/config/navbar/en.ts index 4f71c0c..f01b4f5 100755 --- a/docs/.vuepress/config/navbar/en.ts +++ b/docs/.vuepress/config/navbar/en.ts @@ -1,10 +1,10 @@ -import { NavbarConfig } from '@vuepress/theme-default' +import { NavbarConfig } from "@vuepress/theme-default"; // TODO: translation export const navbarEn: NavbarConfig = [ - { text: 'Homepage', link: '/en' }, - { text: 'The Great Chronicles', link: '/en/about/news.md' }, - { text: 'Config Reference', link: '/en/config/' }, - { text: 'Developer Guide', link: '/en/development/' }, - { text: 'Quick Start', link: '/en/document/' }, -] + { text: "Homepage", link: "/en" }, + { text: "The Great Chronicles", link: "/en/about/news.md" }, + { text: "Config Reference", link: "/en/config/" }, + { text: "Developer Guide", link: "/en/development/" }, + { text: "Quick Start", link: "/en/document/" }, +]; diff --git a/docs/.vuepress/config/navbar/index.ts b/docs/.vuepress/config/navbar/index.ts index 90c5748..f04ff68 100755 --- a/docs/.vuepress/config/navbar/index.ts +++ b/docs/.vuepress/config/navbar/index.ts @@ -1,3 +1,3 @@ -export * from './en.js' -export * from './zh.js' -export * from './ru.js' \ No newline at end of file +export * from "./en.js"; +export * from "./zh.js"; +export * from "./ru.js"; diff --git a/docs/.vuepress/config/navbar/ru.ts b/docs/.vuepress/config/navbar/ru.ts index 00b0b0c..a735deb 100644 --- a/docs/.vuepress/config/navbar/ru.ts +++ b/docs/.vuepress/config/navbar/ru.ts @@ -1,9 +1,9 @@ -import { NavbarConfig } from '@vuepress/theme-default' +import { NavbarConfig } from "@vuepress/theme-default"; export const navbarRu: NavbarConfig = [ - { text: 'Главная', link: '/ru' }, - { text: 'История сайта', link: '/ru/about/news.md' }, - { text: 'Справочник по конфигурации', link: '/ru/config/' }, - { text: 'Руководство разработчика', link: '/ru/development/' }, - { text: 'Быстрый старт', link: '/ru/document/' }, -] + { text: "Главная", link: "/ru" }, + { text: "История сайта", link: "/ru/about/news.md" }, + { text: "Справочник по конфигурации", link: "/ru/config/" }, + { text: "Руководство разработчика", link: "/ru/development/" }, + { text: "Быстрый старт", link: "/ru/document/" }, +]; diff --git a/docs/.vuepress/config/navbar/zh.ts b/docs/.vuepress/config/navbar/zh.ts index 2cf90e7..b3b134e 100755 --- a/docs/.vuepress/config/navbar/zh.ts +++ b/docs/.vuepress/config/navbar/zh.ts @@ -1,9 +1,9 @@ -import { NavbarConfig } from '@vuepress/theme-default' +import { NavbarConfig } from "@vuepress/theme-default"; export const navbarZh: NavbarConfig = [ - { text: '首页', link: '/' }, - { text: '大史记', link: '/about/news.md' }, - { text: '配置指南', link: '/config/' }, - { text: '开发指南', link: '/development/' }, - { text: '使用指南', link: '/document/' }, -] + { text: "首页", link: "/" }, + { text: "大史记", link: "/about/news.md" }, + { text: "配置指南", link: "/config/" }, + { text: "开发指南", link: "/development/" }, + { text: "使用指南", link: "/document/" }, +]; diff --git a/docs/.vuepress/config/sidebar/en.ts b/docs/.vuepress/config/sidebar/en.ts index bb36614..cfd858a 100755 --- a/docs/.vuepress/config/sidebar/en.ts +++ b/docs/.vuepress/config/sidebar/en.ts @@ -1,147 +1,147 @@ -import type { SidebarConfig } from '@vuepress/theme-default' +import type { SidebarConfig } from "@vuepress/theme-default"; export const sidebarEn: SidebarConfig = { - '/en/config/': [ + "/en/config/": [ { - text: 'feature', + text: "feature", children: [ - '/en/config/features/xtls.md', - '/en/config/features/fallback.md', - '/en/config/features/browser_dialer.md', - '/en/config/features/env.md', - '/en/config/features/multiple.md', + "/en/config/features/xtls.md", + "/en/config/features/fallback.md", + "/en/config/features/browser_dialer.md", + "/en/config/features/env.md", + "/en/config/features/multiple.md", ], }, { - text: 'config', + text: "config", children: [ - '/en/config/README.md', - '/en/config/log.md', - '/en/config/api.md', - '/en/config/dns.md', - '/en/config/fakedns.md', - '/en/config/inbound.md', - '/en/config/outbound.md', - '/en/config/policy.md', - '/en/config/reverse.md', - '/en/config/routing.md', - '/en/config/stats.md', - '/en/config/transport.md', - '/en/config/metrics.md', - '/en/config/observatory.md', + "/en/config/README.md", + "/en/config/log.md", + "/en/config/api.md", + "/en/config/dns.md", + "/en/config/fakedns.md", + "/en/config/inbound.md", + "/en/config/outbound.md", + "/en/config/policy.md", + "/en/config/reverse.md", + "/en/config/routing.md", + "/en/config/stats.md", + "/en/config/transport.md", + "/en/config/metrics.md", + "/en/config/observatory.md", ], }, { - text: 'inbound', + text: "inbound", children: [ - '/en/config/inbounds/dokodemo.md', - '/en/config/inbounds/http.md', - '/en/config/inbounds/shadowsocks.md', - '/en/config/inbounds/socks.md', - '/en/config/inbounds/trojan.md', - '/en/config/inbounds/vless.md', - '/en/config/inbounds/vmess.md', - '/en/config/inbounds/wireguard.md', + "/en/config/inbounds/dokodemo.md", + "/en/config/inbounds/http.md", + "/en/config/inbounds/shadowsocks.md", + "/en/config/inbounds/socks.md", + "/en/config/inbounds/trojan.md", + "/en/config/inbounds/vless.md", + "/en/config/inbounds/vmess.md", + "/en/config/inbounds/wireguard.md", ], }, { - text: 'outbound', + text: "outbound", children: [ - '/en/config/outbounds/blackhole.md', - '/en/config/outbounds/dns.md', - '/en/config/outbounds/freedom.md', - '/en/config/outbounds/http.md', - '/en/config/outbounds/loopback.md', - '/en/config/outbounds/shadowsocks.md', - '/en/config/outbounds/socks.md', - '/en/config/outbounds/trojan.md', - '/en/config/outbounds/vless.md', - '/en/config/outbounds/vmess.md', - '/en/config/outbounds/wireguard.md', + "/en/config/outbounds/blackhole.md", + "/en/config/outbounds/dns.md", + "/en/config/outbounds/freedom.md", + "/en/config/outbounds/http.md", + "/en/config/outbounds/loopback.md", + "/en/config/outbounds/shadowsocks.md", + "/en/config/outbounds/socks.md", + "/en/config/outbounds/trojan.md", + "/en/config/outbounds/vless.md", + "/en/config/outbounds/vmess.md", + "/en/config/outbounds/wireguard.md", ], }, { - text: 'transport', + text: "transport", children: [ - '/en/config/transports/raw.md', - '/en/config/transports/xhttp.md', - '/en/config/transports/mkcp.md', - '/en/config/transports/grpc.md', - '/en/config/transports/websocket.md', - '/en/config/transports/httpupgrade.md', + "/en/config/transports/raw.md", + "/en/config/transports/xhttp.md", + "/en/config/transports/mkcp.md", + "/en/config/transports/grpc.md", + "/en/config/transports/websocket.md", + "/en/config/transports/httpupgrade.md", ], }, ], - '/en/document/': [ + "/en/document/": [ { - text: 'Quick Start', + text: "Quick Start", children: [ - '/en/document/README.md', - '/en/document/install.md', - '/en/document/config.md', - '/en/document/command.md', - '/en/document/document.md', - ] - }, - { - text: 'Beginner Tutorial', - children: [ - '/en/document/level-0/README.md', - '/en/document/level-0/ch01-preface.md', - '/en/document/level-0/ch02-preparation.md', - '/en/document/level-0/ch03-ssh.md', - '/en/document/level-0/ch04-security.md', - '/en/document/level-0/ch05-webpage.md', - '/en/document/level-0/ch06-certificates.md', - '/en/document/level-0/ch07-xray-server.md', - '/en/document/level-0/ch08-xray-clients.md', - '/en/document/level-0/ch09-appendix.md', - ] - }, - { - text: 'Getting Started Tips', - children: [ - '/en/document/level-1/README.md', - '/en/document/level-1/fallbacks-lv1.md', - '/en/document/level-1/routing-lv1-part1.md', - '/en/document/level-1/routing-lv1-part2.md', - '/en/document/level-1/work.md', - '/en/document/level-1/fallbacks-with-sni.md', - ] - }, - { - text: 'Advanced Documentation', - children: [ - '/en/document/level-2/README.md', - '/en/document/level-2/transparent_proxy/transparent_proxy.md', - '/en/document/level-2/tproxy.md', - '/en/document/level-2/tproxy_ipv4_and_ipv6.md', - '/en/document/level-2/nginx_or_haproxy_tls_tunnel.md', - '/en/document/level-2/iptables_gid.md', - '/en/document/level-2/redirect.md', - '/en/document/level-2/warp.md', - '/en/document/level-2/traffic_stats.md', - ] - } - ], - '/en/development/': [ - { - text: 'Developer Guide', - children: [ - '/en/development/README.md', - '/en/development/intro/compile.md', - '/en/development/intro/design.md', - '/en/development/intro/guide.md', + "/en/document/README.md", + "/en/document/install.md", + "/en/document/config.md", + "/en/document/command.md", + "/en/document/document.md", ], }, { - text: 'Protocol Details', + text: "Beginner Tutorial", children: [ - '/en/development/protocols/vless.md', - '/en/development/protocols/vmess.md', - '/en/development/protocols/muxcool.md', - '/en/development/protocols/mkcp.md', + "/en/document/level-0/README.md", + "/en/document/level-0/ch01-preface.md", + "/en/document/level-0/ch02-preparation.md", + "/en/document/level-0/ch03-ssh.md", + "/en/document/level-0/ch04-security.md", + "/en/document/level-0/ch05-webpage.md", + "/en/document/level-0/ch06-certificates.md", + "/en/document/level-0/ch07-xray-server.md", + "/en/document/level-0/ch08-xray-clients.md", + "/en/document/level-0/ch09-appendix.md", + ], + }, + { + text: "Getting Started Tips", + children: [ + "/en/document/level-1/README.md", + "/en/document/level-1/fallbacks-lv1.md", + "/en/document/level-1/routing-lv1-part1.md", + "/en/document/level-1/routing-lv1-part2.md", + "/en/document/level-1/work.md", + "/en/document/level-1/fallbacks-with-sni.md", + ], + }, + { + text: "Advanced Documentation", + children: [ + "/en/document/level-2/README.md", + "/en/document/level-2/transparent_proxy/transparent_proxy.md", + "/en/document/level-2/tproxy.md", + "/en/document/level-2/tproxy_ipv4_and_ipv6.md", + "/en/document/level-2/nginx_or_haproxy_tls_tunnel.md", + "/en/document/level-2/iptables_gid.md", + "/en/document/level-2/redirect.md", + "/en/document/level-2/warp.md", + "/en/document/level-2/traffic_stats.md", ], }, ], -} + "/en/development/": [ + { + text: "Developer Guide", + children: [ + "/en/development/README.md", + "/en/development/intro/compile.md", + "/en/development/intro/design.md", + "/en/development/intro/guide.md", + ], + }, + { + text: "Protocol Details", + children: [ + "/en/development/protocols/vless.md", + "/en/development/protocols/vmess.md", + "/en/development/protocols/muxcool.md", + "/en/development/protocols/mkcp.md", + ], + }, + ], +}; diff --git a/docs/.vuepress/config/sidebar/index.ts b/docs/.vuepress/config/sidebar/index.ts index 527d6a3..f04ff68 100755 --- a/docs/.vuepress/config/sidebar/index.ts +++ b/docs/.vuepress/config/sidebar/index.ts @@ -1,3 +1,3 @@ -export * from './en.js' -export * from './zh.js' -export * from './ru.js' +export * from "./en.js"; +export * from "./zh.js"; +export * from "./ru.js"; diff --git a/docs/.vuepress/config/sidebar/ru.ts b/docs/.vuepress/config/sidebar/ru.ts index eca293e..d6cd4d5 100644 --- a/docs/.vuepress/config/sidebar/ru.ts +++ b/docs/.vuepress/config/sidebar/ru.ts @@ -1,147 +1,147 @@ -import type { SidebarConfig } from '@vuepress/theme-default' +import type { SidebarConfig } from "@vuepress/theme-default"; export const sidebarRu: SidebarConfig = { - '/ru/config/': [ + "/ru/config/": [ { - text: 'Описание функций', + text: "Описание функций", children: [ - '/ru/config/features/xtls.md', - '/ru/config/features/fallback.md', - '/ru/config/features/browser_dialer.md', - '/ru/config/features/env.md', - '/ru/config/features/multiple.md', + "/ru/config/features/xtls.md", + "/ru/config/features/fallback.md", + "/ru/config/features/browser_dialer.md", + "/ru/config/features/env.md", + "/ru/config/features/multiple.md", ], }, { - text: 'Базовая конфигурация', + text: "Базовая конфигурация", children: [ - '/ru/config/README.md', - '/ru/config/log.md', - '/ru/config/api.md', - '/ru/config/dns.md', - '/ru/config/fakedns.md', - '/ru/config/inbound.md', - '/ru/config/outbound.md', - '/ru/config/policy.md', - '/ru/config/reverse.md', - '/ru/config/routing.md', - '/ru/config/stats.md', - '/ru/config/transport.md', - '/ru/config/metrics.md', - '/ru/config/observatory.md', + "/ru/config/README.md", + "/ru/config/log.md", + "/ru/config/api.md", + "/ru/config/dns.md", + "/ru/config/fakedns.md", + "/ru/config/inbound.md", + "/ru/config/outbound.md", + "/ru/config/policy.md", + "/ru/config/reverse.md", + "/ru/config/routing.md", + "/ru/config/stats.md", + "/ru/config/transport.md", + "/ru/config/metrics.md", + "/ru/config/observatory.md", ], }, { - text: 'Входящие подключения', + text: "Входящие подключения", children: [ - '/ru/config/inbounds/dokodemo.md', - '/ru/config/inbounds/http.md', - '/ru/config/inbounds/shadowsocks.md', - '/ru/config/inbounds/socks.md', - '/ru/config/inbounds/trojan.md', - '/ru/config/inbounds/vless.md', - '/ru/config/inbounds/vmess.md', - '/ru/config/inbounds/wireguard.md', + "/ru/config/inbounds/dokodemo.md", + "/ru/config/inbounds/http.md", + "/ru/config/inbounds/shadowsocks.md", + "/ru/config/inbounds/socks.md", + "/ru/config/inbounds/trojan.md", + "/ru/config/inbounds/vless.md", + "/ru/config/inbounds/vmess.md", + "/ru/config/inbounds/wireguard.md", ], }, { - text: 'Исходящие подключения', + text: "Исходящие подключения", children: [ - '/ru/config/outbounds/blackhole.md', - '/ru/config/outbounds/dns.md', - '/ru/config/outbounds/freedom.md', - '/ru/config/outbounds/http.md', - '/ru/config/outbounds/loopback.md', - '/ru/config/outbounds/shadowsocks.md', - '/ru/config/outbounds/socks.md', - '/ru/config/outbounds/trojan.md', - '/ru/config/outbounds/vless.md', - '/ru/config/outbounds/vmess.md', - '/ru/config/outbounds/wireguard.md', + "/ru/config/outbounds/blackhole.md", + "/ru/config/outbounds/dns.md", + "/ru/config/outbounds/freedom.md", + "/ru/config/outbounds/http.md", + "/ru/config/outbounds/loopback.md", + "/ru/config/outbounds/shadowsocks.md", + "/ru/config/outbounds/socks.md", + "/ru/config/outbounds/trojan.md", + "/ru/config/outbounds/vless.md", + "/ru/config/outbounds/vmess.md", + "/ru/config/outbounds/wireguard.md", ], }, { - text: 'Транспортный уровень', + text: "Транспортный уровень", children: [ - '/ru/config/transports/raw.md', - '/ru/config/transports/xhttp.md', - '/ru/config/transports/mkcp.md', - '/ru/config/transports/grpc.md', - '/ru/config/transports/websocket.md', - '/ru/config/transports/httpupgrade.md', + "/ru/config/transports/raw.md", + "/ru/config/transports/xhttp.md", + "/ru/config/transports/mkcp.md", + "/ru/config/transports/grpc.md", + "/ru/config/transports/websocket.md", + "/ru/config/transports/httpupgrade.md", ], }, ], - '/ru/document/': [ + "/ru/document/": [ { - text: 'Быстрый старт', + text: "Быстрый старт", children: [ - '/ru/document/README.md', - '/ru/document/install.md', - '/ru/document/config.md', - '/ru/document/command.md', - '/ru/document/document.md', + "/ru/document/README.md", + "/ru/document/install.md", + "/ru/document/config.md", + "/ru/document/command.md", + "/ru/document/document.md", ], }, { - text: 'Простыми словами', + text: "Простыми словами", children: [ - '/ru/document/level-0/README.md', - '/ru/document/level-0/ch01-preface.md', - '/ru/document/level-0/ch02-preparation.md', - '/ru/document/level-0/ch03-ssh.md', - '/ru/document/level-0/ch04-security.md', - '/ru/document/level-0/ch05-webpage.md', - '/ru/document/level-0/ch06-certificates.md', - '/ru/document/level-0/ch07-xray-server.md', - '/ru/document/level-0/ch08-xray-clients.md', - '/ru/document/level-0/ch09-appendix.md', + "/ru/document/level-0/README.md", + "/ru/document/level-0/ch01-preface.md", + "/ru/document/level-0/ch02-preparation.md", + "/ru/document/level-0/ch03-ssh.md", + "/ru/document/level-0/ch04-security.md", + "/ru/document/level-0/ch05-webpage.md", + "/ru/document/level-0/ch06-certificates.md", + "/ru/document/level-0/ch07-xray-server.md", + "/ru/document/level-0/ch08-xray-clients.md", + "/ru/document/level-0/ch09-appendix.md", ], }, { - text: 'Базовые навыки', + text: "Базовые навыки", children: [ - '/ru/document/level-1/README.md', - '/ru/document/level-1/fallbacks-lv1.md', - '/ru/document/level-1/routing-lv1-part1.md', - '/ru/document/level-1/routing-lv1-part2.md', - '/ru/document/level-1/work.md', - '/ru/document/level-1/fallbacks-with-sni.md', + "/ru/document/level-1/README.md", + "/ru/document/level-1/fallbacks-lv1.md", + "/ru/document/level-1/routing-lv1-part1.md", + "/ru/document/level-1/routing-lv1-part2.md", + "/ru/document/level-1/work.md", + "/ru/document/level-1/fallbacks-with-sni.md", ], }, { - text: 'Продвинутые навыки', + text: "Продвинутые навыки", children: [ - '/ru/document/level-2/README.md', - '/ru/document/level-2/transparent_proxy/transparent_proxy.md', - '/ru/document/level-2/tproxy.md', - '/ru/document/level-2/tproxy_ipv4_and_ipv6.md', - '/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md', - '/ru/document/level-2/iptables_gid.md', - '/ru/document/level-2/redirect.md', - '/ru/document/level-2/warp.md', - '/ru/document/level-2/traffic_stats.md', - ], - } - ], - '/ru/development/': [ - { - text: 'Руководство разработчика', - children: [ - '/ru/development/README.md', - '/ru/development/intro/compile.md', - '/ru/development/intro/design.md', - '/ru/development/intro/guide.md', - ], - }, - { - text: 'Описание протоколов', - children: [ - '/ru/development/protocols/vless.md', - '/ru/development/protocols/vmess.md', - '/ru/development/protocols/muxcool.md', - '/ru/development/protocols/mkcp.md', + "/ru/document/level-2/README.md", + "/ru/document/level-2/transparent_proxy/transparent_proxy.md", + "/ru/document/level-2/tproxy.md", + "/ru/document/level-2/tproxy_ipv4_and_ipv6.md", + "/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md", + "/ru/document/level-2/iptables_gid.md", + "/ru/document/level-2/redirect.md", + "/ru/document/level-2/warp.md", + "/ru/document/level-2/traffic_stats.md", ], }, ], -} + "/ru/development/": [ + { + text: "Руководство разработчика", + children: [ + "/ru/development/README.md", + "/ru/development/intro/compile.md", + "/ru/development/intro/design.md", + "/ru/development/intro/guide.md", + ], + }, + { + text: "Описание протоколов", + children: [ + "/ru/development/protocols/vless.md", + "/ru/development/protocols/vmess.md", + "/ru/development/protocols/muxcool.md", + "/ru/development/protocols/mkcp.md", + ], + }, + ], +}; diff --git a/docs/.vuepress/config/sidebar/zh.ts b/docs/.vuepress/config/sidebar/zh.ts index 8a41938..3c97faa 100755 --- a/docs/.vuepress/config/sidebar/zh.ts +++ b/docs/.vuepress/config/sidebar/zh.ts @@ -1,147 +1,147 @@ -import type { SidebarConfig } from '@vuepress/theme-default' +import type { SidebarConfig } from "@vuepress/theme-default"; export const sidebarZh: SidebarConfig = { - '/config/': [ + "/config/": [ { - text: '特性详解', + text: "特性详解", children: [ - '/config/features/xtls.md', - '/config/features/fallback.md', - '/config/features/browser_dialer.md', - '/config/features/env.md', - '/config/features/multiple.md', + "/config/features/xtls.md", + "/config/features/fallback.md", + "/config/features/browser_dialer.md", + "/config/features/env.md", + "/config/features/multiple.md", ], }, { - text: '基础配置', + text: "基础配置", children: [ - '/config/README.md', - '/config/log.md', - '/config/api.md', - '/config/dns.md', - '/config/fakedns.md', - '/config/inbound.md', - '/config/outbound.md', - '/config/policy.md', - '/config/reverse.md', - '/config/routing.md', - '/config/stats.md', - '/config/transport.md', - '/config/metrics.md', - '/config/observatory.md', + "/config/README.md", + "/config/log.md", + "/config/api.md", + "/config/dns.md", + "/config/fakedns.md", + "/config/inbound.md", + "/config/outbound.md", + "/config/policy.md", + "/config/reverse.md", + "/config/routing.md", + "/config/stats.md", + "/config/transport.md", + "/config/metrics.md", + "/config/observatory.md", ], }, { - text: '入站代理', + text: "入站代理", children: [ - '/config/inbounds/dokodemo.md', - '/config/inbounds/http.md', - '/config/inbounds/shadowsocks.md', - '/config/inbounds/socks.md', - '/config/inbounds/trojan.md', - '/config/inbounds/vless.md', - '/config/inbounds/vmess.md', - '/config/inbounds/wireguard.md', + "/config/inbounds/dokodemo.md", + "/config/inbounds/http.md", + "/config/inbounds/shadowsocks.md", + "/config/inbounds/socks.md", + "/config/inbounds/trojan.md", + "/config/inbounds/vless.md", + "/config/inbounds/vmess.md", + "/config/inbounds/wireguard.md", ], }, { - text: '出站代理', + text: "出站代理", children: [ - '/config/outbounds/blackhole.md', - '/config/outbounds/dns.md', - '/config/outbounds/freedom.md', - '/config/outbounds/http.md', - '/config/outbounds/loopback.md', - '/config/outbounds/shadowsocks.md', - '/config/outbounds/socks.md', - '/config/outbounds/trojan.md', - '/config/outbounds/vless.md', - '/config/outbounds/vmess.md', - '/config/outbounds/wireguard.md', + "/config/outbounds/blackhole.md", + "/config/outbounds/dns.md", + "/config/outbounds/freedom.md", + "/config/outbounds/http.md", + "/config/outbounds/loopback.md", + "/config/outbounds/shadowsocks.md", + "/config/outbounds/socks.md", + "/config/outbounds/trojan.md", + "/config/outbounds/vless.md", + "/config/outbounds/vmess.md", + "/config/outbounds/wireguard.md", ], }, { - text: '底层传输', + text: "底层传输", children: [ - '/config/transports/raw.md', - '/config/transports/xhttp.md', - '/config/transports/mkcp.md', - '/config/transports/grpc.md', - '/config/transports/websocket.md', - '/config/transports/httpupgrade.md', + "/config/transports/raw.md", + "/config/transports/xhttp.md", + "/config/transports/mkcp.md", + "/config/transports/grpc.md", + "/config/transports/websocket.md", + "/config/transports/httpupgrade.md", ], }, ], - '/document/': [ + "/document/": [ { - text: '快速入门文档', + text: "快速入门文档", children: [ - '/document/README.md', - '/document/install.md', - '/document/config.md', - '/document/command.md', - '/document/document.md', + "/document/README.md", + "/document/install.md", + "/document/config.md", + "/document/command.md", + "/document/document.md", ], }, { - text: '小小白白话文', + text: "小小白白话文", children: [ - '/document/level-0/README.md', - '/document/level-0/ch01-preface.md', - '/document/level-0/ch02-preparation.md', - '/document/level-0/ch03-ssh.md', - '/document/level-0/ch04-security.md', - '/document/level-0/ch05-webpage.md', - '/document/level-0/ch06-certificates.md', - '/document/level-0/ch07-xray-server.md', - '/document/level-0/ch08-xray-clients.md', - '/document/level-0/ch09-appendix.md', + "/document/level-0/README.md", + "/document/level-0/ch01-preface.md", + "/document/level-0/ch02-preparation.md", + "/document/level-0/ch03-ssh.md", + "/document/level-0/ch04-security.md", + "/document/level-0/ch05-webpage.md", + "/document/level-0/ch06-certificates.md", + "/document/level-0/ch07-xray-server.md", + "/document/level-0/ch08-xray-clients.md", + "/document/level-0/ch09-appendix.md", ], }, { - text: '入门技巧', + text: "入门技巧", children: [ - '/document/level-1/README.md', - '/document/level-1/fallbacks-lv1.md', - '/document/level-1/routing-lv1-part1.md', - '/document/level-1/routing-lv1-part2.md', - '/document/level-1/work.md', - '/document/level-1/fallbacks-with-sni.md', + "/document/level-1/README.md", + "/document/level-1/fallbacks-lv1.md", + "/document/level-1/routing-lv1-part1.md", + "/document/level-1/routing-lv1-part2.md", + "/document/level-1/work.md", + "/document/level-1/fallbacks-with-sni.md", ], }, { - text: '进阶技巧', + text: "进阶技巧", children: [ - '/document/level-2/README.md', - '/document/level-2/transparent_proxy/transparent_proxy.md', - '/document/level-2/tproxy.md', - '/document/level-2/tproxy_ipv4_and_ipv6.md', - '/document/level-2/nginx_or_haproxy_tls_tunnel.md', - '/document/level-2/iptables_gid.md', - '/document/level-2/redirect.md', - '/document/level-2/warp.md', - '/document/level-2/traffic_stats.md', - ], - } - ], - '/development/': [ - { - text: '开发指南', - children: [ - '/development/README.md', - '/development/intro/compile.md', - '/development/intro/design.md', - '/development/intro/guide.md', - ], - }, - { - text: '协议详解', - children: [ - '/development/protocols/vless.md', - '/development/protocols/vmess.md', - '/development/protocols/muxcool.md', - '/development/protocols/mkcp.md', + "/document/level-2/README.md", + "/document/level-2/transparent_proxy/transparent_proxy.md", + "/document/level-2/tproxy.md", + "/document/level-2/tproxy_ipv4_and_ipv6.md", + "/document/level-2/nginx_or_haproxy_tls_tunnel.md", + "/document/level-2/iptables_gid.md", + "/document/level-2/redirect.md", + "/document/level-2/warp.md", + "/document/level-2/traffic_stats.md", ], }, ], -} + "/development/": [ + { + text: "开发指南", + children: [ + "/development/README.md", + "/development/intro/compile.md", + "/development/intro/design.md", + "/development/intro/guide.md", + ], + }, + { + text: "协议详解", + children: [ + "/development/protocols/vless.md", + "/development/protocols/vmess.md", + "/development/protocols/muxcool.md", + "/development/protocols/mkcp.md", + ], + }, + ], +}; diff --git a/docs/.vuepress/plugins/mermaid/node/mermaid.ts b/docs/.vuepress/plugins/mermaid/node/mermaid.ts index 72e3394..5f57b64 100755 --- a/docs/.vuepress/plugins/mermaid/node/mermaid.ts +++ b/docs/.vuepress/plugins/mermaid/node/mermaid.ts @@ -17,7 +17,8 @@ export const getMermaidContent = ({ content, title = "", }: MermaidOptions): string => `\ -${title +${ + title ? `\ --- title: ${title} @@ -25,20 +26,22 @@ title: ${title} ` : "" - }\ -${diagram === "mermaid" +}\ +${ + diagram === "mermaid" ? "" : `\ ${diagram} ` - }\ -${diagram === "mermaid" || diagram === "sankey-beta" +}\ +${ + diagram === "mermaid" || diagram === "sankey-beta" ? content : content - .split("\n") - .map((line) => (line ? ` ${line}` : "")) - .join("\n") - }\ + .split("\n") + .map((line) => (line ? ` ${line}` : "")) + .join("\n") +}\ `; const getMermaid = (options: MermaidOptions, index: number): string => diff --git a/docs/.vuepress/theme.ts b/docs/.vuepress/theme.ts index 74d0b5e..f99fcf3 100755 --- a/docs/.vuepress/theme.ts +++ b/docs/.vuepress/theme.ts @@ -1,84 +1,91 @@ -import { defaultTheme } from '@vuepress/theme-default' +import { defaultTheme } from "@vuepress/theme-default"; // import { path, getDirname } from '@vuepress/utils' -import { path, getDirname } from 'vuepress/utils' -import process from 'node:process' -import { navbarEn, navbarZh, navbarRu, sidebarEn, sidebarZh, sidebarRu } from './config/index.js' +import { path, getDirname } from "vuepress/utils"; +import process from "node:process"; +import { + navbarEn, + navbarZh, + navbarRu, + sidebarEn, + sidebarZh, + sidebarRu, +} from "./config/index.js"; -let __dirname = getDirname(import.meta.url) -const isProduction = process.env.NODE_ENV === 'production' +let __dirname = getDirname(import.meta.url); +const isProduction = process.env.NODE_ENV === "production"; export default defaultTheme({ - name: 'vuepress-theme-xray', + name: "vuepress-theme-xray", smoothScroll: true, - repo: 'xtls/xray-core', - docsDir: 'docs', - docsRepo: 'xtls/Xray-docs-next', - docsBranch: 'main', + repo: "xtls/xray-core", + docsDir: "docs", + docsRepo: "xtls/Xray-docs-next", + docsBranch: "main", editLinks: true, enableToggle: true, locales: { - '/': { + "/": { navbar: navbarZh, sidebar: sidebarZh, - repoLabel: '查看源码', - editLinkText: '帮助我们改善此页面!', - tip: '提示', - warning: '注意', - danger: '警告', - lastUpdatedText: '最近更改', - selectLanguageName: '简体中文', - selectLanguageText: '🌏 简体中文 / Change language', - selectLanguageAriaLabel: '简体中文 / Change language', - docsDir: 'docs', - backToHome: 'back to home', - openInNewWindow: 'open in new tag', - toggleColorMode: 'toggle color mode', - toggleSidebar: 'toggle side bar', + repoLabel: "查看源码", + editLinkText: "帮助我们改善此页面!", + tip: "提示", + warning: "注意", + danger: "警告", + lastUpdatedText: "最近更改", + selectLanguageName: "简体中文", + selectLanguageText: "🌏 简体中文 / Change language", + selectLanguageAriaLabel: "简体中文 / Change language", + docsDir: "docs", + backToHome: "back to home", + openInNewWindow: "open in new tag", + toggleColorMode: "toggle color mode", + toggleSidebar: "toggle side bar", }, - '/en/': { + "/en/": { // TODO: translation sidebar: sidebarEn, navbar: navbarEn, - selectLanguageName: 'English (WIP)', - selectLanguageText: '🌎 English / Change language', - selectLanguageAriaLabel: 'English / Change language', - editLinkText: 'Help us improve this page on GitHub!', - lastUpdatedText: 'Last Updated', - contributorsText: 'contributors', + selectLanguageName: "English (WIP)", + selectLanguageText: "🌎 English / Change language", + selectLanguageAriaLabel: "English / Change language", + editLinkText: "Help us improve this page on GitHub!", + lastUpdatedText: "Last Updated", + contributorsText: "contributors", // repoLabel: 'Source', - tip: 'Tip', - warning: 'Warning', - danger: 'Danger', + tip: "Tip", + warning: "Warning", + danger: "Danger", // 404 page notFound: [ - '这里什么都没有', - '我们怎么到这来了?', - '这是一个 404 页面', - '看起来我们进入了错误的链接', + "这里什么都没有", + "我们怎么到这来了?", + "这是一个 404 页面", + "看起来我们进入了错误的链接", ], - backToHome: 'back to home', - openInNewWindow: 'open in new tag', - toggleColorMode: 'toggle color mode', - toggleSidebar: 'toggle side bar', + backToHome: "back to home", + openInNewWindow: "open in new tag", + toggleColorMode: "toggle color mode", + toggleSidebar: "toggle side bar", }, - '/ru/': { + "/ru/": { navbar: navbarRu, sidebar: sidebarRu, - repoLabel: 'Посмотреть исходный код', - editLinkText: 'Помогите нам улучшить эту страницу!', - tip: 'Подсказка', - warning: 'Внимание', - danger: 'Предупреждение', - lastUpdatedText: 'Последние изменения', - selectLanguageName: 'Русский', - selectLanguageText: '🌍 Русский / Change language', - selectLanguageAriaLabel: 'Русский / Change language', - docsDir: 'docs', - backToHome: 'На главную', - openInNewWindow: 'Открыть в новой вкладке', - toggleColorMode: 'Переключить цветовую схему', - toggleSidebar: 'Переключить боковую панель', + repoLabel: "Посмотреть исходный код", + editLinkText: "Помогите нам улучшить эту страницу!", + tip: "Подсказка", + warning: "Внимание", + danger: "Предупреждение", + lastUpdatedText: "Последние изменения", + selectLanguageName: "Русский", + selectLanguageText: "🌍 Русский / Change language", + selectLanguageAriaLabel: "Русский / Change language", + docsDir: "docs", + backToHome: "На главную", + openInNewWindow: "Открыть в новой вкладке", + toggleColorMode: "Переключить цветовую схему", + toggleSidebar: "Переключить боковую панель", }, // logo: '/logo.png', @@ -88,4 +95,4 @@ export default defaultTheme({ git: isProduction, }, }, -}) +}); diff --git a/docs/.vuepress/theme/components/Mermaid.vue b/docs/.vuepress/theme/components/Mermaid.vue index 769fe24..fcab678 100644 --- a/docs/.vuepress/theme/components/Mermaid.vue +++ b/docs/.vuepress/theme/components/Mermaid.vue @@ -14,7 +14,7 @@ import { watch, reactive, nextTick, - toRef + toRef, } from "vue"; import { getDarkmodeStatus } from "../../plugins/mermaid/helpers/darkmode.js"; @@ -43,18 +43,20 @@ export default defineComponent({ startOnLoad: false, }); - mermaid.default.render(chartID.value!, decodeURI(rawGraph.value!)).then(({ svg, bindFunctions }) => { - html.innerHtml = svg; - }); + mermaid.default + .render(chartID.value!, decodeURI(rawGraph.value!)) + .then(({ svg, bindFunctions }) => { + html.innerHtml = svg; + }); }; onMounted(() => { - isDarkmode.value = getDarkmodeStatus() - nextTick(renderMermaid) - }) + isDarkmode.value = getDarkmodeStatus(); + nextTick(renderMermaid); + }); // watch darkmode change - if (typeof document !== 'undefined') { + if (typeof document !== "undefined") { useMutationObserver( document.documentElement, () => { @@ -67,17 +69,14 @@ export default defineComponent({ ); } - watch(isDarkmode, () => renderMermaid()); return { tag: chartID, - payload: html - } - + payload: html, + }; }, }); - diff --git a/docs/.vuepress/theme/index.ts b/docs/.vuepress/theme/index.ts index 9d6ed99..e574578 100644 --- a/docs/.vuepress/theme/index.ts +++ b/docs/.vuepress/theme/index.ts @@ -9,7 +9,6 @@ export const docsPlugin: Theme = (options, app) => { name: "xray-docs-theme", extends: "@vuepress/theme-default", clientAppEnhanceFiles: path.resolve(__dirname, "clientAppEnhance.ts"), - }); }; diff --git a/docs/about/news.md b/docs/about/news.md index 3544cd8..7d78058 100644 --- a/docs/about/news.md +++ b/docs/about/news.md @@ -444,9 +444,9 @@ Shadowsocks-2022 是重新设计的全新协议: 现在一个以 Xray-core 为核心的开源、自由的 Android 客户端已经出现——[AnXray](https://github.com/XTLS/AnXray)!由 [@nekohasekai](https://github.com/nekohasekai) 维护。 - - 支持众多协议、插件. - - 首席视觉设计师 [@RPRX](https://github.com/RPRX) 设计了 X-style 的 logo、slogan,以及独一无二的 material 黑白主题。 - - APP 内还有个小彩蛋等你去发现。 +- 支持众多协议、插件. +- 首席视觉设计师 [@RPRX](https://github.com/RPRX) 设计了 X-style 的 logo、slogan,以及独一无二的 material 黑白主题。 +- APP 内还有个小彩蛋等你去发现。 前两天从早到晚反复打磨细节,希望大家多多 Star、关注。 diff --git a/docs/config/api.md b/docs/config/api.md index 0b3e88a..42edad1 100644 --- a/docs/config/api.md +++ b/docs/config/api.md @@ -19,7 +19,12 @@ API 接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供 "api": { "tag": "api", "listen": "127.0.0.1:8080", - "services": ["HandlerService", "LoggerService", "StatsService", "RoutingService"] + "services": [ + "HandlerService", + "LoggerService", + "StatsService", + "RoutingService" + ] } } ``` @@ -106,7 +111,7 @@ API 服务监听的 IP 和端口。这是一个可选配置项。 - bi 查询均衡器统计信息 - bo 强制均衡器选中指定的 outboundTag -可以使用类似于 `./xray help api bi` 这样的命令来查询具体用法。 +可以使用类似于 `./xray help api bi` 这样的命令来查询具体用法。 ### LoggerService diff --git a/docs/config/dns.md b/docs/config/dns.md index 594b995..dd91de2 100644 --- a/docs/config/dns.md +++ b/docs/config/dns.md @@ -58,17 +58,13 @@ Xray 内置的 DNS 模块,主要有两大用途: }, { "address": "https://8.8.8.8/dns-query", - "domains": [ - "geosite:netflix" - ], + "domains": ["geosite:netflix"], "skipFallback": true, "queryStrategy": "UseIPv4" }, { "address": "https://1.1.1.1/dns-query", - "domains": [ - "geosite:openai" - ], + "domains": ["geosite:openai"], "skipFallback": true, "queryStrategy": "UseIPv6" }, @@ -114,7 +110,7 @@ Xray 内置的 DNS 模块,主要有两大用途: 当值是 `"https://host:port/dns-query"` 的形式,如 `"https://dns.google/dns-query"`,Xray 会使用 `DNS over HTTPS` (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 `https://1.1.1.1/dns-query`。也可使用非标准端口和路径,如 `"https://a.b.c.d:8443/my-dns-query"` -当值是 `"h2c://host:port/dns-query"` 的形式,如 `"h2c://dns.google/dns-query"`,Xray 会使用 `DNS over HTTPS` 的请求格式但是将会以明文 h2c 发出请求,不能直接使用,在这种情况下需要自行配置 Freedom 出站 + streamSettings 设置 TLS 为其配置 TLS 以包装成正常的 DOH 请求。用于特殊目的,比如想要自定义 DOH 请求的 SNI 或者使用 utls 的指纹时使用 +当值是 `"h2c://host:port/dns-query"` 的形式,如 `"h2c://dns.google/dns-query"`,Xray 会使用 `DNS over HTTPS` 的请求格式但是将会以明文 h2c 发出请求,不能直接使用,在这种情况下需要自行配置 Freedom 出站 + streamSettings 设置 TLS 为其配置 TLS 以包装成正常的 DOH 请求。用于特殊目的,比如想要自定义 DOH 请求的 SNI 或者使用 utls 的指纹时使用 当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`,Xray 会使用 `DOH 本地模式 (DOHL)` 进行查询,即 DOH 请求不会经过路由组件,直接通过 Freedom outbound 对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。 diff --git a/docs/config/features/browser_dialer.md b/docs/config/features/browser_dialer.md index 9f0913d..423cccf 100644 --- a/docs/config/features/browser_dialer.md +++ b/docs/config/features/browser_dialer.md @@ -9,14 +9,16 @@ 这个方法简洁的实现了真实的浏览器的 TLS 指纹、行为特征。最大程度抗检测与抗封锁。 不过目前的浏览器转发有以下缺点: -* 用户需要手动开浏览器 -* 浏览器发出的连接必须直连 使用 tun 的用户需要特别注意容易形成死循环 -* 浏览器只能发出 HTTP 连接 所以目前仅支持 [WebSocket](../../transports/websocket.md) 与 [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) 传输方式 -* 当浏览器从 `localhost:8080` 页面连接至代理服务端,需要考虑 [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) -* 因为中间经过 JS 处理数据,会有一些性能损耗 -* 不能使用自定义 SNI 或者 Host,也就是说 `SNI == host == address`。自定义 HTTP 头以及其它 `tlsSettings` 项会被忽略 + +- 用户需要手动开浏览器 +- 浏览器发出的连接必须直连 使用 tun 的用户需要特别注意容易形成死循环 +- 浏览器只能发出 HTTP 连接 所以目前仅支持 [WebSocket](../../transports/websocket.md) 与 [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) 传输方式 +- 当浏览器从 `localhost:8080` 页面连接至代理服务端,需要考虑 [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) +- 因为中间经过 JS 处理数据,会有一些性能损耗 +- 不能使用自定义 SNI 或者 Host,也就是说 `SNI == host == address`。自定义 HTTP 头以及其它 `tlsSettings` 项会被忽略 ## 配置方法 + 1. 准备一份 WebSocket 或 XHTTP 配置,注意 address 必须填域名,若需要指定 IP,请配置 DNS 或系统 hosts 2. 使用环境变量启动 Xray `XRAY_BROWSER_DIALER=127.0.0.1:8080`。Windows 上命令为 `set XRAY_BROWSER_DIALER=127.0.0.1:8080` Linux 上命令为 `XRAY_BROWSER_DIALER=127.0.0.1:8080 ./xray -c config.json` 3. 确保浏览器直连(或者在路由中将服务端地址直接由 `freedom` 发出),打开页面 `localhost:8080`,还可以 `F12` 看 `Console` 和 `Network` diff --git a/docs/config/features/multiple.md b/docs/config/features/multiple.md index 1f4dfab..6fcf4ea 100644 --- a/docs/config/features/multiple.md +++ b/docs/config/features/multiple.md @@ -104,19 +104,19 @@ $ xray run -confdir /etc/xray/confs ```json { "log": { - "loglevel": "debug" // 顶级对象覆盖前者 + "loglevel": "debug" // 顶级对象覆盖前者 }, "inbounds": [ { "tag": "socks", // tag 相同时覆盖前者 "protocol": "socks", "listen": "127.0.0.1", - "port": 1080 + "port": 1080 } ], "outbounds": [ { - "tag": "block", // outbounds 添加至最前 + "tag": "block", // outbounds 添加至最前 "protocol": "blackhole" }, { diff --git a/docs/config/inbounds/wireguard.md b/docs/config/inbounds/wireguard.md index ce8ea3a..e26a502 100644 --- a/docs/config/inbounds/wireguard.md +++ b/docs/config/inbounds/wireguard.md @@ -14,10 +14,10 @@ User-space Wireguard 协议实现。 "peers": [ { "publicKey": "PUBLIC_KEY", - "allowedIPs":[""] + "allowedIPs": [""] } ], - "mtu": 1420, // optional, default 1420 + "mtu": 1420 // optional, default 1420 } ``` @@ -44,7 +44,8 @@ Wireguard 底层 tun 的分片大小。 - 16-byte authentication tag ``` -```N-byte encrypted data```即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。 +`N-byte encrypted data`即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。 + > `peers`: \[ [Peers](#peers) \] @@ -66,4 +67,4 @@ peers 服务器列表,其中每一项是一个服务器配置。 > `allowedIPs`: string array -允许的源IP \ No newline at end of file +允许的源IP diff --git a/docs/config/metrics.md b/docs/config/metrics.md index 1a9321b..30b1fc9 100644 --- a/docs/config/metrics.md +++ b/docs/config/metrics.md @@ -36,8 +36,9 @@ metrics 对应的出站代理 tag, 通过设置任意门入站+路由将任意 访问 `http://127.0.0.1:11111/debug/vars` 包含的变量: -* `stats` 包括所有的 inbound outbound user 数据 -* `observatory` 包含了 observatory 观测结果 + +- `stats` 包括所有的 inbound outbound user 数据 +- `observatory` 包含了 observatory 观测结果 例如在 [luci-app-xray](https://github.com/yichya/luci-app-xray) 你可以得到这样的输出 (省略了 cmdline 和 memstats 等标准expvar内容) @@ -45,91 +46,92 @@ metrics 对应的出站代理 tag, 通过设置任意门入站+路由将任意 ```json { - "observatory": { - "tcp_outbound": { - "alive": true, - "delay": 782, - "outbound_tag": "tcp_outbound", - "last_seen_time": 1648477189, - "last_try_time": 1648477189 - }, - "udp_outbound": { - "alive": true, - "delay": 779, - "outbound_tag": "udp_outbound", - "last_seen_time": 1648477191, - "last_try_time": 1648477191 - } + "observatory": { + "tcp_outbound": { + "alive": true, + "delay": 782, + "outbound_tag": "tcp_outbound", + "last_seen_time": 1648477189, + "last_try_time": 1648477189 }, - "stats": { - "inbound": { - "api": { - "downlink": 0, - "uplink": 0 - }, - "dns_server_inbound_5300": { - "downlink": 14286, - "uplink": 5857 - }, - "http_inbound": { - "downlink": 74460, - "uplink": 10231 - }, - "https_inbound": { - "downlink": 0, - "uplink": 0 - }, - "metrics": { - "downlink": 6327, - "uplink": 1347 - }, - "socks_inbound": { - "downlink": 19925615, - "uplink": 5512 - }, - "tproxy_tcp_inbound": { - "downlink": 4739161, - "uplink": 1568869 - }, - "tproxy_udp_inbound": { - "downlink": 0, - "uplink": 2608142 - } - }, - "outbound": { - "blackhole_outbound": { - "downlink": 0, - "uplink": 0 - }, - "direct": { - "downlink": 97714548, - "uplink": 3234617 - }, - "dns_server_outbound": { - "downlink": 7116, - "uplink": 2229 - }, - "manual_tproxy_outbound_tcp_1": { - "downlink": 0, - "uplink": 0 - }, - "manual_tproxy_outbound_udp_1": { - "downlink": 0, - "uplink": 0 - }, - "tcp_outbound": { - "downlink": 23873238, - "uplink": 1049595 - }, - "udp_outbound": { - "downlink": 639282, - "uplink": 74634 - } - }, - "user": {} + "udp_outbound": { + "alive": true, + "delay": 779, + "outbound_tag": "udp_outbound", + "last_seen_time": 1648477191, + "last_try_time": 1648477191 } + }, + "stats": { + "inbound": { + "api": { + "downlink": 0, + "uplink": 0 + }, + "dns_server_inbound_5300": { + "downlink": 14286, + "uplink": 5857 + }, + "http_inbound": { + "downlink": 74460, + "uplink": 10231 + }, + "https_inbound": { + "downlink": 0, + "uplink": 0 + }, + "metrics": { + "downlink": 6327, + "uplink": 1347 + }, + "socks_inbound": { + "downlink": 19925615, + "uplink": 5512 + }, + "tproxy_tcp_inbound": { + "downlink": 4739161, + "uplink": 1568869 + }, + "tproxy_udp_inbound": { + "downlink": 0, + "uplink": 2608142 + } + }, + "outbound": { + "blackhole_outbound": { + "downlink": 0, + "uplink": 0 + }, + "direct": { + "downlink": 97714548, + "uplink": 3234617 + }, + "dns_server_outbound": { + "downlink": 7116, + "uplink": 2229 + }, + "manual_tproxy_outbound_tcp_1": { + "downlink": 0, + "uplink": 0 + }, + "manual_tproxy_outbound_udp_1": { + "downlink": 0, + "uplink": 0 + }, + "tcp_outbound": { + "downlink": 23873238, + "uplink": 1049595 + }, + "udp_outbound": { + "downlink": 639282, + "uplink": 74634 + } + }, + "user": {} + } } ``` + 为了得到更好的可视化输出, 可以使用 [Netdata](https://github.com/netdata/netdata) (with python.d plugin): @@ -244,6 +246,7 @@ xray: id: udp expvar_type: int ``` + 你可以得到类似这样的结果: diff --git a/docs/config/observatory.md b/docs/config/observatory.md index cd15d98..1f5f113 100644 --- a/docs/config/observatory.md +++ b/docs/config/observatory.md @@ -3,11 +3,10 @@ 连接观测组件使用 HTTPing 的方式探测出站代理的连接状态。观测结果可以被其他组件使用,如负载均衡器。目前有 [observatory](#observatoryobject) (后台连接观测)和 [burstObservatory](#burstobservatoryobject) (并发连接观测)两种。按需选择其中之一就行。 ## ObservatoryObject + ```json { - "subjectSelector":[ - "outbound" - ], + "subjectSelector": ["outbound"], "probeUrl": "https://www.google.com/generate_204", "probeInterval": "10s", "enableConcurrency": false @@ -32,11 +31,10 @@ - `false` 逐个探测匹配的出站代理,每探测一个出站代理后暂停 `probeInterval` 设定的时间。 ## BurstObservatoryObject + ```json { - "subjectSelector":[ - "outbound" - ], + "subjectSelector": ["outbound"], "pingConfig": {} } ``` @@ -47,8 +45,8 @@ > `pingConfig`: [PingConfigObject](#PingConfigObject) - ### PingConfigObject + ```json { "destination": "https://connectivitycheck.gstatic.com/generate_204", diff --git a/docs/config/outbounds/dns.md b/docs/config/outbounds/dns.md index b767922..0141f66 100644 --- a/docs/config/outbounds/dns.md +++ b/docs/config/outbounds/dns.md @@ -14,7 +14,7 @@ DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。 "address": "1.1.1.1", "port": 53, "nonIPQuery": "drop", - "blockTypes":[] + "blockTypes": [] } ``` diff --git a/docs/config/outbounds/freedom.md b/docs/config/outbounds/freedom.md index 7c74d38..8ad7eaa 100644 --- a/docs/config/outbounds/freedom.md +++ b/docs/config/outbounds/freedom.md @@ -14,13 +14,13 @@ Freedom 是一个出站协议,可以用来向任意网络发送(正常的) "length": "100-200", "interval": "10-20" // 单位ms }, - "noises":[ - { - "type":"base64", - "packet":"7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=", - "delay":"10-16" - } -], + "noises": [ + { + "type": "base64", + "packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=", + "delay": "10-16" + } + ], "proxyProtocol": 0 } ``` @@ -87,7 +87,7 @@ UDP noise, 用于在发出UDP连接前发出一些随机数据作为“噪声” - 当 `type` 为 str 时,这里指定要发送的字符串 - 当 `type` 为 hex 时,这里指定以 hex 形式表示的的二进制数据 - 当 `type` 为 base64 时,这里指定 base64 过的二进制数据 - + `"delay"`: 延迟,单位毫秒。发送该噪声包后核心会等待该时间后再发送下一个噪声包或真实数据,默认不等待,为 [Int32Range](../../development/intro/guide.md#int32range) 类型 > `proxyProtocol`: number diff --git a/docs/config/outbounds/loopback.md b/docs/config/outbounds/loopback.md index b66e38d..143775d 100644 --- a/docs/config/outbounds/loopback.md +++ b/docs/config/outbounds/loopback.md @@ -20,7 +20,7 @@ Loopback 是个出站数据协议,其作用为将经该出站传出的数据 如果需要将已经通过路由规则分流过的流量再由其它路由规则做更细致的分流,比如由同一组路由规则分流后的 TCP 流量和 UDP 要走不同的出站,则可以使用 `loopback` 出站完成。 -``` json +```json { "outbounds": [ { @@ -31,11 +31,11 @@ Loopback 是个出站数据协议,其作用为将经该出站传出的数据 } }, { - "tag": "tcp-output", + "tag": "tcp-output" // protocol, settings, streamSettings 之类的设置 }, { - "tag": "udp-output", + "tag": "udp-output" // protocol, settings, streamSettings 之类的设置 } ], diff --git a/docs/config/outbounds/vmess.md b/docs/config/outbounds/vmess.md index 9004e85..0e6be2f 100644 --- a/docs/config/outbounds/vmess.md +++ b/docs/config/outbounds/vmess.md @@ -118,4 +118,3 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 "AuthenticatedLength" 启用认证的数据包长度实验。此实验需要同时在客户端与服务器端同时开启,并运行相同版本的程序。 "NoTerminationSignal" 启用不发送断开连接标致实验。此实验可能会影响被代理的连接的稳定性。 - diff --git a/docs/config/outbounds/wireguard.md b/docs/config/outbounds/wireguard.md index 926f8a2..9e2faf2 100644 --- a/docs/config/outbounds/wireguard.md +++ b/docs/config/outbounds/wireguard.md @@ -72,7 +72,8 @@ Wireguard 底层 tun 的MTU大小。 - 16-byte authentication tag ``` -```N-byte encrypted data```即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。 +`N-byte encrypted data`即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。 + > `reserved` \[ number \] @@ -127,7 +128,7 @@ PS: `Freedom` 出站的 `domainStrategy` 包含诸如 `UseIP` 的选项,在这 服务器地址, 必填 URL:端口 格式,例如 `engage.cloudflareclient.com:2408`
-IP:端口 格式,例如 `162.159.192.1:2408` 或 `[2606:4700:d0::a29f:c001]:2408` +IP:端口 格式,例如 `162.159.192.1:2408` 或 `[2606:4700:d0::a29f:c001]:2408` > `publicKey`: string diff --git a/docs/config/policy.md b/docs/config/policy.md index f3470ba..9037dc2 100644 --- a/docs/config/policy.md +++ b/docs/config/policy.md @@ -86,7 +86,7 @@ Xray 系统级别的策略 当值为 `true` 时,开启当前等级的所有用户的下行流量统计。 > `statsUserOnline`: true | false -当值为 `true` 时,开启当前等级的所有用户的在线数量统计。(在线标准:20秒内有过连接活动) +> 当值为 `true` 时,开启当前等级的所有用户的在线数量统计。(在线标准:20秒内有过连接活动) > `bufferSize`: number diff --git a/docs/config/reverse.md b/docs/config/reverse.md index edacc4f..41f2b22 100644 --- a/docs/config/reverse.md +++ b/docs/config/reverse.md @@ -7,15 +7,18 @@ 反向代理的大致工作原理如下: - 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP,无法在公网上直接访问。另有一台主机 B,它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。 + - 在主机 B 中配置 Xray,接收外部请求,所以称为 `portal` (门户)。 - 在主机 A 中配置 Xray,负责将B的转发和网页服务器桥接起来,称为`bridge`。 - `bridge` + - `bridge` 会向 `portal` 主动建立连接以注册反向通道,此连接的目标地址(domain)可以自行设定。 - `bridge` 在收到`portal`转发过来的公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由模块的配置。 - `bridge` 收到响应后,也会将响应原封不动地返回给`portal`。 - `portal` + - `portal` 收到请求且domain匹配,则说明是由 `bridge` 发来的响应数据,这条连接会用于建立反向通道。 - `portal` 收到请求,domain不匹配,则说明是公网用户发来的连接,这种连接数据会转发给bridge. @@ -39,16 +42,16 @@ "bridges": [ { "tag": "bridge", - "domain": "reverse-proxy.xray.internal" - } + "domain": "reverse-proxy.xray.internal", + }, ], "portals": [ { "tag": "portal", - "domain": "reverse-proxy.xray.internal" - } - ] - } + "domain": "reverse-proxy.xray.internal", + }, + ], + }, } ``` @@ -65,7 +68,7 @@ ```jsonc { "tag": "bridge", - "domain": "reverse-proxy.xray.internal" + "domain": "reverse-proxy.xray.internal", } ``` @@ -83,7 +86,7 @@ ```jsonc { "tag": "portal", - "domain": "reverse-proxy.xray.internal" + "domain": "reverse-proxy.xray.internal", } ``` @@ -130,8 +133,8 @@ outbound: "tag": "out", "protocol": "freedom", "settings": { - "redirect": "127.0.0.1:80" - } + "redirect": "127.0.0.1:80", + }, } ``` @@ -146,13 +149,13 @@ outbound: "port": 1024, "users": [ { - "id": "5783a3e7-e373-51cd-8642-c83782b807c5" - } - ] - } - ] + "id": "5783a3e7-e373-51cd-8642-c83782b807c5", + }, + ], + }, + ], }, - "tag": "interconn" + "tag": "interconn", } ``` @@ -167,16 +170,16 @@ outbound: "type": "field", "inboundTag": ["bridge"], "domain": ["full:reverse-proxy.xray.internal"], - "outboundTag": "interconn" + "outboundTag": "interconn", }, { // 从 portal 过来的流量,也会从 bridge 出来,但是不带上面的domain // 则路由到 out,即转发给网页服务器 "type": "field", "inboundTag": ["bridge"], - "outboundTag": "out" - } - ] + "outboundTag": "out", + }, + ], } ``` @@ -208,8 +211,8 @@ inbound: "settings": { "address": "127.0.0.1", "port": 80, - "network": "tcp" - } + "network": "tcp", + }, } ``` @@ -222,10 +225,10 @@ inbound: "settings": { "clients": [ { - "id": "5783a3e7-e373-51cd-8642-c83782b807c5" - } - ] - } + "id": "5783a3e7-e373-51cd-8642-c83782b807c5", + }, + ], + }, } ``` @@ -239,7 +242,7 @@ inbound: // 则路由到 portal, 最终会转发给 bridge "type": "field", "inboundTag": ["external"], - "outboundTag": "portal" + "outboundTag": "portal", }, { // 如果来自 interconn 入站,说明是来自 bridge 的尝试建立反向隧道请求, @@ -247,8 +250,8 @@ inbound: // 注意:这里进入的请求会带上了前文配置的domain,所以 portal 能够区分两种被路由到 portal 的请求 "type": "field", "inboundTag": ["interconn"], - "outboundTag": "portal" - } - ] + "outboundTag": "portal", + }, + ], } ``` diff --git a/docs/config/routing.md b/docs/config/routing.md index d0063ff..3620106 100644 --- a/docs/config/routing.md +++ b/docs/config/routing.md @@ -239,12 +239,14 @@ Xray-core v1.8.7 或更高版本可省略该行。 > `strategy`: [StrategyObject](#strategyobject) #### StrategyObject + ```json { - "type": "roundRobin", - "settings": {} + "type": "roundRobin", + "settings": {} } ``` + > `type` : "random" | "roundRobin" | "leastPing" | "leastLoad" - `random` 默认值。随机选择匹配到的出站代理。 @@ -260,15 +262,17 @@ Xray-core v1.8.7 或更高版本可省略该行。 ```json { - "expected": 2, - "maxRTT": "1s", - "tolerance": 0.01, - "baselines": ["1s"], - "costs": [{ - "regexp": false, - "match": "tag", - "value": 0.5 - }] + "expected": 2, + "maxRTT": "1s", + "tolerance": 0.01, + "baselines": ["1s"], + "costs": [ + { + "regexp": false, + "match": "tag", + "value": 0.5 + } + ] } ``` @@ -304,7 +308,6 @@ Xray-core v1.8.7 或更高版本可省略该行。 权重值,值越大,对应节点越不易被选中。 - ### 负载均衡配置示例 ```json diff --git a/docs/config/transport.md b/docs/config/transport.md index 81f8a51..ae286eb 100644 --- a/docs/config/transport.md +++ b/docs/config/transport.md @@ -103,7 +103,7 @@ Reality 是目前最安全的传输加密方案, 且外部看来流量类型和 ```json { "serverName": "xray.com", - "serverNameToVerify":"", + "serverNameToVerify": "", "rejectUnknownSni": false, "allowInsecure": false, "alpn": ["h2", "http/1.1"], @@ -324,7 +324,7 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机 一般与target保持一致即可,实际的可选值为服务器所接受的任何SNI(依据 target 本身的配置有所不同),一个参考是所返回证书的 [SAN](https://zh.wikipedia.org/wiki/%E4%B8%BB%E9%A2%98%E5%A4%87%E7%94%A8%E5%90%8D%E7%A7%B0). -其中可包含空值 ```""``` 代表接受没有SNI的连接。 +其中可包含空值 `""` 代表接受没有SNI的连接。 > `privateKey` : string @@ -358,7 +358,7 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机 服务端 serverNames 之一。 -当服务端 ```serverNames``` 中包含空值时,与 TLS 类似可以在客户端使用 ```"serverName": "0.0.0.0"``` 发起无SNI的连接。与TLS不同,REALITY使用这个功能并不需要开启也没有允许不安全选项。当使用此功能时请确保target在接受无SNI的连接时会返回默认证书。 +当服务端 `serverNames` 中包含空值时,与 TLS 类似可以在客户端使用 `"serverName": "0.0.0.0"` 发起无SNI的连接。与TLS不同,REALITY使用这个功能并不需要开启也没有允许不安全选项。当使用此功能时请确保target在接受无SNI的连接时会返回默认证书。 > `fingerprint` : string @@ -590,7 +590,6 @@ OCSP 装订更新,与证书热重载的时间间隔。 单位:秒。默认 > "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
> "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" - 在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray 控制。这导致了在 [非标准 Linux 环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此,Xray 1.3.1 为 Sockopt 引入了 Freedom 中的 domainStrategy,解决了此问题。 @@ -723,7 +722,7 @@ TCP 拥塞控制算法。仅支持 Linux。 该选项已被删除,因为 golang 默认启用 TCP no delay。 相反地,如果想要禁用,请通过使用 customSockopt 禁用。 -> `addressPortStrategy`: "none" | "SrvPortOnly" | "SrvAddressOnly" | "SrvPortAndAddress" | "TxtPortOnly" | "TxtAddressOnly" | "TxtPortAndAddress" +> `addressPortStrategy`: "none" | "SrvPortOnly" | "SrvAddressOnly" | "SrvPortAndAddress" | "TxtPortOnly" | "TxtAddressOnly" | "TxtPortAndAddress" 使用 SRV 记录或 TXT 记录指定出站使用的目标地址/端口,默认 `none` 即关闭 diff --git a/docs/config/transports/httpupgrade.md b/docs/config/transports/httpupgrade.md index 262804c..70dabb8 100644 --- a/docs/config/transports/httpupgrade.md +++ b/docs/config/transports/httpupgrade.md @@ -36,15 +36,15 @@ HTTPUpgrade 所使用的 HTTP 协议路径,默认值为 `"/"`。 -如果客户端路径中包含 `ed` 参数(如 ```/mypath?ed=2560```),将会启用 `Early Data` 以降低延迟,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。建议的值为2560。 +如果客户端路径中包含 `ed` 参数(如 `/mypath?ed=2560`),将会启用 `Early Data` 以降低延迟,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。建议的值为2560。 > `host`: string HTTPUpgrade 的HTTP请求中所发送的host,默认值为空。若服务端值为空时,不验证客户端发送来的host值。 -当在服务端指定该值,或在 ```headers``` 中指定host,将会校验与客户端请求host是否一致。 +当在服务端指定该值,或在 `headers` 中指定host,将会校验与客户端请求host是否一致。 -客户端选择发送的host优先级 ```host``` > ```headers``` > ```address``` +客户端选择发送的host优先级 `host` > `headers` > `address` > `headers`: map \{string: string\} diff --git a/docs/config/transports/websocket.md b/docs/config/transports/websocket.md index 48a8518..4665feb 100644 --- a/docs/config/transports/websocket.md +++ b/docs/config/transports/websocket.md @@ -42,15 +42,15 @@ Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来覆写流量的源地 WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"`。 -如果客户端路径中包含 `ed` 参数(如 ```/mypath?ed=2560```),将会启用 `Early Data` 以降低延迟,在升级的同时使用 `Sec-WebSocket-Protocol` 头承载首包数据,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。推荐值为 2560,最大值为8192,过大的值可能导致部分兼容问题,如果遇到兼容性问题,可以尝试调低阈值。 +如果客户端路径中包含 `ed` 参数(如 `/mypath?ed=2560`),将会启用 `Early Data` 以降低延迟,在升级的同时使用 `Sec-WebSocket-Protocol` 头承载首包数据,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。推荐值为 2560,最大值为8192,过大的值可能导致部分兼容问题,如果遇到兼容性问题,可以尝试调低阈值。 > `host`: string WebSocket 的HTTP请求中所发送的host,默认值为空。若服务端值为空时,不验证客户端发送来的host值。 -当在服务端指定该值,或在 ```headers``` 中指定host,将会校验与客户端请求host是否一致。 +当在服务端指定该值,或在 `headers` 中指定host,将会校验与客户端请求host是否一致。 -客户端选择发送的host优先级 ```host``` > ```headers``` > ```address``` +客户端选择发送的host优先级 `host` > `headers` > `address` > `headers`: map \{string: string\} diff --git a/docs/development/intro/guide.md b/docs/development/intro/guide.md index a99da05..4e2d6b3 100644 --- a/docs/development/intro/guide.md +++ b/docs/development/intro/guide.md @@ -137,12 +137,14 @@ For end user 一个表示可选范围的值,可以是以下几种写法 -包含在引号里的单独数字或范围 - - `""` (视为0) 注意部分字段完全不设置和设置为空可能是两种概念 - - `"114"` - - `"114-514"` + +- `""` (视为0) 注意部分字段完全不设置和设置为空可能是两种概念 +- `"114"` +- `"114-514"` -独立的int,这种情况下只能是单数字 - - `114` + +- `114` For dev diff --git a/docs/document/command.md b/docs/document/command.md index 0f86f89..83ffcc5 100644 --- a/docs/document/command.md +++ b/docs/document/command.md @@ -42,19 +42,20 @@ Use "xray help " for more information about a command. ``` Run Xray with config, the default command. -The -config=file, -c=file flags set the config files for +The -config=file, -c=file flags set the config files for Xray. Multiple assign is accepted. The -confdir=dir flag sets a dir with multiple json config -The -format=json flag sets the format of config files. +The -format=json flag sets the format of config files. Default "auto". -The -test flag tells Xray to test config files only, +The -test flag tells Xray to test config files only, without launching the server. The -dump flag tells Xray to print the merged config. ``` + `-config=` / `-c=` 用于指定使用的配置文件的位置,支持多文件配置。 `-confdir=` 用于指定一个包含多个配置文件的文件夹。 `-format=` 用于指定使用的配置文件的格式。 @@ -117,6 +118,7 @@ The commands are: ``` `pb` 子命令使用示例: + ```bash # 用法:xray convert pb [-debug] [-type] [json file] [json file] ... @@ -134,6 +136,7 @@ xray help convert pb ``` json 子命令使用示例: + ```bash # 用法:xray convert json [-type] [stdin:] [typedMessage file] @@ -171,6 +174,7 @@ xray tls [arguments] ``` ### xray uuid + 生成 UUID。 使用方法: @@ -180,6 +184,7 @@ xray uuid [-i "example"] ``` ### xray x25519 + 生成 x25519 密钥对。 使用方法: @@ -189,6 +194,7 @@ xray x25519 [-i "(base64.RawURLEncoding)" --std-encoding ] ``` ### xray wg + 生成 wireguard curve25519 密钥对。 使用方法: @@ -203,5 +209,3 @@ xray wg [-i "(base64.StdEncoding)"] - 工作目录(Working Directory) - [环境变量](../config/features/env.md#资源文件路径)中 `Xray.location.asset` 所指定的路径 ::: - - diff --git a/docs/document/config.md b/docs/document/config.md index 5febc74..fb6a3aa 100644 --- a/docs/document/config.md +++ b/docs/document/config.md @@ -26,7 +26,7 @@ "settings": { "clients": [ { - "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // 记得替换这个字段,使用 `xray uuid` 或 `uuidgen` 生成 + "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // 记得替换这个字段,使用 `xray uuid` 或 `uuidgen` 生成 } ] } @@ -68,7 +68,7 @@ "port": 10086, // 服务器端口 "users": [ { - "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // 记得替换这个字段,使用 `xray uuid` 或 `uuidgen` 生成 + "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // 记得替换这个字段,使用 `xray uuid` 或 `uuidgen` 生成 } ] } @@ -85,13 +85,14 @@ "rules": [ { "type": "field", - "ip": ["geoip:private","geoip:cn"], // 绕过局域网和国内IP段 + "ip": ["geoip:private", "geoip:cn"], // 绕过局域网和国内IP段 "outboundTag": "direct" } ] } } ``` + 上述配置唯一要更改的地方是你的服务器 IP 和用户 uuid,配置中已注明。上述配置会把除局域网(比如访问路由器)和国内IP段(比如访问bilibili、acfun)以外的所有流量转发至你的服务器。 ## 运行 diff --git a/docs/document/install.md b/docs/document/install.md index 7dda21d..a2b7ce4 100644 --- a/docs/document/install.md +++ b/docs/document/install.md @@ -5,7 +5,7 @@ Xray 在以下平台中可用: - Windows 7 及之后版本(x86 / amd64 / arm32 / arm64); - - Windows 7 中使用 1.8.4、1.8.6 的常规版本以及 1.8.18 以后的 ```win7``` 版本需要系统安装有 **KB4474419** 更新方可使用;推荐同时安装 KB4490628 以便联网后接受后续的操作系统安全更新。 + - Windows 7 中使用 1.8.4、1.8.6 的常规版本以及 1.8.18 以后的 `win7` 版本需要系统安装有 **KB4474419** 更新方可使用;推荐同时安装 KB4490628 以便联网后接受后续的操作系统安全更新。 - macOS 10.10 Yosemite 及之后版本(amd64 / arm64); - Linux 2.6.23 及之后版本(x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64); - 包括但不限于 Debian 7 / 8、Ubuntu 12.04 / 14.04 及后续版本、CentOS 7 / 8、Arch Linux 等; diff --git a/docs/document/level-0/ch04-security.md b/docs/document/level-0/ch04-security.md index 87acf99..35eb895 100644 --- a/docs/document/level-0/ch04-security.md +++ b/docs/document/level-0/ch04-security.md @@ -85,9 +85,9 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的 - 如果第 3 步你有仔细观察,就会发现保存并不是常见的 `ctrl+s`。 - 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x` - - (部分操作系统) 新增一个防火墙规则,设置为新增的SSH端口, 否则实例重启后无法SSH登陆。 - 如 Ubuntu 的 ufw + ```shell sudo ufw allow 9753/tcp ``` diff --git a/docs/document/level-0/ch05-webpage.md b/docs/document/level-0/ch05-webpage.md index 5f08d1d..4767bf1 100644 --- a/docs/document/level-0/ch05-webpage.md +++ b/docs/document/level-0/ch05-webpage.md @@ -31,10 +31,13 @@ 3. 如果无法看到上述Nginx默认页面,可能是需要配置Debian系统上默认的防火墙组件Uncomplicated Firewall (UFW),以便启用 HTTP (80) 和 HTTPS (443) 端口流量。 a. 验证方法,输入: + ```shell sudo ufw status ``` + b. 如果输出如下,表明80和433端口未开启,需要执行c步骤 + ```shell Status: active To Action From @@ -42,11 +45,15 @@ 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) ``` + c. 启用UFW的Nginx 80 和 443 端口命令 + ```shell sudo ufw allow 'Nginx Full' ``` + d. 输入a中命令再次验证,如果输出如下,表示Nginx流量已经被防火墙放行,这样就应该可以看到前述第2点中的Nginx默认页面。 + ```shell Status: active To Action From @@ -57,7 +64,6 @@ Nginx Full (v6) ALLOW Anywhere (v6) ``` - ## 5.3 创建一个最简单的网页 1. 小小白白 Linux 基础命令: @@ -130,7 +136,7 @@ chmod -R a+r . ``` -6. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上 +5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上 1. 修改 `nginx.conf` 。 diff --git a/docs/document/level-2/redirect.md b/docs/document/level-2/redirect.md index e47fc51..1bed065 100644 --- a/docs/document/level-2/redirect.md +++ b/docs/document/level-2/redirect.md @@ -41,6 +41,7 @@ Endpoint = : ``` 在 `[Interface]` 下添加如下命令: + ```ini Table = ### fwmark @@ -59,13 +60,14 @@ PostDown = ip rule del oif %i lookup
PreUp = ip -6 rule add oif %i lookup
PostDown = ip -6 rule del oif %i lookup
``` + ::: tip + - 此配置文件融合了 `fwmark` / `sendThrough` / `sockopt.interface`,表示 -- 送入此设备 `%i` 的连接 / 送入此 `` 的连接 / `fwmark` 被标记为 `` 的连接 +- 送入此设备 `%i` 的连接 / 送入此 `` 的连接 / `fwmark` 被标记为 `` 的连接 - 将会使用 wireguard 进行转发 - `%i` 是 wireguard 配置文件中的占位符,表示在启动时替换为这个设备的名称 -::: - + ::: 保存 @@ -242,4 +244,5 @@ systemctl start wg-quick@wg0 ## 感谢 [XTLS/Xray-core](https://github.com/XTLS/Xray-core); [v2fly/v2ray-core](https://github.com/v2fly/v2ray-core); [WireGuard](https://www.wireguard.com/); [@p3terx](https://p3terx.com/); @w; @Hiram; @Luminous; @Ln; @JackChou; - \ No newline at end of file + + diff --git a/docs/document/level-2/tproxy.md b/docs/document/level-2/tproxy.md index b659dc9..6a4e176 100644 --- a/docs/document/level-2/tproxy.md +++ b/docs/document/level-2/tproxy.md @@ -322,4 +322,4 @@ ExecStop=/usr/sbin/netfilter-persistent stop ; /usr/sbin/ip route flush dev lo t [Install] WantedBy=multi-user.target -``` \ No newline at end of file +``` diff --git a/docs/document/level-2/transparent_proxy/transparent_proxy.md b/docs/document/level-2/transparent_proxy/transparent_proxy.md index be061fe..c9c014d 100644 --- a/docs/document/level-2/transparent_proxy/transparent_proxy.md +++ b/docs/document/level-2/transparent_proxy/transparent_proxy.md @@ -91,6 +91,7 @@ Linux 使用`Netfilter`来管理网络,`Netfilter`模型如下: 4. 能够手写客户端 json 文件配置,至少要能看懂 ### 前期准备工作 + ::: warning 在开始操作前,记得使用 `sysctl -w net.ipv4.ip_forward=1` 打开linux ipv4封包转发 ::: diff --git a/docs/document/level-2/warp.md b/docs/document/level-2/warp.md index 71b517e..4227b4f 100644 --- a/docs/document/level-2/warp.md +++ b/docs/document/level-2/warp.md @@ -15,7 +15,9 @@ Xray(1.6.5+)新加入了 WireGuard 出站,虽然增加的代码和依赖 ## 申请 Warp 账户 ### 感谢 Cloudflare 推动自由的互联网,现在你可以免费使用 Warp 服务,连接的时候会根据出口自动选择最近的服务器 + #### 方法 1: + 1. 使用一台 vps,下载 [wgcf](https://github.com/ViRb3/wgcf/releases) 2. 运行 `wgcf register` 生成 `wgcf-account.toml` 3. 运行 `wgcf generate` 生成 `wgcf-profile.conf` 拷贝内容如下: @@ -33,34 +35,45 @@ AllowedIPs = 0.0.0.0/0 AllowedIPs = ::/0 Endpoint = engage.cloudflareclient.com:2408 ``` + #### 方法 2: + 1. 使用 [warp-reg.sh](https://github.com/chise0713/warp-reg.sh),运行: + ``` bash -c "$(curl -L warp-reg.vercel.app)" ``` + - 输出 + ```json { - "endpoint":{ - "v4": "162.159.192.7", - "v6": "[2606:4700:d0::a29f:c007]", - }, - "reserved_dec": [35, 74, 190], - "reserved_hex": "0x234abe", - "reserved_str": "I0q+", - "private_key": "yL0kApRiZW4VFfNkKAQ/nYxnMFT3AH0dfVkj1GAlr1k=", - "public_key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", - "v4": "172.16.0.2", - "v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6" + "endpoint": { + "v4": "162.159.192.7", + "v6": "[2606:4700:d0::a29f:c007]" + }, + "reserved_dec": [35, 74, 190], + "reserved_hex": "0x234abe", + "reserved_str": "I0q+", + "private_key": "yL0kApRiZW4VFfNkKAQ/nYxnMFT3AH0dfVkj1GAlr1k=", + "public_key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", + "v4": "172.16.0.2", + "v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6" } ``` + 2. 拷贝输出的内容 + #### 方法 3: + 1. 使用[wgcf-cli](https://github.com/ArchiveNetwork/wgcf-cli),运行以下内容进行安装: + ``` bash -c "$(curl -L wgcf-cli.vercel.app)" ``` + 2. 运行 `wgcf-cli register` 进行注册,输出: + ```json ❯ wgcf-cli register { @@ -83,38 +96,33 @@ bash -c "$(curl -L wgcf-cli.vercel.app)" } } ``` + - 完整文件将会保存到工作目录的 `wgcf.json` 内。 + 3. 运行 `wgcf-cli generate --xray` 来生成一个WireGurad出站,他会将内容保存到 `wgcf.xray.json` 内 + - 示例文件: + ```json { - "protocol": "wireguard", - "settings": { - "secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=", - "address": [ - "172.16.0.2/32", - "2606:4700:110:857a:6a95:fe27:1870:2a9d/128" - ], - "peers": [ - { - "publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", - "allowedIPs": [ - "0.0.0.0/0", - "::/0" - ], - "endpoint": "162.159.192.1:2408" - } - ], - "reserved": [ - 240, - 25, - 146 - ], - "mtu": 1280 - }, - "tag": "wireguard" + "protocol": "wireguard", + "settings": { + "secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=", + "address": ["172.16.0.2/32", "2606:4700:110:857a:6a95:fe27:1870:2a9d/128"], + "peers": [ + { + "publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", + "allowedIPs": ["0.0.0.0/0", "::/0"], + "endpoint": "162.159.192.1:2408" + } + ], + "reserved": [240, 25, 146], + "mtu": 1280 + }, + "tag": "wireguard" } ``` + ## 在服务端分流回国流量至 warp 在现有出站中新增一个 WireGurad 出站 @@ -131,7 +139,7 @@ bash -c "$(curl -L wgcf-cli.vercel.app)" "endpoint": "engage.cloudflareclient.com:2408" } ], - "reserved":[0, 0, 0] // 如果你有的话,粘贴reserved到这里 + "reserved": [0, 0, 0] // 如果你有的话,粘贴reserved到这里 }, "tag": "wireguard-1" } diff --git a/docs/en/about/news.md b/docs/en/about/news.md index f473092..45508b5 100644 --- a/docs/en/about/news.md +++ b/docs/en/about/news.md @@ -165,6 +165,7 @@ Like WebSocket, HTTPUpgrade now also has 0-RTT. ## 2024.3.11 [v1.8.9](https://github.com/XTLS/Xray-core/releases/tag/v1.8.9) Added HTTPUpgrade transport, said to be lighter than WebSocket. + - Already added to the sharing link package. ## 2024.2.29 @@ -438,9 +439,9 @@ This is a maintenance release. Development continues… Now, an open-source, free Android client based on Xray-core is available—[AnXray](https://github.com/XTLS/AnXray)! Maintained by [@nekohasekai](https://github.com/nekohasekai). - - Supports numerous protocols and plugins. - - Chief visual designer [@RPRX](https://github.com/RPRX) designed an X-style logo, slogan, and a unique black-and-white material theme. - - There's also a small Easter egg waiting to be discovered in the app. +- Supports numerous protocols and plugins. +- Chief visual designer [@RPRX](https://github.com/RPRX) designed an X-style logo, slogan, and a unique black-and-white material theme. +- There's also a small Easter egg waiting to be discovered in the app. Spent the last few days refining details from morning till night. We hope you'll star and follow the project. diff --git a/docs/en/config/api.md b/docs/en/config/api.md index be4cf9d..4ed90e2 100644 --- a/docs/en/config/api.md +++ b/docs/en/config/api.md @@ -34,7 +34,6 @@ The IP and port that the API service listens on. This is an optional configurati When you omit this item, you need to add inbounds and routing configurations according to the examples in the [relevant configurations below](#related-configuration). - > `services`: [string] List of enabled APIs, optional values can be found in [Supported API List](#supported-api-list). @@ -84,7 +83,6 @@ Add api to basic configuration } ``` - ## Supported API List ### HandlerService @@ -102,11 +100,11 @@ APIs that modify the inbound and outbound proxies, with the following available API for adding, deleting, and replacing routing rules and querying equalizer statistics. The available functions are as follows: -* `adrules` adds and replaces routing configuration -* `rmrules` delete routing rules -* `sib` Disconnect source IP -* `bi` Query equalizer statistics -* `bo` Forces the equalizer to select the specified outboundTag +- `adrules` adds and replaces routing configuration +- `rmrules` delete routing rules +- `sib` Disconnect source IP +- `bi` Query equalizer statistics +- `bo` Forces the equalizer to select the specified outboundTag You can use something like `./xray help api bi` to query the specific usage. diff --git a/docs/en/config/dns.md b/docs/en/config/dns.md index 0fd0588..3a5f41d 100644 --- a/docs/en/config/dns.md +++ b/docs/en/config/dns.md @@ -61,17 +61,13 @@ If the domain name to be queried: }, { "address": "https://1.1.1.1/dns-query", - "domains": [ - "geosite:netflix" - ], + "domains": ["geosite:netflix"], "skipFallback": true, "queryStrategy": "UseIPv4" }, { "address": "https://1.1.1.1/dns-query", - "domains": [ - "geosite:openai" - ], + "domains": ["geosite:openai"], "skipFallback": true, "queryStrategy": "UseIPv6" }, diff --git a/docs/en/config/features/browser_dialer.md b/docs/en/config/features/browser_dialer.md index 46a862f..e6eaa9b 100644 --- a/docs/en/config/features/browser_dialer.md +++ b/docs/en/config/features/browser_dialer.md @@ -12,12 +12,12 @@ The TLS fingerprinting behavior is perfect this way, and so it may be possible t However, there are many drawbacks: -* The user has to launch a browser next to the Xray client just for opening the proxy connection. -* The browser dialer must not be tunneled through the proxy itself, otherwise there is a loop. TUN users should be cautious. -* The browser can only speak standard HTTP, which means that only [WebSocket](../../transports/websocket.md) and [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) are supported -* [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) needs to be considered when making requests from one website (`localhost:8080`) to another (`proxy.example.com:443`) -* The browser tunnels your traffic using JavaScript, so there is a significant performance penalty (or, battery drain) -* The configuration to be used with browser dialer cannot use custom SNI or host headers. `SNI == host == address`. Custom HTTP headers and `tlsSettings` are ignored entirely. +- The user has to launch a browser next to the Xray client just for opening the proxy connection. +- The browser dialer must not be tunneled through the proxy itself, otherwise there is a loop. TUN users should be cautious. +- The browser can only speak standard HTTP, which means that only [WebSocket](../../transports/websocket.md) and [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) are supported +- [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) needs to be considered when making requests from one website (`localhost:8080`) to another (`proxy.example.com:443`) +- The browser tunnels your traffic using JavaScript, so there is a significant performance penalty (or, battery drain) +- The configuration to be used with browser dialer cannot use custom SNI or host headers. `SNI == host == address`. Custom HTTP headers and `tlsSettings` are ignored entirely. ## Configuration diff --git a/docs/en/config/inbounds/shadowsocks.md b/docs/en/config/inbounds/shadowsocks.md index 358484c..8d9c93f 100644 --- a/docs/en/config/inbounds/shadowsocks.md +++ b/docs/en/config/inbounds/shadowsocks.md @@ -3,6 +3,7 @@ The [Shadowsocks](https://en.wikipedia.org/wiki/Shadowsocks) protocol is compatible with most other implementations of Shadowsocks. The server supports TCP and UDP packet forwarding, with an option to selectively disable UDP. ### Supported Encryption Methods + The currently supported methods are following: - Recommended encryption methods: @@ -67,21 +68,24 @@ Required, any of the [supported methods](#supportedencryptionmethods) > `password`: string -Required. For **Shadowsocks 2022** a pre-shared `base64` random key similar to WireGuard's keys should be used as the password. The command +Required. For **Shadowsocks 2022** a pre-shared `base64` random key similar to WireGuard's keys should be used as the password. The command + ```sh openssl rand -base64 ``` + could used to generate a key. The length of the required key for `shadowsocks-rust` implementation depends on the encryption method: | Encryption Method | Key Length | -| ----------------------------- | ---------: | +| ------------------------------- | ---------: | | `2022-blake3-aes-128-gcm` | 16 | | `2022-blake3-aes-256-gcm` | 32 | | `2022-blake3-chacha20-poly1305` | 32 | -In the `go-shadowsocks` implementation written in Golang, a 32-byte key always works. +In the `go-shadowsocks` implementation written in Golang, a 32-byte key always works. For **any other encryption method** _any string_ could be used. There is no limitation on the password length, but shorter passwords are more susceptible to cracking. It is recommended to use a random-generated password of 16 characters or longer. The following example generates 40-characters length password: + ```sh sudo strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 40 | tr -d '\n'; echo ``` diff --git a/docs/en/config/inbounds/vless.md b/docs/en/config/inbounds/vless.md index 5d389c1..b1c57ab 100644 --- a/docs/en/config/inbounds/vless.md +++ b/docs/en/config/inbounds/vless.md @@ -88,6 +88,4 @@ Currently, the following flow control modes are available for inbound protocols: - No `flow` or empty string: Use regular TLS proxy. - `xtls-rprx-vision`: Use the new XTLS mode, including inner-handshake random padding. - - -Additionally, XTLS currently only supports TCP+TLS/Reality. +Additionally, XTLS currently only supports TCP+TLS/Reality. diff --git a/docs/en/config/inbounds/wireguard.md b/docs/en/config/inbounds/wireguard.md index 699b976..3ce5d3d 100644 --- a/docs/en/config/inbounds/wireguard.md +++ b/docs/en/config/inbounds/wireguard.md @@ -14,11 +14,11 @@ User-space implementation of the Wireguard protocol. "peers": [ { "publicKey": "PUBLIC_KEY", - "allowedIPs":[""] + "allowedIPs": [""] } ], "kernelMode": true, // optional, default true if it's supported and permission is sufficient - "mtu": 1420, // optional, default 1420 + "mtu": 1420 // optional, default 1420 } ``` diff --git a/docs/en/config/log.md b/docs/en/config/log.md index 0095a36..a9678f1 100644 --- a/docs/en/config/log.md +++ b/docs/en/config/log.md @@ -51,13 +51,13 @@ The log level for error logs, indicating the information that needs to be record Log DNS queries made by built-in [DNS clients](./dns.md) to the access log. Example log record: `DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms`. ::: tip + 1. Xray doesn't perform all DNS queries via its built-in clients. Therefore, enabling this option doesn't mean that all DNS queries performed by Xray will be logged. 2. DNS queries made by built-in [DNS clients](./dns.md) are also logged to the error log (with "Info" level) even if this option is disabled. -3. +3. 4. FakeDNS client queries are never logged to the access log. -::: - + ::: > `maskAddress`: "quarter" | "half" | "full" diff --git a/docs/en/config/metrics.md b/docs/en/config/metrics.md index 24473e9..7551643 100644 --- a/docs/en/config/metrics.md +++ b/docs/en/config/metrics.md @@ -55,8 +55,9 @@ Access `http://127.0.0.1:11111/debug/pprof/` or use go tool pprof to start profi Access `http://127.0.0.1:11111/debug/vars` Variables exported include: -* `stats` includes statistics about inbounds, outbounds and users -* `observatory` includes observatory results + +- `stats` includes statistics about inbounds, outbounds and users +- `observatory` includes observatory results for example with [luci-app-xray](https://github.com/yichya/luci-app-xray) you are likely to get a result like this (standard expvar things like `cmdline` and `memstats` are omitted) @@ -64,91 +65,92 @@ for example with [luci-app-xray](https://github.com/yichya/luci-app-xray) you ar ```json { - "observatory": { - "tcp_outbound": { - "alive": true, - "delay": 782, - "outbound_tag": "tcp_outbound", - "last_seen_time": 1648477189, - "last_try_time": 1648477189 - }, - "udp_outbound": { - "alive": true, - "delay": 779, - "outbound_tag": "udp_outbound", - "last_seen_time": 1648477191, - "last_try_time": 1648477191 - } + "observatory": { + "tcp_outbound": { + "alive": true, + "delay": 782, + "outbound_tag": "tcp_outbound", + "last_seen_time": 1648477189, + "last_try_time": 1648477189 }, - "stats": { - "inbound": { - "api": { - "downlink": 0, - "uplink": 0 - }, - "dns_server_inbound_5300": { - "downlink": 14286, - "uplink": 5857 - }, - "http_inbound": { - "downlink": 74460, - "uplink": 10231 - }, - "https_inbound": { - "downlink": 0, - "uplink": 0 - }, - "metrics": { - "downlink": 6327, - "uplink": 1347 - }, - "socks_inbound": { - "downlink": 19925615, - "uplink": 5512 - }, - "tproxy_tcp_inbound": { - "downlink": 4739161, - "uplink": 1568869 - }, - "tproxy_udp_inbound": { - "downlink": 0, - "uplink": 2608142 - } - }, - "outbound": { - "blackhole_outbound": { - "downlink": 0, - "uplink": 0 - }, - "direct": { - "downlink": 97714548, - "uplink": 3234617 - }, - "dns_server_outbound": { - "downlink": 7116, - "uplink": 2229 - }, - "manual_tproxy_outbound_tcp_1": { - "downlink": 0, - "uplink": 0 - }, - "manual_tproxy_outbound_udp_1": { - "downlink": 0, - "uplink": 0 - }, - "tcp_outbound": { - "downlink": 23873238, - "uplink": 1049595 - }, - "udp_outbound": { - "downlink": 639282, - "uplink": 74634 - } - }, - "user": {} + "udp_outbound": { + "alive": true, + "delay": 779, + "outbound_tag": "udp_outbound", + "last_seen_time": 1648477191, + "last_try_time": 1648477191 } + }, + "stats": { + "inbound": { + "api": { + "downlink": 0, + "uplink": 0 + }, + "dns_server_inbound_5300": { + "downlink": 14286, + "uplink": 5857 + }, + "http_inbound": { + "downlink": 74460, + "uplink": 10231 + }, + "https_inbound": { + "downlink": 0, + "uplink": 0 + }, + "metrics": { + "downlink": 6327, + "uplink": 1347 + }, + "socks_inbound": { + "downlink": 19925615, + "uplink": 5512 + }, + "tproxy_tcp_inbound": { + "downlink": 4739161, + "uplink": 1568869 + }, + "tproxy_udp_inbound": { + "downlink": 0, + "uplink": 2608142 + } + }, + "outbound": { + "blackhole_outbound": { + "downlink": 0, + "uplink": 0 + }, + "direct": { + "downlink": 97714548, + "uplink": 3234617 + }, + "dns_server_outbound": { + "downlink": 7116, + "uplink": 2229 + }, + "manual_tproxy_outbound_tcp_1": { + "downlink": 0, + "uplink": 0 + }, + "manual_tproxy_outbound_udp_1": { + "downlink": 0, + "uplink": 0 + }, + "tcp_outbound": { + "downlink": 23873238, + "uplink": 1049595 + }, + "udp_outbound": { + "downlink": 639282, + "uplink": 74634 + } + }, + "user": {} + } } ``` + To get a better view of these numbers, [Netdata](https://github.com/netdata/netdata) (with python.d plugin) is a great option: @@ -263,6 +265,7 @@ xray: id: udp expvar_type: int ``` + And you will get a nice plot like this: @@ -270,6 +273,7 @@ And you will get a nice plot like this: ![160428235-2988bf69-5d6c-41ec-8267-1bd512508aa8](https://github.com/chika0801/Xray-docs-next/assets/88967758/455e88ce-ced2-4593-a9fa-425bb293215b) ### Additional + Maybe reusing the empty object `stats` in config file is better than adding `metrics` here? **Edit:** removed prometheus related things and added usage about expvars diff --git a/docs/en/config/observatory.md b/docs/en/config/observatory.md index a884a29..c03d66f 100644 --- a/docs/en/config/observatory.md +++ b/docs/en/config/observatory.md @@ -8,11 +8,10 @@ components, such as load balancers. There are currently two options: You can choose one of them as needed. ## ObservatoryObject + ```json { - "subjectSelector":[ - "outbound" - ], + "subjectSelector": ["outbound"], "probeUrl": "https://www.google.com/generate_204", "probeInterval": "10s", "enableConcurrency": false @@ -37,11 +36,10 @@ The interval at which probes are initiated. The time format is a number followed - `false`: Probe each matching outbound proxy one by one, pausing for the time set by `probeInterval` after probing each one. ## BurstObservatoryObject + ```json { - "subjectSelector":[ - "outbound" - ], + "subjectSelector": ["outbound"], "pingConfig": {} } ``` @@ -52,8 +50,8 @@ An array of strings, where each string is used to match the prefix of outbound p > `pingConfig`: [PingConfigObject](#PingConfigObject) - ### PingConfigObject + ```json { "destination": "https://connectivitycheck.gstatic.com/generate_204", diff --git a/docs/en/config/outbounds/freedom.md b/docs/en/config/outbounds/freedom.md index 4ae3c53..6c7a7fd 100644 --- a/docs/en/config/outbounds/freedom.md +++ b/docs/en/config/outbounds/freedom.md @@ -14,23 +14,23 @@ Freedom is an outbound protocol that can be used to send (normal) TCP or UDP dat "length": "100-200", "interval": "10-20" // ms }, - "noises":[ - { - "type":"base64", - "packet":"7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=", - "delay":"10-16" - }, - { - "type":"rand", - "packet":"10-20", - "delay":"10-16" - }, - { - "type":"str", - "packet":"hiGFW", - "delay":"10-16" - } -], + "noises": [ + { + "type": "base64", + "packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=", + "delay": "10-16" + }, + { + "type": "rand", + "packet": "10-20", + "delay": "10-16" + }, + { + "type": "str", + "packet": "hiGFW", + "delay": "10-16" + } + ], "proxyProtocol": 0 } ``` @@ -76,7 +76,7 @@ A key-value map used to control TCP fragmentation,under some circumstances it ::: warning ⚠️ "noise":{} is deptecated,only "noises":[{}] is supported in 24.9.16 and later - ::: +::: > `noises`: [ noiseObject ] diff --git a/docs/en/config/outbounds/loopback.md b/docs/en/config/outbounds/loopback.md index 257a00b..ad86271 100644 --- a/docs/en/config/outbounds/loopback.md +++ b/docs/en/config/outbounds/loopback.md @@ -20,15 +20,15 @@ This tag can be used as `inboundTag` in routing rules, all traffics going throug If you need to do some more detailed routing for traffics that have been routed by routing rules, like splitting routed traffics to TCP traffics and UDP traffics and send them to different outbounds, this can be done with `loopback` outbound. -``` jsonc +```jsonc { "outbounds": [ { "protocol": "loopback", "tag": "need-to-split", "settings": { - "inboundTag": "traffic-input" // This tag will be used as the inboundTag inside the RuleObject - } + "inboundTag": "traffic-input", // This tag will be used as the inboundTag inside the RuleObject + }, }, { "tag": "tcp-output", @@ -37,21 +37,21 @@ If you need to do some more detailed routing for traffics that have been routed { "tag": "udp-output", // protocol, settings, streamSettings etc. - } + }, ], "routing": { "rules": [ { "inboundTag": ["traffic-input"], // tag set in the loopback outbound setting "network": "tcp", - "outboundTag": "tcp-output" + "outboundTag": "tcp-output", }, { - "inboundTag": ["traffic-input"], // tag set in the loopback outbound + "inboundTag": ["traffic-input"], // tag set in the loopback outbound "network": "udp", - "outboundTag": "udp-output" - } - ] - } + "outboundTag": "udp-output", + }, + ], + }, } ``` diff --git a/docs/en/config/outbounds/wireguard.md b/docs/en/config/outbounds/wireguard.md index a73ff96..c2ac06f 100644 --- a/docs/en/config/outbounds/wireguard.md +++ b/docs/en/config/outbounds/wireguard.md @@ -68,18 +68,19 @@ Xray-core v1.8.6 New parameter.
If you do not write this parameter, or leave it blank, the default value is `"ForceIP"`.
When the destination address is a domain name, use the Xray-core [built-in DNS server](./dns.md) to get an IP (if no `"dns"` configuration is written, system DNS is used), and send a connection to this IP via wireguard.
-| domainStrategy | test-ipv6.com | bgp.he.net | chat.openai.com | -| :--- | :---: | :---: | :---: | -| ForceIPv6v4 | IPv6v4 | IPv6 | IPv6 | -| ForceIPv6 | The website won't open. | IPv6 | IPv6 | -| ForceIPv4v6 | IPv6v4 **1** | IPv4 | IPv4 | -| ForceIPv4 | IPv4 | IPv4 | IPv4 | -| ForceIP | IPv6v4 **2** | IPv6 | IPv6 | +| domainStrategy | test-ipv6.com | bgp.he.net | chat.openai.com | +| :------------- | :---------------------: | :--------: | :-------------: | +| ForceIPv6v4 | IPv6v4 | IPv6 | IPv6 | +| ForceIPv6 | The website won't open. | IPv6 | IPv6 | +| ForceIPv4v6 | IPv6v4 **1** | IPv4 | IPv4 | +| ForceIPv4 | IPv4 | IPv4 | IPv4 | +| ForceIP | IPv6v4 **2** | IPv6 | IPv6 | **1:** Tip `You already have an IPv6 address, but your browser is less inclined to use it, which is more worrying. `
**2:** The chances of prompting `You already have an IPv6 address, but your browser is less inclined to use it, which is more worrisome. ` **Note 1**: + - Conflicts with `"queryStrategy"` may cause the site to fail to open. - For example when `domainStrategy: "ForceIPv4"` is used, geosite:openai's site with `"queryStrategy": "UseIPv6"` will fail to open. @@ -101,6 +102,7 @@ When the destination address is a domain name, use the Xray-core [built-in DNS s ``` **Note 2**: + - Xray-core v1.8.0 - v1.8.4 without `"domainStrategy"`. - When the destination address is a domain name, use the Xray-core built-in DNS server query to obtain the IP, using the value of `"queryStrategy"` in the `"dns"` configuration to control the IPv4 or IPv6 priority. - If the `"dns"` configuration is not written, the system DNS query is used to obtain IP, and the IPv4 or IPv6 priority is controlled by the system. diff --git a/docs/en/config/transport.md b/docs/en/config/transport.md index 5686dce..42d78c8 100644 --- a/docs/en/config/transport.md +++ b/docs/en/config/transport.md @@ -609,7 +609,7 @@ Default value `false`, fill in `true` to enable [Multipath TCP](https://en.wikip Default value `false`, recommended to be enabled with "tcpMptcp": true. -> `customSockopt`: [] +> `customSockopt`: [] An array for advanced users to specify any sockopt. In theory, all the above connection-related settings can be set equivalently here. Naturally, other options that exist in Linux but have not been added to the core can also be set. The example below is equivalent to `"tcpcongestion": "bbr"` in core. diff --git a/docs/en/config/transports/httpupgrade.md b/docs/en/config/transports/httpupgrade.md index 704105f..85898ac 100644 --- a/docs/en/config/transports/httpupgrade.md +++ b/docs/en/config/transports/httpupgrade.md @@ -18,7 +18,7 @@ The `HttpUpgradeObject` corresponds to the `httpupgradeSettings` section under t "path": "/", "host": "xray.com", "headers": { - "key": "value" + "key": "value" } } ``` @@ -37,7 +37,7 @@ When `true`, the downstream must first send PROXY protocol version 1 or 2 after HTTP path used by the HTTPUpgrade connection. Defaults to `"/"`. -If the `path` property include an `ed` query field (e.g. ```/mypath?ed=2560```), "early data" will be used to decrease latency, with the value defining the threshold of the first packet's size. If the size of the first packet exceeds the defined value, "early data" will not be applied. The recommended value is `2560`. +If the `path` property include an `ed` query field (e.g. `/mypath?ed=2560`), "early data" will be used to decrease latency, with the value defining the threshold of the first packet's size. If the size of the first packet exceeds the defined value, "early data" will not be applied. The recommended value is `2560`. > `host`: string @@ -45,8 +45,8 @@ HTTP Host sent by the HTTPUpgrade connection. Empty by default. If this value is If the `Host` header has been defined on the server in any way, the server will validate if the `Host` header matches. -The current priority of the `Host` header sent by clients: ```host``` > ```headers``` > ```address``` +The current priority of the `Host` header sent by clients: `host` > `headers` > `address` > `headers`: map \{string: string\} -Customized HTTP headers defined in key-value pairs. Defaults to empty. \ No newline at end of file +Customized HTTP headers defined in key-value pairs. Defaults to empty. diff --git a/docs/en/config/transports/websocket.md b/docs/en/config/transports/websocket.md index 3f170d6..f0af97f 100644 --- a/docs/en/config/transports/websocket.md +++ b/docs/en/config/transports/websocket.md @@ -49,7 +49,7 @@ The `Host` header sent in HTTP requests. Defaults to an empty string. Servers wi If the `Host` header has been defined on the server in any way, the server will validate if the `Host` header matches. -The current priority of the `Host` header sent by clients: ```host``` > ```headers``` > ```address``` +The current priority of the `Host` header sent by clients: `host` > `headers` > `address` > `headers`: map \{string: string\} diff --git a/docs/en/document/command.md b/docs/en/document/command.md index f69f29d..5a1a6ce 100644 --- a/docs/en/document/command.md +++ b/docs/en/document/command.md @@ -28,6 +28,7 @@ The commands are: Use "xray help " for more information about a command. ``` + ### xray run Specify one or more configuration files and run. @@ -54,6 +55,7 @@ without launching the server The -dump flag tells Xray to print the merged config. ``` + ::: tip Except from the default JSON format, config can also use TOML and YAML. It will automatically recognized from file extensions when the `-format` flag is not set. ::: @@ -105,6 +107,7 @@ The commands are: ``` Sub-command `pb` + ```bash # Usage: xray convert pb [-debug] [-type] [json file] [json file] ... @@ -122,6 +125,7 @@ xray help convert pb ``` Sub-command JSON + ```bash # Usage: xray convert json [-type] [stdin:] [typedMessage file] @@ -169,6 +173,7 @@ xray uuid ``` ### xray x25519 + Generate x25519 key pair。 Usage: @@ -178,6 +183,7 @@ xray x25519 [-i "(base64.RawURLEncoding)" --std-encoding] ``` ### xray wg + Generate wireguard curve25519 key pair。 Usage: diff --git a/docs/en/document/install.md b/docs/en/document/install.md index 5b644d1..3de40e6 100644 --- a/docs/en/document/install.md +++ b/docs/en/document/install.md @@ -4,7 +4,7 @@ - Xray is available on the following platforms: - Windows 7 and later (x86 / amd64 / arm32 / arm64); - - If you need to use these version (1.8.18 and later marked with ```win7```, 1.8.6, 1.8.4) in Windows 7, operating system update **KB4474419** is required. For better Internet security, it is recommended to install KB4490628 to acquire later operating system updates from Windows Update. + - If you need to use these version (1.8.18 and later marked with `win7`, 1.8.6, 1.8.4) in Windows 7, operating system update **KB4474419** is required. For better Internet security, it is recommended to install KB4490628 to acquire later operating system updates from Windows Update. - macOS 10.10 Yosemite and later (amd64 / arm64); - Linux 2.6.23 and later (x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64); - Including but not limited to Debian 7 / 8, Ubuntu 12.04 / 14.04 and subsequent versions, CentOS 7 / 8, Arch Linux, etc.; diff --git a/docs/en/document/level-0/ch01-preface.md b/docs/en/document/level-0/ch01-preface.md index a9c34a3..25a132d 100644 --- a/docs/en/document/level-0/ch01-preface.md +++ b/docs/en/document/level-0/ch01-preface.md @@ -57,6 +57,7 @@ First of all, I would like to respond to critics by asking a question: Is using Secondly, I believe that there is a fundamental difference between "not understanding" and "not wanting to understand". The bad attitude of some people who just want handouts is naturally annoying, but those who sincerely want to learn but don't know how should not be subject to unjustified contempt and discrimination. It is precisely this kind of bad community atmosphere that does not distinguish between newcomers that prompted me to write this article. So without further ado, let's take a look at the advantages and disadvantages of using an airport: - Advantages of "Airports" + 1. **Stability**: Airports usually feature multiple exit nodes, hence resistance to attempts at blocking these node, if one get block simply switch to another 2. **Speed**: Airports typically make use of high capacity machines and high throughput network infrastructures, therefore you can expect a higher overall network speed 3. **Safety**: Airports are generally have good security practices, such as encryption and firewalls to ensure the security of user data @@ -67,7 +68,7 @@ Secondly, I believe that there is a fundamental difference between "not understa - Risks of "Airport" -"The counterpart of convenience in 'internet' security is 'risk', some risk of 'airports' you can find on the market are" +"The counterpart of convenience in 'internet' security is 'risk', some risk of 'airports' you can find on the market are" 1. service providers can obtain all infomation that passes through their servers, these data are very likely stored by the providers for a long time with little legal means to stop them 2. there is little governance on the market for "airports", meaning there are plenty cases of fraud where providers disappear after being paid diff --git a/docs/en/document/level-0/ch02-preparation.md b/docs/en/document/level-0/ch02-preparation.md index 36d2703..2648125 100644 --- a/docs/en/document/level-0/ch02-preparation.md +++ b/docs/en/document/level-0/ch02-preparation.md @@ -7,7 +7,7 @@ This chapter is rather special because it involves monetary transactions. This a You need to obtain a healthy VPS with an unblocked IP, and perform the following basic preparations in the management console: 1. Install Debian 10 64 bit Operating System on your VPS. -2. Note down the IP address of VPS (this article will use `"100.200.300.400"` as an example, which is an intentionally incorrect and illegal IP address. Please replace it with your real IP address). +2. Note down the IP address of VPS (this article will use `"100.200.300.400"` as an example, which is an intentionally incorrect and illegal IP address. Please replace it with your real IP address). 3. Note down the SSH remote login port of VPS. 4. Note down the username and password for SSH remote login. diff --git a/docs/en/document/level-0/ch07-xray-server.md b/docs/en/document/level-0/ch07-xray-server.md index d7b5fe8..2aa2503 100644 --- a/docs/en/document/level-0/ch07-xray-server.md +++ b/docs/en/document/level-0/ch07-xray-server.md @@ -19,7 +19,7 @@ The things to do next are very simple: ## 7.2 Install Xray -First of all, the official carrier of Xray is the binary program generated by the open source project [xray-core](https://github.com/XTLS/Xray-core) (Open sourced with License `MPL 2.0` +First of all, the official carrier of Xray is the binary program generated by the open source project [xray-core](https://github.com/XTLS/Xray-core) (Open sourced with License `MPL 2.0` ). If you put this binary on the server and run it, it is the server side; if you download it to the local computer and run it, it is the client side. The main difference comes from [configuration]. When installing, it is very simple and direct to use the official installation script directly. It provides a variety of installation options. If you are interested, you can go to the official [installation script repository](https://github.com/XTLS/Xray-install) to see the script instructions. **This article uses the [non-root @@ -29,9 +29,9 @@ When writing this article, the installation script had some minor bugs when usin 1. Basic Linux commands for beginners: - | Number | Command name | Command description | - | :------: | :------: | :------: | - | `cmd-14` | `rm` | delete | + | Number | Command name | Command description | + | :------: | :----------: | :-----------------: | + | `cmd-14` | `rm` | delete | 2. Download the installation script: @@ -89,34 +89,34 @@ chmod +r ~/xray_cert/xray.key ![Xray server installation process demonstration](./ch07-img02-xray-cert-install.png) -5. `acme.sh` will check the certificate every 60 days and automatically renew the expiring certificate. But as far as I know, it does not automatically install the new certificate to `xray-core`, so we need to add a system automatic periodic task to complete this step. +5. `acme.sh` will check the certificate every 60 days and automatically renew the expiring certificate. But as far as I know, it does not automatically install the new certificate to `xray-core`, so we need to add a system automatic periodic task to complete this step. 1. Basic Linux commands for beginners: - | Number | Command name | Command description | - | :------: | :----------: | :--------------------: | - | `cmd-15` | `crontab -e` | Edit the current user's scheduled task | + | Number | Command name | Command description | + | :------: | :----------: | :------------------------------------: | + | `cmd-15` | `crontab -e` | Edit the current user's scheduled task | 2. Create a script file (`xray-cert-renew.sh`) - ```shell - nano ~/xray_cert/xray-cert-renew.sh - ``` + ```shell + nano ~/xray_cert/xray-cert-renew.sh + ``` 3. Copy the following content, remember to replace your real domain name, then save and exit - ```bash - #!/bin/bash - - /home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.key - echo "Xray Certificates Renewed" - - chmod +r /home/vpsadmin/xray_cert/xray.key - echo "Read Permission Granted for Private Key" - - sudo systemctl restart xray - echo "Xray Restarted" - ``` + ```bash + #!/bin/bash + + /home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.key + echo "Xray Certificates Renewed" + + chmod +r /home/vpsadmin/xray_cert/xray.key + echo "Read Permission Granted for Private Key" + + sudo systemctl restart xray + echo "Xray Restarted" + ``` ::: warning As you have reminded, `acme.sh` has a `reloadcmd` command that can automatically execute a specific command when the certificate is updated, so you can specify to automatically install the certificate for `Xray`, but because `crontab` is a very useful and commonly used function in Linux, this article retains the `crontab` method to update the `Xray` certificate. (If you interested in `reloadcmd` can check out the [official documentation](https://github.com/acmesh-official/acme.sh) of `acme.sh`) @@ -125,27 +125,27 @@ chmod +r ~/xray_cert/xray.key to enable this setting and delete the restart command in the script. ::: - 4. Add [executable] permissions to this file + 4. Add [executable] permissions to this file ``` chmod +x ~/xray_cert/xray-cert-renew.sh ``` - 5. Run `crontab -e` and add an automatic task [Automatically run `xray-cert-renew.sh` once a month] (Note that you should not add `sudo`, because we are adding an automatic task for the `vpsadmin` - account. When you run it for the first time, you will be asked to choose an editor. Of course, choose the familiar `nano`!) + 5. Run `crontab -e` and add an automatic task [Automatically run `xray-cert-renew.sh` once a month] (Note that you should not add `sudo`, because we are adding an automatic task for the `vpsadmin` + account. When you run it for the first time, you will be asked to choose an editor. Of course, choose the familiar `nano`!) - ```shell - crontab -e - ``` + ```shell + crontab -e + ``` - 6. Add the following content to the end of the file, save and exit. + 6. Add the following content to the end of the file, save and exit. ``` # 1:00am, 1st day each month, run `xray-cert-renew.sh` 0 1 1 * * bash /home/vpsadmin/xray_cert/xray-cert-renew.sh ``` - 7. The complete process is demonstrated as follows: + 7. The complete process is demonstrated as follows: ![Automatically install certificates for Xray every month](./ch07-img03-crontab-cert-renew.gif) @@ -155,46 +155,46 @@ First, you can refer to the [official VLESS configuration example](https://githu 1. Generate a legal `UUID` and save it for backup (`UUID` can be simply and roughly understood as an ID that is almost never repeated like a fingerprint) - ```shell - xray uuid - ``` + ```shell + xray uuid + ``` 2. Create log files and folders for backup - 1. Basic Linux commands for beginners: - | Number | Command name | Command description | - |:--:|:--:|:--:| - | `cmd-16` | `touch` | Create a blank file | + 1. Basic Linux commands for beginners: + | Number | Command name | Command description | + |:--:|:--:|:--:| + | `cmd-16` | `touch` | Create a blank file | - 2. Create a [log dedicated folder] in the `vpsadmin` folder + 2. Create a [log dedicated folder] in the `vpsadmin` folder - ```shell - mkdir ~/xray_log - ``` + ```shell + mkdir ~/xray_log + ``` - 3. Generate the two required log files (access log, error log) + 3. Generate the two required log files (access log, error log) - ```shell - touch ~/xray_log/access.log && touch ~/xray_log/error.log - ``` + ```shell + touch ~/xray_log/access.log && touch ~/xray_log/error.log + ``` - ::: warning - This location is not the standard log file location of `Xray`. It is placed here to avoid permission issues that cause trouble for new users. Once you are familiar with it, it is recommended to return to the default location: `/var/log/xray/access.log` and `/var/log/xray/error.log`. - ::: + ::: warning + This location is not the standard log file location of `Xray`. It is placed here to avoid permission issues that cause trouble for new users. Once you are familiar with it, it is recommended to return to the default location: `/var/log/xray/access.log` and `/var/log/xray/error.log`. + ::: - 4. Because Xray is used by the nobody user by default, we need to allow other users to have "write" permissions (`*.log` means all files with the suffix `log`, and the efficiency advantage of the `CLI` interface gradually appears at this time) - ```shell - chmod a+w ~/xray_log/*.log - ``` + 4. Because Xray is used by the nobody user by default, we need to allow other users to have "write" permissions (`*.log` means all files with the suffix `log`, and the efficiency advantage of the `CLI` interface gradually appears at this time) + ```shell + chmod a+w ~/xray_log/*.log + ``` 3. Use `nano` to create the configuration file of `Xray` - ```shell - sudo nano /usr/local/etc/xray/config.json - ``` + ```shell + sudo nano /usr/local/etc/xray/config.json + ``` 4. Copy all the files below and fill in the previously generated `UUID` into the 61st line `"id": "",`. (After filling in, it will look like `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"` -) This configuration file in this article adds my various verbose comments to help you understand the function of each configuration module. + ) This configuration file in this article adds my various verbose comments to help you understand the function of each configuration module. ```json // REFERENCE: @@ -207,94 +207,102 @@ First, you can refer to the [official VLESS configuration example](https://githu // ├─ 4_inbounds Inbound settings - what traffic can flow into Xray // └─ 5_outbounds Outbound settings - where does the traffic out of Xray go { - // 1\_Log settings - "log": { - "loglevel": "warning", // content from less to more: "none", "error", "warning", "info", "debug" - "access": "/home/vpsadmin/xray_log/access.log", // access record - "error": "/home/vpsadmin/xray_log/error.log" // Error log - }, - // 2_DNS settings - "dns": { - "servers": [ - "https+local://1.1.1.1/dns-query", // Prefer 1.1.1.1 DoH query, sacrificing speed but preventing ISP snooping - "localhost" - ] - }, - // 3*Diversion settings - "routing": { - "domainStrategy": "IPIfNonMatch", - "rules": [ - // 3.1 Prevent local server flow problems: such as intranet attacks or abuse, incorrect local loopbacks, etc. - { - "type": "field", - "ip": [ - "geoip:private" // Diversion condition: In the geoip file, the rule named "private" (local) - ], - "outboundTag": "block" // Diversion strategy: Hand over to the outbound "block" for processing (black hole shielding) - }, - { - // 3.2 Prevent the server from connecting directly to China - "type": "field", - "ip": ["geoip:cn"], - "outboundTag": "block" - }, - // 3.3 Block ads - { - "type": "field", - "domain": [ - "geosite:category-ads-all" // Diversion conditions: In the geosite file, the rule named "category-ads-all" (various advertising domain names) - ], - "outboundTag": "block" // Diversion strategy: Hand it over to the outbound "block" for processing (black hole shielding) - } - ] - }, - // 4* Inbound settings - // 4.1 Here is only the simplest vless+xtls inbound, because this is the most powerful mode of Xray. If you need other, please add it according to the template. - "inbounds": [{ - "port": 443, - "protocol": "vless", - "settings": { - "clients": [{ - "id": "", // Fill in your UUID - "flow": "xtls-rprx-vision", - "level": 0, - "email": "vpsadmin@yourdomain.com" - }], - "decryption": "none", - "fallbacks": [{ - "dest": 80 // Fall back to anti-detection proxy by default - }] - }, - "streamSettings": { - "network": "tcp", - "security": "tls", - "tlsSettings": { - "alpn": "http/1.1", - "certificates": [{ - "certificateFile": "/home/vpsadmin/xray_cert/xray.crt", - "keyFile": "/home/vpsadmin/xray_cert/xray.key" - }] - } - } - }], - // 5*Outbound settings - "outbounds": [ - // 5.1 The first outbound is the default rule, freedom is a direct connection to the outside (vps is already an external network, so it is a direct connection) - { - "tag": "direct", - "protocol": "freedom" - }, - // 5.2 Blocking rules, blackhole protocol is to import traffic into the black hole (blocking) - { - "tag": "block", - "protocol": "blackhole" - } - ] + // 1\_Log settings + "log": { + "loglevel": "warning", // content from less to more: "none", "error", "warning", "info", "debug" + "access": "/home/vpsadmin/xray_log/access.log", // access record + "error": "/home/vpsadmin/xray_log/error.log" // Error log + }, + // 2_DNS settings + "dns": { + "servers": [ + "https+local://1.1.1.1/dns-query", // Prefer 1.1.1.1 DoH query, sacrificing speed but preventing ISP snooping + "localhost" + ] + }, + // 3*Diversion settings + "routing": { + "domainStrategy": "IPIfNonMatch", + "rules": [ + // 3.1 Prevent local server flow problems: such as intranet attacks or abuse, incorrect local loopbacks, etc. + { + "type": "field", + "ip": [ + "geoip:private" // Diversion condition: In the geoip file, the rule named "private" (local) + ], + "outboundTag": "block" // Diversion strategy: Hand over to the outbound "block" for processing (black hole shielding) + }, + { + // 3.2 Prevent the server from connecting directly to China + "type": "field", + "ip": ["geoip:cn"], + "outboundTag": "block" + }, + // 3.3 Block ads + { + "type": "field", + "domain": [ + "geosite:category-ads-all" // Diversion conditions: In the geosite file, the rule named "category-ads-all" (various advertising domain names) + ], + "outboundTag": "block" // Diversion strategy: Hand it over to the outbound "block" for processing (black hole shielding) + } + ] + }, + // 4* Inbound settings + // 4.1 Here is only the simplest vless+xtls inbound, because this is the most powerful mode of Xray. If you need other, please add it according to the template. + "inbounds": [ + { + "port": 443, + "protocol": "vless", + "settings": { + "clients": [ + { + "id": "", // Fill in your UUID + "flow": "xtls-rprx-vision", + "level": 0, + "email": "vpsadmin@yourdomain.com" + } + ], + "decryption": "none", + "fallbacks": [ + { + "dest": 80 // Fall back to anti-detection proxy by default + } + ] + }, + "streamSettings": { + "network": "tcp", + "security": "tls", + "tlsSettings": { + "alpn": "http/1.1", + "certificates": [ + { + "certificateFile": "/home/vpsadmin/xray_cert/xray.crt", + "keyFile": "/home/vpsadmin/xray_cert/xray.key" + } + ] + } + } + } + ], + // 5*Outbound settings + "outbounds": [ + // 5.1 The first outbound is the default rule, freedom is a direct connection to the outside (vps is already an external network, so it is a direct connection) + { + "tag": "direct", + "protocol": "freedom" + }, + // 5.2 Blocking rules, blackhole protocol is to import traffic into the black hole (blocking) + { + "tag": "block", + "protocol": "blackhole" + } + ] } ``` -5) The complete process is demonstrated as follows: - ![Create log file and `config.json` configuration file](./ch07-img04-xray-log-and-config.gif) +5. The complete process is demonstrated as follows: + ![Create log file and `config.json` configuration file](./ch07-img04-xray-log-and-config.gif) ## 7.5 Start Xray service! ! (and check the service status) @@ -396,94 +404,92 @@ If your line really has a very high packet loss rate, the only reliable solution 6. I have said so much because there are too many misconceptions and scam scripts around `BBR` to fool novices. I hope you now have a relatively clear understanding of `BBR`. Next, let's install the latest Debian kernel and enable `BBR`! (It's really simple) - 1. Add the official `backports` source to Debian 10 to get the updated software library + 1. Add the official `backports` source to Debian 10 to get the updated software library - ```shell - sudo nano /etc/apt/sources.list - ``` + ```shell + sudo nano /etc/apt/sources.list + ``` - ::: warning description - This article takes Debian 10 as an example, so there is still no problem using `/etc/apt/sources.list`, but if you are not starting from scratch according to this article, or using other Linux - distributions, it is recommended that you create a `/etc/apt/sources.list.d/` folder and create your own configuration file in this folder, such as `/etc/apt/sources.list.d/vpsadmin.list` - , to ensure compatibility and avoid the default file being overwritten in unforeseen circumstances and causing configuration loss. - ::: + ::: warning description + This article takes Debian 10 as an example, so there is still no problem using `/etc/apt/sources.list`, but if you are not starting from scratch according to this article, or using other Linux + distributions, it is recommended that you create a `/etc/apt/sources.list.d/` folder and create your own configuration file in this folder, such as `/etc/apt/sources.list.d/vpsadmin.list` + , to ensure compatibility and avoid the default file being overwritten in unforeseen circumstances and causing configuration loss. + ::: - 2. Then add the following item at the end, save and exit. + 2. Then add the following item at the end, save and exit. - ``` - deb http://deb.debian.org/debian buster-backports main - ``` + ``` + deb http://deb.debian.org/debian buster-backports main + ``` - 3. Refresh the software library and query the latest version of the official Debian kernel and install it. Please be sure to install the version corresponding to your VPS (this article takes the more common [amd64] as an example). + 3. Refresh the software library and query the latest version of the official Debian kernel and install it. Please be sure to install the version corresponding to your VPS (this article takes the more common [amd64] as an example). - ```shell - sudo apt update && sudo apt -t buster-backports install linux-image-amd64 - ``` + ```shell + sudo apt update && sudo apt -t buster-backports install linux-image-amd64 + ``` - ::: warning Note + ::: warning Note - If your VPS supports it, you can try the [cloud server dedicated kernel] `linux-image-cloud-amd64`. The advantages are simplicity and low resource usage. The disadvantage is that some students have reported that forced installation on an unsupported system will cause the system to fail to boot (the kernel cannot be recognized). + If your VPS supports it, you can try the [cloud server dedicated kernel] `linux-image-cloud-amd64`. The advantages are simplicity and low resource usage. The disadvantage is that some students have reported that forced installation on an unsupported system will cause the system to fail to boot (the kernel cannot be recognized). - To avoid the tragedy of being unable to identify, please make sure: + To avoid the tragedy of being unable to identify, please make sure: - - Take a system snapshot before trying, or - - You have `vnc` to save the day (and you know how to use it) + - Take a system snapshot before trying, or + - You have `vnc` to save the day (and you know how to use it) - ::: + ::: - 4. Modify the `kernel` parameter configuration file `sysctl.conf` and specify to enable `BBR` + 4. Modify the `kernel` parameter configuration file `sysctl.conf` and specify to enable `BBR` - ```shell - sudo nano /etc/sysctl.conf - ``` + ```shell + sudo nano /etc/sysctl.conf + ``` - ::: warning description - This article takes Debian 10 as an example, so it is still no problem to use `/etc/sysctl.conf`, but if you are not following this article from scratch, or use other Linux distributions, it is recommended that you create a `/etc/sysctl.d/` - folder and create your own configuration file in this folder, such as `/etc/sysctl.d/vpsadmin.conf`, to ensure compatibility, because some distributions no longer read parameters from `/etc/sysctl.conf` after `systemd` - 207 ​​version. Using a custom configuration file can also prevent the default file from being overwritten in unexpected circumstances, resulting in configuration loss. - ::: + ::: warning description + This article takes Debian 10 as an example, so it is still no problem to use `/etc/sysctl.conf`, but if you are not following this article from scratch, or use other Linux distributions, it is recommended that you create a `/etc/sysctl.d/` + folder and create your own configuration file in this folder, such as `/etc/sysctl.d/vpsadmin.conf`, to ensure compatibility, because some distributions no longer read parameters from `/etc/sysctl.conf` after `systemd` + 207 ​​version. Using a custom configuration file can also prevent the default file from being overwritten in unexpected circumstances, resulting in configuration loss. + ::: - 5. Add the following content + 5. Add the following content - ``` - net.core.default_qdisc=fq - net.ipv4.tcp_congestion_control=bbr - ``` + ``` + net.core.default_qdisc=fq + net.ipv4.tcp_congestion_control=bbr + ``` - 6. Restart the VPS to make the kernel update and `BBR` settings take effect + 6. Restart the VPS to make the kernel update and `BBR` settings take effect - ```shell - sudo reboot - ``` + ```shell + sudo reboot + ``` - 7. The complete process is demonstrated as follows: + 7. The complete process is demonstrated as follows: - ::: tip - Because the VPS I am demonstrating supports the cloud server-specific kernel, I used `linux-image-cloud-amd64` in the animation. + ::: tip + Because the VPS I am demonstrating supports the cloud server-specific kernel, I used `linux-image-cloud-amd64` in the animation. - If you are not sure whether your VPS supports it, please follow the command in step 3 and use the regular kernel `linux-image-amd64`. - ::: + If you are not sure whether your VPS supports it, please follow the command in step 3 and use the regular kernel `linux-image-amd64`. + ::: - ![Update Debian kernel and enable `BBR`](./ch07-img06-bbr-proper.gif) + ![Update Debian kernel and enable `BBR`](./ch07-img06-bbr-proper.gif) - 8. Confirm that `BBR` is enabled + 8. Confirm that `BBR` is enabled If you want to confirm whether `BBR` is enabled correctly, you can use the following command: - ```shell +`shell lsmod | grep bbr - ``` - This should return the following result: - ``` - tcp_bbr - ``` - If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command: - ```shell + ` +This should return the following result: +` tcp_bbr + ` +If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command: +`shell lsmod | grep fq - ``` - This should return the following result: - ``` - sch_fq - ``` + ` +This should return the following result: +` sch_fq + ` ## 7.8 Server Optimization 2: Enable HTTP to automatically redirect to HTTPS @@ -569,4 +575,4 @@ Affected sections: Affected sections: -- 7.8 Server Optimization 2 - 4. Add a local port listener at the same level as the `80` port to provide web page display \ No newline at end of file +- 7.8 Server Optimization 2 - 4. Add a local port listener at the same level as the `80` port to provide web page display diff --git a/docs/ru/README.md b/docs/ru/README.md index ff3423e..ee38b0b 100644 --- a/docs/ru/README.md +++ b/docs/ru/README.md @@ -24,8 +24,7 @@ features: - title: Мощная маршрутизация details: | - Высоконастраиваемая система маршрутизации, отвечающая разнообразным требованиям использования и позволяющая максимально эффективно использовать производительность сети. - + Высоконастраиваемая система маршрутизации, отвечающая разнообразным требованиям использования и позволяющая максимально эффективно использовать производительность сети. - title: Полная совместимость details: | @@ -44,12 +43,12 @@ footer: Лицензия CC-BY-SA 4.0 | Авторские права 2020-на - Xray-core - это расширенная версия v2ray-core с улучшенной общей производительностью, включающая XTLS и другие улучшения. Xray-core ~~полностью~~ совместим с функциональностью и конфигурацией v2ray-core. - Только один исполняемый файл, включающий функциональность ctl, команда run используется по умолчанию. - - Конфигурация ~~полностью~~ совместима, переменные среды и вызовы API должны начинаться с XRAY\_ + - Конфигурация ~~полностью~~ совместима, переменные среды и вызовы API должны начинаться с XRAY\_ - Открытый raw протокол ReadV на всех платформах. - Обеспечивает полную поддержку VLESS и Trojan XTLS, обе с ReadV. - Предоставляет несколько режимов управления потоком XTLS, непревзойденная производительность! -> Конфигурация без изменений, результат — значительно лучше. +> Конфигурация без изменений, результат — значительно лучше. ### Кто мы? @@ -101,5 +100,3 @@ footer: Лицензия CC-BY-SA 4.0 | Авторские права 2020-на ### Динамика звезд на GitHub [![Stargazers over time](https://starchart.cc/XTLS/Xray-core.svg)](https://starchart.cc/XTLS/Xray-core) - - diff --git a/docs/ru/about/news.md b/docs/ru/about/news.md index 3ffd09b..f20b594 100644 --- a/docs/ru/about/news.md +++ b/docs/ru/about/news.md @@ -442,9 +442,9 @@ Shadowsocks-2022 — это новый протокол с переработа Теперь появился открытый и бесплатный Android-клиент на основе Xray-core — [AnXray](https://github.com/XTLS/AnXray)! Поддерживается [@nekohasekai](https://github.com/nekohasekai). - - Поддержка множества протоколов, плагинов. - - Главный визуальный дизайнер [@RPRX](https://github.com/RPRX) разработал логотип и слоган в X-стиле, а также уникальную материальную черно-белую тему. - - В приложении есть небольшой сюрприз, который ждет вас. +- Поддержка множества протоколов, плагинов. +- Главный визуальный дизайнер [@RPRX](https://github.com/RPRX) разработал логотип и слоган в X-стиле, а также уникальную материальную черно-белую тему. +- В приложении есть небольшой сюрприз, который ждет вас. В последние два дня детали постоянно дорабатывались с утра до ночи, надеемся, что все добавят больше звезд и внимания. @@ -504,7 +504,7 @@ Shadowsocks-2022 — это новый протокол с переработа ## 2021.3.3 [1.3.1](https://github.com/XTLS/Xray-core/releases/tag/v1.3.1) - В этой версии используется Golang 1.16, который официально поддерживает Apple Silicon. -- В то же время исправлена ошибка, которая могла вызвать панику. ~~Holmium_ считает, что это обман, нападение.~~ +- В то же время исправлена ошибка, которая могла вызвать панику. ~~Holmium\_ считает, что это обман, нападение.~~ - Исправлено несколько устаревших проблем. ## 2021.2.14 [1.3.0](https://github.com/XTLS/Xray-core/releases/tag/v1.3.0) diff --git a/docs/ru/config/README.md b/docs/ru/config/README.md index 86ff6f0..da820c9 100644 --- a/docs/ru/config/README.md +++ b/docs/ru/config/README.md @@ -3,11 +3,11 @@ title: Конфигурационный файл lang: ru-RU --- -> **В этом разделе вы узнаете все детали настройки Xray. Овладев этими знаниями, вы сможете раскрыть весь потенциал Xray.** +> **В этом разделе вы узнаете все детали настройки Xray. Овладев этими знаниями, вы сможете раскрыть весь потенциал Xray.** ## Обзор -Конфигурационный файл Xray имеет формат JSON. Формат конфигурации одинаков для клиента и сервера, но фактическое содержимое отличается. +Конфигурационный файл Xray имеет формат JSON. Формат конфигурации одинаков для клиента и сервера, но фактическое содержимое отличается. Он выглядит следующим образом: ```json @@ -45,11 +45,11 @@ lang: ru-RU > dns: [DnsObject](./dns.md) -Встроенный DNS-сервер. Если этот параметр не настроен, используются системные настройки DNS. +Встроенный DNS-сервер. Если этот параметр не настроен, используются системные настройки DNS. > routing: [RoutingObject](./routing.md) -Функция маршрутизации. Позволяет настроить правила для разделения трафика и отправки его через разные исходящие подключения. +Функция маршрутизации. Позволяет настроить правила для разделения трафика и отправки его через разные исходящие подключения. > policy: [PolicyObject](./policy.md) @@ -73,22 +73,20 @@ lang: ru-RU > reverse: [ReverseObject](./reverse.md) -Обратный прокси. Позволяет перенаправлять трафик с сервера на клиент, т.е. перенаправлять трафик в обратном направлении. +Обратный прокси. Позволяет перенаправлять трафик с сервера на клиент, т.е. перенаправлять трафик в обратном направлении. > fakedns: [FakeDnsObject](./fakedns.md) -Настройка FakeDNS. Может использоваться совместно с прозрачным проксированием для получения фактических доменных имен. +Настройка FakeDNS. Может использоваться совместно с прозрачным проксированием для получения фактических доменных имен. > metrics: [metricsObject](./metrics.md) -Настройка метрик. Более прямой (и, надеемся, лучший) способ экспорта статистики. +Настройка метрик. Более прямой (и, надеемся, лучший) способ экспорта статистики. > observatory: [ObservatoryObject](./observatory.md#observatoryobject) -Мониторинг фоновых подключений. Обнаружение состояния подключения исходящего прокси. +Мониторинг фоновых подключений. Обнаружение состояния подключения исходящего прокси. > burstObservatory: [BurstObservatoryObject](./observatory.md#burstobservatoryobject) -Мониторинг параллельных подключений. Обнаружение состояния подключения исходящего прокси. - - +Мониторинг параллельных подключений. Обнаружение состояния подключения исходящего прокси. diff --git a/docs/ru/config/api.md b/docs/ru/config/api.md index 44b981e..e03238e 100644 --- a/docs/ru/config/api.md +++ b/docs/ru/config/api.md @@ -2,7 +2,7 @@ Настройка API предоставляет API-интерфейсы на основе [gRPC](https://grpc.io/) для удаленного вызова. -Интерфейсы можно включить с помощью модуля конфигурации api. Когда API включен, Xray создает исходящее подключение с тем же тегом, что и тег API. +Интерфейсы можно включить с помощью модуля конфигурации api. Когда API включен, Xray создает исходящее подключение с тем же тегом, что и тег API. Необходимо вручную направить все входящие API-подключения на это исходящее подключение с помощью [правил маршрутизации](./routing.md). См. раздел [Связанные настройки](#связанные-настройки) в этом документе. @@ -22,7 +22,12 @@ "api": { "tag": "api", "listen": "127.0.0.1:8080", - "services": ["HandlerService", "LoggerService", "StatsService", "RoutingService"] + "services": [ + "HandlerService", + "LoggerService", + "StatsService", + "RoutingService" + ] } } ``` @@ -33,7 +38,7 @@ > `listen`: string -IP-адрес и порт, на котором прослушивает API-сервер. Это необязательный параметр. +IP-адрес и порт, на котором прослушивает API-сервер. Это необязательный параметр. Если этот параметр опущен, необходимо добавить настройки inbounds и routing, как показано в примере в разделе [Связанные настройки](#связанные-настройки). @@ -140,5 +145,3 @@ xray.app.stats.command.StatsService ## Примеры вызова API [Xray-API-documents](https://github.com/XTLS/Xray-API-documents) @crossfw - - diff --git a/docs/ru/config/dns.md b/docs/ru/config/dns.md index 8a42233..fc6df9e 100644 --- a/docs/ru/config/dns.md +++ b/docs/ru/config/dns.md @@ -6,12 +6,12 @@ - На этапе маршрутизации: разрешает доменные имена в IP-адреса и выполняет сопоставление правил на основе полученных IP-адресов для разделения трафика. Разрешение доменных имен и разделение трафика зависят от значения `domainStrategy` в конфигурации модуля маршрутизации. Встроенный DNS-сервер будет использоваться для DNS-запросов только в том случае, если установлено одно из следующих двух значений: - - `"IPIfNonMatch"`: при запросе доменного имени выполняется сопоставление домена в маршрутизации, если совпадение не найдено, для этого доменного имени используется встроенный DNS-сервер для выполнения DNS-запроса, и возвращенный IP-адрес используется для повторного сопоставления IP-маршрутизации. - - `"IPOnDemand"`: при обнаружении любого правила на основе IP-адреса доменное имя немедленно разрешается в IP-адрес для сопоставления. + - `"IPIfNonMatch"`: при запросе доменного имени выполняется сопоставление домена в маршрутизации, если совпадение не найдено, для этого доменного имени используется встроенный DNS-сервер для выполнения DNS-запроса, и возвращенный IP-адрес используется для повторного сопоставления IP-маршрутизации. + - `"IPOnDemand"`: при обнаружении любого правила на основе IP-адреса доменное имя немедленно разрешается в IP-адрес для сопоставления. - Разрешает целевой адрес для подключения. - - Например, если в исходящем подключении `freedom` установить `domainStrategy` равным `UseIP`, то запросы, отправленные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение. - - Например, если в `sockopt` установить `domainStrategy` равным `UseIP`, то системные подключения, инициированные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение. + - Например, если в исходящем подключении `freedom` установить `domainStrategy` равным `UseIP`, то запросы, отправленные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение. + - Например, если в `sockopt` установить `domainStrategy` равным `UseIP`, то системные подключения, инициированные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение. ::: tip СОВЕТ 1 DNS-запросы, отправляемые встроенным DNS-сервером, автоматически перенаправляются в соответствии с конфигурацией маршрутизации. @@ -28,11 +28,11 @@ DNS-запросы, отправляемые встроенным DNS-серве - Совпадает с сопоставлением «доменное имя - IP», «доменное имя - массив IP» в `hosts`, то этот IP или массив IP возвращается в качестве результата разрешения DNS. - Совпадает с сопоставлением «доменное имя - доменное имя» в `hosts`, то значение этого сопоставления (другое доменное имя) будет использоваться в качестве текущего запрашиваемого доменного имени, и процесс обработки DNS будет продолжаться до тех пор, пока не будет разрешен IP-адрес или возвращено пустое разрешение. - Не совпадает с `hosts`, но совпадает с одним (несколькими) списками доменов `domains` на DNS-серверах, то в соответствии с приоритетом совпадающих правил, DNS-серверы, соответствующие этим правилам, будут использоваться для запроса по очереди. Если запрос к DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем совпадающим DNS-серверам не удался или `expectIPs` не совпадает, то компонент DNS: - - По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес. - - Если `disableFallback` установлен в `true`, то «откат DNS-запроса (fallback)» выполняться не будет. + - По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес. + - Если `disableFallback` установлен в `true`, то «откат DNS-запроса (fallback)» выполняться не будет. - Не совпадает ни с `hosts`, ни со списками доменов `domains` на DNS-серверах, то: - - По умолчанию DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос к первому выбранному DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий выбранный DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем выбранным DNS-серверам не удался или `expectIPs` не совпадает, то возвращается пустое разрешение. - - Если количество DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`, равно 0 или `disableFallback` установлен в `true`, то для запроса будет использоваться первый DNS-сервер в конфигурации DNS. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес. + - По умолчанию DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос к первому выбранному DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий выбранный DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем выбранным DNS-серверам не удался или `expectIPs` не совпадает, то возвращается пустое разрешение. + - Если количество DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`, равно 0 или `disableFallback` установлен в `true`, то для запроса будет использоваться первый DNS-сервер в конфигурации DNS. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес. ## DnsObject @@ -58,17 +58,13 @@ DNS-запросы, отправляемые встроенным DNS-серве }, { "address": "https://8.8.8.8/dns-query", - "domains": [ - "geosite:netflix" - ], + "domains": ["geosite:netflix"], "skipFallback": true, "queryStrategy": "UseIPv4" }, { "address": "https://1.1.1.1/dns-query", - "domains": [ - "geosite:openai" - ], + "domains": ["geosite:openai"], "skipFallback": true, "queryStrategy": "UseIPv6" }, @@ -114,7 +110,7 @@ DNS-запросы, отправляемые встроенным DNS-серве Если значение имеет вид `"https://хост:порт/dns-query"`, например, `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запроса. Некоторые провайдеры имеют сертификаты с псевдонимами IP-адресов, можно напрямую указывать IP-адрес, например, `https://1.1.1.1/dns-query`. Также можно использовать нестандартные порты и пути, например, `"https://a.b.c.d:8443/my-dns-query"`. -Если значение имеет вид `"h2c://хост:порт/dns-query"`, например, `"h2c://dns.google/dns-query"`, Xray будет использовать формат запроса `DNS over HTTPS`, но отправит его в виде открытого текста h2c. Нельзя использовать напрямую. В этом случае необходимо самостоятельно настроить исходящее соединение Freedom + streamSettings, установив TLS, чтобы обернуть его в обычный DOH-запрос. Используется для особых целей, например, когда требуется настроить SNI для DOH-запроса или использовать отпечаток utls. +Если значение имеет вид `"h2c://хост:порт/dns-query"`, например, `"h2c://dns.google/dns-query"`, Xray будет использовать формат запроса `DNS over HTTPS`, но отправит его в виде открытого текста h2c. Нельзя использовать напрямую. В этом случае необходимо самостоятельно настроить исходящее соединение Freedom + streamSettings, установив TLS, чтобы обернуть его в обычный DOH-запрос. Используется для особых целей, например, когда требуется настроить SNI для DOH-запроса или использовать отпечаток utls. Если значение имеет вид `"https+local://хост:порт/dns-query"`, например, `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запроса. Это означает, что DOH-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Обычно подходит для использования на сервере. Также можно использовать нестандартные порты и пути. diff --git a/docs/ru/config/fakedns.md b/docs/ru/config/fakedns.md index 9d7a3a4..8b1cb18 100644 --- a/docs/ru/config/fakedns.md +++ b/docs/ru/config/fakedns.md @@ -196,7 +196,3 @@ FakeDNS будет использовать этот блок IP-адресов ] } ``` - - - - diff --git a/docs/ru/config/features/browser_dialer.md b/docs/ru/config/features/browser_dialer.md index b7c1af5..f8f5a37 100644 --- a/docs/ru/config/features/browser_dialer.md +++ b/docs/ru/config/features/browser_dialer.md @@ -12,12 +12,12 @@ Xray обычно использует uTLS для имитации поведе Однако есть много недостатков: -* Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения. -* Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны. -* Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947). -* [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`). -* Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора). -* Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью. +- Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения. +- Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны. +- Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947). +- [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`). +- Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора). +- Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью. ## Конфигурация @@ -51,4 +51,3 @@ Xray обычно использует uTLS для имитации поведе [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947) поддерживает QUIC, но также может использоваться собственный стек QUIC браузера. В Chrome это можно сделать через `chrome://flags`, в других браузерах он может быть уже включен или для него может потребоваться другой флаг. В общем, `tlsSettings` полностью игнорируются при использовании Browser Dialer. Xray никак не контролирует, какую версию HTTP выбирает браузер. - diff --git a/docs/ru/config/features/env.md b/docs/ru/config/features/env.md index 27fb1b9..ee90672 100644 --- a/docs/ru/config/features/env.md +++ b/docs/ru/config/features/env.md @@ -28,4 +28,4 @@ Xray предоставляет следующие переменные сред - Название: `xray.location.confdir` или `XRAY_LOCATION_CONFDIR`. - Значение по умолчанию: `""`. -Файлы `.json` в этом каталоге будут читаться в порядке имен файлов как параметры конфигурации. +Файлы `.json` в этом каталоге будут читаться в порядке имен файлов как параметры конфигурации. diff --git a/docs/ru/config/features/fallback.md b/docs/ru/config/features/fallback.md index 3bcdffa..c693390 100644 --- a/docs/ru/config/features/fallback.md +++ b/docs/ru/config/features/fallback.md @@ -98,5 +98,3 @@ VLESS будет перенаправлять трафик с длиной пе - [Краткое описание функции Fallbacks](../../document/level-1/fallbacks-lv1) ## Теория Fallbacks - - diff --git a/docs/ru/config/features/multiple.md b/docs/ru/config/features/multiple.md index d2fd099..8c9b493 100644 --- a/docs/ru/config/features/multiple.md +++ b/docs/ru/config/features/multiple.md @@ -104,19 +104,19 @@ $ xray run -confdir /etc/xray/confs ```json { "log": { - "loglevel": "debug" // объект верхнего уровня перезаписывает предыдущий + "loglevel": "debug" // объект верхнего уровня перезаписывает предыдущий }, "inbounds": [ { "tag": "socks", // перезапись элемента с тем же tag "protocol": "socks", "listen": "127.0.0.1", - "port": 1080 + "port": 1080 } ], "outbounds": [ { - "tag": "block", // добавлено в начало outbounds + "tag": "block", // добавлено в начало outbounds "protocol": "blackhole" }, { @@ -134,5 +134,3 @@ $ xray run -confdir /etc/xray/confs ::: tip Вы можете использовать команду `xray run -confdir=./confs -dump` для просмотра объединенной конфигурации. Однако, поскольку ядро использует формат данных protobuf, формат вывода конфигурации для параметра `-dump` будет отличаться. ::: - - diff --git a/docs/ru/config/features/xtls.md b/docs/ru/config/features/xtls.md index 5099dda..77a5e54 100644 --- a/docs/ru/config/features/xtls.md +++ b/docs/ru/config/features/xtls.md @@ -3,5 +3,3 @@ > **XTLS - это оригинальная технология Xray, которая является ключевым фактором высокой производительности Xray.** - - diff --git a/docs/ru/config/inbound.md b/docs/ru/config/inbound.md index 65be3c7..ceac6b5 100644 --- a/docs/ru/config/inbound.md +++ b/docs/ru/config/inbound.md @@ -55,9 +55,9 @@ - Целое число: фактический номер порта. - Переменная окружения: начинается с `"env:"`, за которым следует имя переменной окружения, например `"env:PORT"`. - Xray будет анализировать эту переменную окружения как строку. + Xray будет анализировать эту переменную окружения как строку. - Строка: может быть числом в виде строки, например `"1234"`, или диапазоном портов, например `"5-10"`, что означает порты с 5 по 10 (6 портов). - Можно использовать запятые для разделения диапазонов, например `11,13,15-17`, что означает порты 11, 13, 15, 16 и 17 (5 портов). + Можно использовать запятые для разделения диапазонов, например `11,13,15-17`, что означает порты 11, 13, 15, 16 и 17 (5 портов). Если указан только один порт, Xray будет прослушивать входящие подключения на этом порту. Если указан диапазон портов, то фактическое поведение зависит от настройки `allocate`. @@ -90,12 +90,12 @@ Например, типичный сценарий выглядит следующим образом: 1. Устройство пытается получить доступ к abc.com. - Сначала устройство выполняет DNS-запрос и получает IP-адрес 1.2.3.4 для abc.com. - Затем устройство пытается установить соединение с 1.2.3.4. + Сначала устройство выполняет DNS-запрос и получает IP-адрес 1.2.3.4 для abc.com. + Затем устройство пытается установить соединение с 1.2.3.4. 2. Если обнаружение трафика не настроено, Xray получает запрос на подключение к 1.2.3.4 и не может использовать доменные правила для маршрутизации и разделения трафика. 3. Если в sniffing включен параметр `enabled`, Xray при обработке трафика этого соединения попытается извлечь доменное имя из данных трафика, т.е. abc.com. 4. Xray заменит 1.2.3.4 на abc.com. - Маршрутизация сможет использовать доменные правила для разделения трафика. + Маршрутизация сможет использовать доменные правила для разделения трафика. Так как запрос теперь направляется на abc.com, можно выполнять больше действий, например, повторное разрешение DNS, помимо разделения трафика по доменным правилам. @@ -197,9 +197,9 @@ Xray будет использовать доменные имена, обнар Стратегия выделения портов. - `"always"` - всегда выделять все указанные порты. - Xray будет прослушивать все порты, указанные в `port`. + Xray будет прослушивать все порты, указанные в `port`. - `"random"` - случайным образом открывать порты. - Каждые `refresh` минут Xray будет случайным образом выбирать `concurrency` портов из диапазона, указанного в `port`, и прослушивать их. + Каждые `refresh` минут Xray будет случайным образом выбирать `concurrency` портов из диапазона, указанного в `port`, и прослушивать их. > `refresh`: number @@ -212,8 +212,3 @@ Xray будет использовать доменные имена, обнар Количество случайных портов. Минимальное значение - `1`, максимальное значение - треть от диапазона портов, указанного в `port`. Рекомендуемое значение - `3`. - - - - - diff --git a/docs/ru/config/inbounds/http.md b/docs/ru/config/inbounds/http.md index 8cf6e0e..2a78970 100644 --- a/docs/ru/config/inbounds/http.md +++ b/docs/ru/config/inbounds/http.md @@ -6,7 +6,7 @@ **Протокол HTTP не обеспечивает шифрования передачи данных, поэтому он не подходит для передачи данных через общедоступные сети и более уязвим для использования в качестве ботнета.** ::: -Использование входящих соединений `http` более целесообразно в локальной сети или локальной среде, где он может быть использован для прослушивания входящих подключений и предоставления локальных сервисов другим программам. +Использование входящих соединений `http` более целесообразно в локальной сети или локальной среде, где он может быть использован для прослушивания входящих подключений и предоставления локальных сервисов другим программам. ::: tip СОВЕТ 1 `http proxy` может проксировать только протокол tcp, протоколы семейства udp не поддерживаются. @@ -70,5 +70,3 @@ > `pass`: string Пароль, тип данных: строка. Обязательный параметр. - - diff --git a/docs/ru/config/inbounds/shadowsocks.md b/docs/ru/config/inbounds/shadowsocks.md index a34dd48..609031d 100644 --- a/docs/ru/config/inbounds/shadowsocks.md +++ b/docs/ru/config/inbounds/shadowsocks.md @@ -65,11 +65,11 @@ Используйте команду `openssl rand -base64 <длина>` для генерации ключа, совместимого с shadowsocks-rust, длина зависит от используемого метода шифрования. -| Метод шифрования | Длина ключа | -| ------------------------------------ | ----------: | -| 2022-blake3-aes-128-gcm | 16 | -| 2022-blake3-aes-256-gcm | 32 | -| 2022-blake3-chacha20-poly1305 | 32 | +| Метод шифрования | Длина ключа | +| ----------------------------- | ----------: | +| 2022-blake3-aes-128-gcm | 16 | +| 2022-blake3-aes-256-gcm | 32 | +| 2022-blake3-chacha20-poly1305 | 32 | В реализации Go всегда работают 32-битные ключи. @@ -106,5 +106,3 @@ Обратите внимание, что SS2022, в отличие от старого SS, не игнорирует `"password"` верхнего уровня, правильный способ записи пароля клиента: `ServerPassword:UserPassword`. Например: `"password": "114514:1919810"` Остальные опции имеют то же значение, что и в InboundConfigurationObject. - - diff --git a/docs/ru/config/inbounds/socks.md b/docs/ru/config/inbounds/socks.md index be95c93..8092b1b 100644 --- a/docs/ru/config/inbounds/socks.md +++ b/docs/ru/config/inbounds/socks.md @@ -27,7 +27,7 @@ > `auth`: "noauth" | "password" -Метод аутентификации протокола Socks. Поддерживается анонимный метод `"noauth"` и метод с паролем `"password"`. +Метод аутентификации протокола Socks. Поддерживается анонимный метод `"noauth"` и метод с паролем `"password"`. При использовании метода `password` для HTTP-запросов, отправляемых на входящее соединение, также потребуется указать те же имя пользователя и пароль. @@ -55,7 +55,6 @@ **Предупреждение**: если на вашей машине настроено несколько IP-адресов, это может повлиять на работу [inbound](../inbound.md#inboundobject), когда для UDP используется `0.0.0.0`. - > `userLevel`: number Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя. diff --git a/docs/ru/config/inbounds/trojan.md b/docs/ru/config/inbounds/trojan.md index af5d904..44c8d25 100644 --- a/docs/ru/config/inbounds/trojan.md +++ b/docs/ru/config/inbounds/trojan.md @@ -68,7 +68,3 @@ Trojan в Xray имеет полную поддержку fallbacks, конфи Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. - - - - diff --git a/docs/ru/config/inbounds/vmess.md b/docs/ru/config/inbounds/vmess.md index a7e284f..737a4f1 100644 --- a/docs/ru/config/inbounds/vmess.md +++ b/docs/ru/config/inbounds/vmess.md @@ -103,5 +103,3 @@ VMess полагается на системное время. Убедитес Уровень пользователя, который будет использоваться соединением для определения соответствующей [локальной политики](../policy.md#levelpolicyobject). Значение `level` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. - - diff --git a/docs/ru/config/inbounds/wireguard.md b/docs/ru/config/inbounds/wireguard.md index e1a52cb..eb5de7d 100644 --- a/docs/ru/config/inbounds/wireguard.md +++ b/docs/ru/config/inbounds/wireguard.md @@ -3,7 +3,7 @@ Реализация протокола Wireguard в пользовательском пространстве. ::: danger -**Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.** +**Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.** ::: ## InboundConfigurationObject @@ -14,7 +14,7 @@ "peers": [ { "publicKey": "PUBLIC_KEY", - "allowedIPs":[""] + "allowedIPs": [""] } ], "mtu": 1420 // необязательно, по умолчанию 1420 @@ -44,7 +44,8 @@ - 16 байт — аутентификационный тег ``` -```N байт — зашифрованные данные``` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт). +`N байт — зашифрованные данные` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт). + > `peers`: \[ [Peers](#peers) \] diff --git a/docs/ru/config/log.md b/docs/ru/config/log.md index 36bcfad..cfbca7c 100644 --- a/docs/ru/config/log.md +++ b/docs/ru/config/log.md @@ -6,7 +6,7 @@ Xray имеет два типа журналов: журнал доступа и Вы можете настроить способ вывода каждого типа журнала отдельно. ::: tip -Настройки логирования применяются не сразу. Поэтому в процессе запуска вы можете увидеть записи от несконфигурированного логгера. Например, могут появиться сообщения уровня `"info"`, даже если вы установили уровень логирования `"warning"`. +Настройки логирования применяются не сразу. Поэтому в процессе запуска вы можете увидеть записи от несконфигурированного логгера. Например, могут появиться сообщения уровня `"info"`, даже если вы установили уровень логирования `"warning"`. ::: ## LogObject @@ -43,15 +43,15 @@ LogObject соответствует полю `log` в конфигурацио > `loglevel`: "debug" | "info" | "warning" | "error" | "none" -Уровень логирования для журнала ошибок, указывающий, какая информация должна быть записана. Значение по умолчанию — `"warning"`. -Обратите внимание, что этот параметр применяется только к журналу ошибок. Он не влияет на журнал доступа (за исключением значения `"none"`). Журнал доступа не имеет уровней логирования. +Уровень логирования для журнала ошибок, указывающий, какая информация должна быть записана. Значение по умолчанию — `"warning"`. +Обратите внимание, что этот параметр применяется только к журналу ошибок. Он не влияет на журнал доступа (за исключением значения `"none"`). Журнал доступа не имеет уровней логирования. - `"debug"`: информация, используемая при отладке программы. - Включает всю информацию уровня `"info"`. + Включает всю информацию уровня `"info"`. - `"info"`: информация о состоянии во время выполнения и т.д., не влияющая на нормальную работу. - Включает всю информацию уровня `"warning"`. + Включает всю информацию уровня `"warning"`. - `"warning"`: информация, выводимая при возникновении проблем, не влияющих на нормальную работу, но которые могут повлиять на работу пользователя. - Включает всю информацию уровня `"error"`. + Включает всю информацию уровня `"error"`. - `"error"`: Xray столкнулся с проблемой, которая не позволяет ему работать нормально, и ее необходимо немедленно решить. - `"none"`: не записывать ничего. @@ -60,12 +60,13 @@ LogObject соответствует полю `log` в конфигурацио Записывать DNS-запросы, сделанные встроенными DNS-клиентами, в журнал доступа. Пример записи в журнале: DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms. ::: tip + 1. Xray не выполняет все DNS-запросы через свои встроенные клиенты. Поэтому включение этой опции не означает, что все DNS-запросы, выполняемые Xray, будут записаны в журнал. 2. DNS-запросы, сделанные встроенными DNS-клиентами, также записываются в журнал ошибок (с уровнем "Info") даже если эта опция отключена. 3. Запросы клиента FakeDNS никогда не записываются в журнал доступа. -::: + ::: > `maskAddress`: "quarter" | "half" | "full" diff --git a/docs/ru/config/metrics.md b/docs/ru/config/metrics.md index fb83dbb..68e7335 100644 --- a/docs/ru/config/metrics.md +++ b/docs/ru/config/metrics.md @@ -15,11 +15,11 @@ > `tag`: string -Тег исходящего прокси для метрик. Настроив входящее соединение AnyDoor и маршрутизацию AnyDoor на этот исходящий прокси, вы сможете получить доступ к метрикам через AnyDoor. +Тег исходящего прокси для метрик. Настроив входящее соединение AnyDoor и маршрутизацию AnyDoor на этот исходящий прокси, вы сможете получить доступ к метрикам через AnyDoor. > `listen`: string -Более простой способ — просто прослушивать указанный адрес и порт для предоставления сервиса. +Более простой способ — просто прослушивать указанный адрес и порт для предоставления сервиса. Если при установке этого поля `tag` пустой, он автоматически устанавливается в `Metrics`. Если оба поля не заданы, ядро не запустится. @@ -36,8 +36,9 @@ Перейдите по адресу `http://127.0.0.1:11111/debug/vars`. Содержит следующие переменные: -* `stats`: включает все данные о входящих и исходящих соединениях, а также о пользователях. -* `observatory`: содержит результаты наблюдений observatory. + +- `stats`: включает все данные о входящих и исходящих соединениях, а также о пользователях. +- `observatory`: содержит результаты наблюдений observatory. Например, в [luci-app-xray](https://github.com/yichya/luci-app-xray) вы можете получить следующий вывод (стандартное содержимое expvar, такое как cmdline и memstats, опущено): @@ -45,91 +46,92 @@ ```json { - "observatory": { - "tcp_outbound": { - "alive": true, - "delay": 782, - "outbound_tag": "tcp_outbound", - "last_seen_time": 1648477189, - "last_try_time": 1648477189 - }, - "udp_outbound": { - "alive": true, - "delay": 779, - "outbound_tag": "udp_outbound", - "last_seen_time": 1648477191, - "last_try_time": 1648477191 - } + "observatory": { + "tcp_outbound": { + "alive": true, + "delay": 782, + "outbound_tag": "tcp_outbound", + "last_seen_time": 1648477189, + "last_try_time": 1648477189 }, - "stats": { - "inbound": { - "api": { - "downlink": 0, - "uplink": 0 - }, - "dns_server_inbound_5300": { - "downlink": 14286, - "uplink": 5857 - }, - "http_inbound": { - "downlink": 74460, - "uplink": 10231 - }, - "https_inbound": { - "downlink": 0, - "uplink": 0 - }, - "metrics": { - "downlink": 6327, - "uplink": 1347 - }, - "socks_inbound": { - "downlink": 19925615, - "uplink": 5512 - }, - "tproxy_tcp_inbound": { - "downlink": 4739161, - "uplink": 1568869 - }, - "tproxy_udp_inbound": { - "downlink": 0, - "uplink": 2608142 - } - }, - "outbound": { - "blackhole_outbound": { - "downlink": 0, - "uplink": 0 - }, - "direct": { - "downlink": 97714548, - "uplink": 3234617 - }, - "dns_server_outbound": { - "downlink": 7116, - "uplink": 2229 - }, - "manual_tproxy_outbound_tcp_1": { - "downlink": 0, - "uplink": 0 - }, - "manual_tproxy_outbound_udp_1": { - "downlink": 0, - "uplink": 0 - }, - "tcp_outbound": { - "downlink": 23873238, - "uplink": 1049595 - }, - "udp_outbound": { - "downlink": 639282, - "uplink": 74634 - } - }, - "user": {} + "udp_outbound": { + "alive": true, + "delay": 779, + "outbound_tag": "udp_outbound", + "last_seen_time": 1648477191, + "last_try_time": 1648477191 } + }, + "stats": { + "inbound": { + "api": { + "downlink": 0, + "uplink": 0 + }, + "dns_server_inbound_5300": { + "downlink": 14286, + "uplink": 5857 + }, + "http_inbound": { + "downlink": 74460, + "uplink": 10231 + }, + "https_inbound": { + "downlink": 0, + "uplink": 0 + }, + "metrics": { + "downlink": 6327, + "uplink": 1347 + }, + "socks_inbound": { + "downlink": 19925615, + "uplink": 5512 + }, + "tproxy_tcp_inbound": { + "downlink": 4739161, + "uplink": 1568869 + }, + "tproxy_udp_inbound": { + "downlink": 0, + "uplink": 2608142 + } + }, + "outbound": { + "blackhole_outbound": { + "downlink": 0, + "uplink": 0 + }, + "direct": { + "downlink": 97714548, + "uplink": 3234617 + }, + "dns_server_outbound": { + "downlink": 7116, + "uplink": 2229 + }, + "manual_tproxy_outbound_tcp_1": { + "downlink": 0, + "uplink": 0 + }, + "manual_tproxy_outbound_udp_1": { + "downlink": 0, + "uplink": 0 + }, + "tcp_outbound": { + "downlink": 23873238, + "uplink": 1049595 + }, + "udp_outbound": { + "downlink": 639282, + "uplink": 74634 + } + }, + "user": {} + } } ``` + Для лучшей визуализации можно использовать [Netdata](https://github.com/netdata/netdata) (с плагином python.d): @@ -244,6 +246,7 @@ xray: id: udp expvar_type: int ``` + Вы получите результат, подобный этому: diff --git a/docs/ru/config/observatory.md b/docs/ru/config/observatory.md index c85c341..94f78bd 100644 --- a/docs/ru/config/observatory.md +++ b/docs/ru/config/observatory.md @@ -1,6 +1,6 @@ # Мониторинг подключений -Компонент мониторинга подключений использует HTTP-пинги для проверки состояния подключения исходящих прокси. Результаты мониторинга могут использоваться другими компонентами, например, балансировщиком нагрузки. +Компонент мониторинга подключений использует HTTP-пинги для проверки состояния подключения исходящих прокси. Результаты мониторинга могут использоваться другими компонентами, например, балансировщиком нагрузки. В настоящее время доступны два режима: [observatory](#observatoryobject) (фоновый мониторинг подключений) и [burstObservatory](#burstobservatoryobject) (мониторинг параллельных подключений). Выберите один из них в соответствии с вашими потребностями. @@ -8,9 +8,7 @@ ```json { - "subjectSelector":[ - "outbound" - ], + "subjectSelector": ["outbound"], "probeUrl": "https://www.google.com/generate_204", "probeInterval": "10s", "enableConcurrency": false @@ -41,9 +39,7 @@ URL-адрес, используемый для проверки состоян ```json { - "subjectSelector":[ - "outbound" - ], + "subjectSelector": ["outbound"], "pingConfig": {} } ``` @@ -55,7 +51,6 @@ URL-адрес, используемый для проверки состоян > `pingConfig`: [PingConfigObject](#PingConfigObject) - ### PingConfigObject ```json @@ -92,9 +87,3 @@ URL-адрес, используемый для проверки подключ Время ожидания ответа при проверке. Формат такой же, как и у `interval`. - - - - - - diff --git a/docs/ru/config/outbound.md b/docs/ru/config/outbound.md index ec0baf2..cbe2c6d 100644 --- a/docs/ru/config/outbound.md +++ b/docs/ru/config/outbound.md @@ -1,6 +1,6 @@ # Исходящие подключения -Исходящие подключения используются для отправки данных. Доступные протоколы см. в разделе [Исходящие протоколы](./outbounds/). +Исходящие подключения используются для отправки данных. Доступные протоколы см. в разделе [Исходящие протоколы](./outbounds/). ## OutboundObject @@ -41,7 +41,7 @@ Xray будет использовать случайный IP-адрес из Специальное значение `origin` — при использовании этого значения запросы будут отправляться с IP-адреса, через который было установлено соединение с локальной машиной. -Например, если на машине есть целый блок IPv4-адресов `11.4.5.0/24` и прослушивается 0.0.0.0 (все IPv4 и IPv6 адреса на сетевой карте), и клиент подключается к локальной машине через `11.4.5.14`, то исходящие запросы также будут отправляться через `11.4.5.14`. Если же клиент использует `11.4.5.10` для подключения к локальной машине, то исходящие запросы будут отправляться через `11.4.5.10`. То же самое относится и к случаям, когда на машине есть целый блок/несколько IPv6-адресов. +Например, если на машине есть целый блок IPv4-адресов `11.4.5.0/24` и прослушивается 0.0.0.0 (все IPv4 и IPv6 адреса на сетевой карте), и клиент подключается к локальной машине через `11.4.5.14`, то исходящие запросы также будут отправляться через `11.4.5.14`. Если же клиент использует `11.4.5.10` для подключения к локальной машине, то исходящие запросы будут отправляться через `11.4.5.10`. То же самое относится и к случаям, когда на машине есть целый блок/несколько IPv6-адресов. > `protocol`: string @@ -156,12 +156,5 @@ Mux нужно включать только на клиенте, сервер - По умолчанию `reject` - отклонять трафик (обычно браузеры автоматически переключаются на TCP HTTP/2). - `allow` - разрешить трафик через Mux. - `skip` - не использовать Mux для трафика UDP/443. - Будет использоваться исходный способ передачи UDP-трафика для данного протокола прокси. - Например, `Shadowsocks` будет использовать нативный UDP, а `VLESS` будет использовать UoT. - - - - - - - + Будет использоваться исходный способ передачи UDP-трафика для данного протокола прокси. + Например, `Shadowsocks` будет использовать нативный UDP, а `VLESS` будет использовать UoT. diff --git a/docs/ru/config/outbounds/blackhole.md b/docs/ru/config/outbounds/blackhole.md index 0cb698d..3f3c807 100644 --- a/docs/ru/config/outbounds/blackhole.md +++ b/docs/ru/config/outbounds/blackhole.md @@ -16,7 +16,7 @@ Blackhole - это протокол исходящих данных, котор Настройка ответа Blackhole. -Blackhole отправит указанный ответ после получения данных , а затем закроет соединение. Данные для будут отброшены. +Blackhole отправит указанный ответ после получения данных , а затем закроет соединение. Данные для будут отброшены. Если этот параметр не указан, Blackhole просто закроет соединение. ### ResponseObject @@ -32,7 +32,3 @@ Blackhole отправит указанный ответ после получе Если `type` равен `"none"` (значение по умолчанию), Blackhole просто закроет соединение. Если `type` равен `"http"`, Blackhole вернет простой пакет HTTP 403, а затем закроет соединение. - - - - diff --git a/docs/ru/config/outbounds/freedom.md b/docs/ru/config/outbounds/freedom.md index 3b5ff2d..bafe56c 100644 --- a/docs/ru/config/outbounds/freedom.md +++ b/docs/ru/config/outbounds/freedom.md @@ -36,7 +36,7 @@ Freedom — это исходящий протокол, который можн - При использовании `"AsIs"`, Xray будет напрямую использовать приоритет подключений по умолчанию в Golang. По некоторым причинам, UDP-соединения, использующие доменное имя, игнорируют системные настройки приоритета IPv4. - При указании других значений для разрешения будет использоваться [встроенный DNS-сервер](../dns.md) Xray-core. Если `DNSObject` не существует, будет использоваться системный DNS. Если имеется несколько подходящих IP-адресов, ядро случайным образом выберет один из них в качестве целевого IP-адреса. -- `"IPv4"` означает попытку установить соединение, используя только IPv4, `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. *(Если поменять местами v4 и v6, логика остается аналогичной)* +- `"IPv4"` означает попытку установить соединение, используя только IPv4, `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. _(Если поменять местами v4 и v6, логика остается аналогичной)_ - Если в настройках встроенного DNS указан `"queryStrategy"`, фактическое поведение будет объединено с этим параметром, и будут разрешаться только те типы IP, которые указаны в обоих параметрах. Например, `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`. - При использовании параметров, начинающихся с `"Use"`, если результат разрешения не соответствует требованиям (например, доменное имя имеет только запись A, но используется `UseIPv6`), будет выполнен откат к `AsIs`. @@ -76,7 +76,7 @@ Freedom будет принудительно отправлять все дан > `noises`: array -UDP-шум, используемый для отправки случайных данных в качестве "шума" перед установлением UDP-соединения. Наличие этой структуры считается включением. Это может обмануть снифферы, но также может нарушить нормальное соединение. Используйте на свой страх и риск. По этой причине он обходит порт 53, так как это нарушает работу DNS. +UDP-шум, используемый для отправки случайных данных в качестве "шума" перед установлением UDP-соединения. Наличие этой структуры считается включением. Это может обмануть снифферы, но также может нарушить нормальное соединение. Используйте на свой страх и риск. По этой причине он обходит порт 53, так как это нарушает работу DNS. Массив, в котором можно определить несколько пакетов шума для отправки. Отдельный элемент массива определяется следующим образом: @@ -95,4 +95,4 @@ UDP-шум, используемый для отправки случайных Протокол PROXY обычно используется в сочетании с `redirect` для перенаправления на сервер Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано. -`proxyProtocol` принимает значение номера версии протокола PROXY — `1` или `2`. Если не указано, по умолчанию используется значение `0` (протокол не используется). +`proxyProtocol` принимает значение номера версии протокола PROXY — `1` или `2`. Если не указано, по умолчанию используется значение `0` (протокол не используется). diff --git a/docs/ru/config/outbounds/http.md b/docs/ru/config/outbounds/http.md index 5e4c29e..279f94d 100644 --- a/docs/ru/config/outbounds/http.md +++ b/docs/ru/config/outbounds/http.md @@ -88,6 +88,3 @@ HTTP-заголовки, пара "ключ-значение". Каждый кл > `pass`: string Пароль, тип данных: строка. Обязательный параметр. - - - diff --git a/docs/ru/config/outbounds/loopback.md b/docs/ru/config/outbounds/loopback.md index 2bf4dc0..3c0d29e 100644 --- a/docs/ru/config/outbounds/loopback.md +++ b/docs/ru/config/outbounds/loopback.md @@ -20,7 +20,7 @@ Loopback - это исходящий протокол данных, которы Если необходимо, чтобы трафик, уже разделенный по правилам маршрутизации, был перенаправлен другими правилами маршрутизации (например, трафик TCP и UDP, разделенный одними и теми же правилами маршрутизации, должен идти через разные исходящие соединения), можно использовать исходящее соединение `loopback`. -``` json +```json { "outbounds": [ { @@ -31,11 +31,11 @@ Loopback - это исходящий протокол данных, которы } }, { - "tag": "tcp-output", + "tag": "tcp-output" // Настройки protocol, settings, streamSettings и т. д. }, { - "tag": "udp-output", + "tag": "udp-output" // Настройки protocol, settings, streamSettings и т. д. } ], @@ -55,5 +55,3 @@ Loopback - это исходящий протокол данных, которы } } ``` - - diff --git a/docs/ru/config/outbounds/shadowsocks.md b/docs/ru/config/outbounds/shadowsocks.md index 0cac2c6..fb17fc9 100644 --- a/docs/ru/config/outbounds/shadowsocks.md +++ b/docs/ru/config/outbounds/shadowsocks.md @@ -101,11 +101,11 @@ Используйте `openssl rand -base64 <длина>`, чтобы сгенерировать ключ, совместимый с shadowsocks-rust, длина зависит от используемого метода шифрования. -| Метод шифрования | Длина ключа | -| ------------------------------------ | ----------: | -| 2022-blake3-aes-128-gcm | 16 | -| 2022-blake3-aes-256-gcm | 32 | -| 2022-blake3-chacha20-poly1305 | 32 | +| Метод шифрования | Длина ключа | +| ----------------------------- | ----------: | +| 2022-blake3-aes-128-gcm | 16 | +| 2022-blake3-aes-256-gcm | 32 | +| 2022-blake3-chacha20-poly1305 | 32 | В реализации Go всегда работают 32-битные ключи. @@ -118,6 +118,3 @@ Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Значение `level` соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. - - - diff --git a/docs/ru/config/outbounds/socks.md b/docs/ru/config/outbounds/socks.md index ee648fd..35162c2 100644 --- a/docs/ru/config/outbounds/socks.md +++ b/docs/ru/config/outbounds/socks.md @@ -89,6 +89,3 @@ Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. - - - diff --git a/docs/ru/config/outbounds/trojan.md b/docs/ru/config/outbounds/trojan.md index 62cc269..fb082ce 100644 --- a/docs/ru/config/outbounds/trojan.md +++ b/docs/ru/config/outbounds/trojan.md @@ -6,7 +6,6 @@ Trojan предназначен для работы в правильно настроенном зашифрованном TLS-туннеле. ::: - ## OutboundConfigurationObject ```json @@ -60,8 +59,3 @@ Trojan предназначен для работы в правильно нас Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. - - - - - diff --git a/docs/ru/config/outbounds/vless.md b/docs/ru/config/outbounds/vless.md index af03c76..737e5de 100644 --- a/docs/ru/config/outbounds/vless.md +++ b/docs/ru/config/outbounds/vless.md @@ -8,7 +8,6 @@ VLESS - это легкий транспортный протокол без с В отличие от [VMess](./vmess.md), VLESS не зависит от системного времени, аутентификация также осуществляется с помощью UUID. - ## OutboundConfigurationObject ```json @@ -135,5 +134,3 @@ Splice - это функция, предоставляемая ядром Linux, Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. - - diff --git a/docs/ru/config/outbounds/vmess.md b/docs/ru/config/outbounds/vmess.md index 5c09264..14690c1 100644 --- a/docs/ru/config/outbounds/vmess.md +++ b/docs/ru/config/outbounds/vmess.md @@ -118,7 +118,3 @@ VMess полагается на системное время. Убедитес "AuthenticatedLength" включает эксперимент с аутентифицированной длиной пакета. Этот эксперимент необходимо включить одновременно на клиенте и сервере, а также запустить одну и ту же версию программы. "NoTerminationSignal" включает эксперимент с отключением сигнала завершения соединения. Этот эксперимент может повлиять на стабильность проксируемого соединения. - - - - diff --git a/docs/ru/config/outbounds/wireguard.md b/docs/ru/config/outbounds/wireguard.md index 56f5633..403f58d 100644 --- a/docs/ru/config/outbounds/wireguard.md +++ b/docs/ru/config/outbounds/wireguard.md @@ -72,7 +72,8 @@ MTU нижнего уровня tun в Wireguard. - 16 байт — аутентификационный тег ``` -```N байт — зашифрованные данные``` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт). +`N байт — зашифрованные данные` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт). + > `reserved` \[ number \] diff --git a/docs/ru/config/policy.md b/docs/ru/config/policy.md index de791d6..cd3cd0f 100644 --- a/docs/ru/config/policy.md +++ b/docs/ru/config/policy.md @@ -143,7 +143,3 @@ Xray будет применять различные локальные пол > `statsOutboundDownlink`: true | false Если значение равно `true`, включить учет входящего трафика для всех исходящих подключений. - - - - diff --git a/docs/ru/config/reverse.md b/docs/ru/config/reverse.md index 4d97fa2..cc75a20 100644 --- a/docs/ru/config/reverse.md +++ b/docs/ru/config/reverse.md @@ -6,18 +6,21 @@ Принцип работы обратного прокси примерно следующий: -- Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A. - - На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал). - - На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост). +- Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A. + + - На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал). + - На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост). - `bridge` - - `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно. - - После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации. - - После получения ответа `bridge` также возвращает его без изменений `portal`. + + - `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно. + - После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации. + - После получения ответа `bridge` также возвращает его без изменений `portal`. - `portal` - - Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала. - - Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`. + + - Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала. + - Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`. - `bridge` выполняет динамическую балансировку нагрузки в зависимости от объема трафика. @@ -39,16 +42,16 @@ "bridges": [ { "tag": "bridge", - "domain": "reverse-proxy.xray.internal" - } + "domain": "reverse-proxy.xray.internal", + }, ], "portals": [ { "tag": "portal", - "domain": "reverse-proxy.xray.internal" - } - ] - } + "domain": "reverse-proxy.xray.internal", + }, + ], + }, } ``` @@ -65,7 +68,7 @@ ```jsonc { "tag": "bridge", - "domain": "reverse-proxy.xray.internal" + "domain": "reverse-proxy.xray.internal", } ``` @@ -83,7 +86,7 @@ ```jsonc { "tag": "portal", - "domain": "reverse-proxy.xray.internal" + "domain": "reverse-proxy.xray.internal", } ``` @@ -93,8 +96,7 @@ > `domain`: string -Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку. - +Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку. ::: tip Один Xray может быть `bridge`, `portal` или одновременно и тем, и другим, чтобы соответствовать требованиям различных сценариев. @@ -108,7 +110,7 @@ ### Конфигурация bridge -`bridge` обычно требует двух исходящих соединений (outbound): одно для подключения к `portal`, другое для отправки фактического трафика. Другими словами, вам нужно использовать маршрутизацию для различения двух типов трафика. +`bridge` обычно требует двух исходящих соединений (outbound): одно для подключения к `portal`, другое для отправки фактического трафика. Другими словами, вам нужно использовать маршрутизацию для различения двух типов трафика. Конфигурация обратного прокси: @@ -131,8 +133,8 @@ outbound: "tag": "out", "protocol": "freedom", "settings": { - "redirect": "127.0.0.1:80" - } + "redirect": "127.0.0.1:80", + }, } ``` @@ -147,13 +149,13 @@ outbound: "port": 1024, "users": [ { - "id": "5783a3e7-e373-51cd-8642-c83782b807c5" - } - ] - } - ] + "id": "5783a3e7-e373-51cd-8642-c83782b807c5", + }, + ], + }, + ], }, - "tag": "interconn" + "tag": "interconn", } ``` @@ -169,22 +171,22 @@ outbound: "type": "field", "inboundTag": ["bridge"], "domain": ["full:reverse-proxy.xray.internal"], - "outboundTag": "interconn" + "outboundTag": "interconn", }, { // Трафик от portal также будет выходить из bridge, но без указанного выше домена // маршрутизируем на out, то есть перенаправляем на веб-сервер "type": "field", "inboundTag": ["bridge"], - "outboundTag": "out" - } - ] + "outboundTag": "out", + }, + ], } ``` ### Конфигурация portal -`portal` обычно требует двух входящих соединений (inbound): одно для приема соединений от `bridge`, другое для приема фактического трафика. Вам также нужно использовать маршрутизацию для различения двух типов трафика. +`portal` обычно требует двух входящих соединений (inbound): одно для приема соединений от `bridge`, другое для приема фактического трафика. Вам также нужно использовать маршрутизацию для различения двух типов трафика. Конфигурация обратного прокси: @@ -210,8 +212,8 @@ inbound: "settings": { "address": "127.0.0.1", "port": 80, - "network": "tcp" - } + "network": "tcp", + }, } ``` @@ -224,10 +226,10 @@ inbound: "settings": { "clients": [ { - "id": "5783a3e7-e373-51cd-8642-c83782b807c5" - } - ] - } + "id": "5783a3e7-e373-51cd-8642-c83782b807c5", + }, + ], + }, } ``` @@ -241,7 +243,7 @@ inbound: // маршрутизируем на portal, который в конечном итоге перенаправит его на bridge "type": "field", "inboundTag": ["external"], - "outboundTag": "portal" + "outboundTag": "portal", }, { // Если входящее соединение от interconn, значит, это запрос от bridge для установления обратного туннеля, @@ -250,8 +252,8 @@ inbound: // маршрутизируемых на portal. "type": "field", "inboundTag": ["interconn"], - "outboundTag": "portal" - } - ] + "outboundTag": "portal", + }, + ], } ``` diff --git a/docs/ru/config/routing.md b/docs/ru/config/routing.md index 09dcf15..38d7290 100644 --- a/docs/ru/config/routing.md +++ b/docs/ru/config/routing.md @@ -27,8 +27,8 @@ - `"AsIs"`: для выбора маршрута используются только доменные имена. Значение по умолчанию. - `"IPIfNonMatch"`: если доменное имя не соответствует ни одному правилу, доменное имя разрешается в IP-адрес (запись A или запись AAAA) для повторного сопоставления; - - Если у доменного имени несколько записей A, предпринимается попытка сопоставить все записи A, пока одна из них не будет соответствовать какому-либо правилу; - - Разрешенный IP-адрес используется только при выборе маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя; + - Если у доменного имени несколько записей A, предпринимается попытка сопоставить все записи A, пока одна из них не будет соответствовать какому-либо правилу; + - Разрешенный IP-адрес используется только при выборе маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя; - `"IPOnDemand"`: если при сопоставлении встречается любое правило на основе IP-адреса, доменное имя немедленно разрешается в IP-адрес для сопоставления; > `domainMatcher`: "hybrid" | "linear" @@ -117,8 +117,8 @@ - IP-адрес: например, `"127.0.0.1"`. - [CIDR](https://ru.wikipedia.org/wiki/Бесклассовая_междоменная_маршрутизация): например, `"10.0.0.0/8"`, также можно использовать `"0.0.0.0/0"` `"::/0"` для указания всех IPv4- или IPv6-адресов. - Предопределенный список IP-адресов: этот список встроен в каждый установочный пакет Xray, имя файла - `geoip.dat`. Формат использования: `"geoip:код_страны"`, должно начинаться с `geoip:` (в нижнем регистре), за которым следует двухбуквенный код страны, поддерживаются почти все страны с доступом в Интернет. - - Специальное значение: `"geoip:private"`, включает в себя все частные адреса, например, `127.0.0.1`. - - Функция инверсии (!), `"geoip:!cn"` означает результаты, не входящие в `geoip:cn`. + - Специальное значение: `"geoip:private"`, включает в себя все частные адреса, например, `127.0.0.1`. + - Функция инверсии (!), `"geoip:!cn"` означает результаты, не входящие в `geoip:cn`. - Загрузка IP-адресов из файла: имеет вид `"ext:файл:тег"`, должно начинаться с `ext:` (в нижнем регистре), за которым следует имя файла и тег, файл хранится в [каталоге ресурсов](./features/env.md#путь-к-файлу-ресурсов), формат файла такой же, как у `geoip.dat`, тег должен существовать в файле. > `port`: number | string @@ -234,12 +234,14 @@ JSON-объект, где ключи и значения являются стр > `strategy`: [StrategyObject](#strategyobject) #### StrategyObject + ```json { - "type": "roundRobin", - "settings": {} + "type": "roundRobin", + "settings": {} } ``` + > `type` : "random" | "roundRobin" | "leastPing" | "leastLoad" - `random`: значение по умолчанию. Случайным образом выбирает соответствующий исходящий прокси. @@ -250,19 +252,22 @@ JSON-объект, где ключи и значения являются стр > `settings`: [StrategySettingsObject](#strategysettingsobject) ##### StrategySettingsObject + Это необязательный параметр конфигурации, формат которого различается для разных стратегий балансировки нагрузки. В настоящее время этот параметр конфигурации можно добавить только для стратегии балансировки нагрузки `leastLoad`. ```json { - "expected": 2, - "maxRTT": "1s", - "tolerance": 0.01, - "baselines": ["1s"], - "costs": [{ - "regexp": false, - "match": "tag", - "value": 0.5 - }] + "expected": 2, + "maxRTT": "1s", + "tolerance": 0.01, + "baselines": ["1s"], + "costs": [ + { + "regexp": false, + "match": "tag", + "value": 0.5 + } + ] } ``` diff --git a/docs/ru/config/stats.md b/docs/ru/config/stats.md index 9ec68f6..65344a3 100644 --- a/docs/ru/config/stats.md +++ b/docs/ru/config/stats.md @@ -53,4 +53,4 @@ - `outbound>>>[tag]>>>traffic>>>downlink` - Входящий трафик для определенного исходящего подключения в байтах. \ No newline at end of file + Входящий трафик для определенного исходящего подключения в байтах. diff --git a/docs/ru/config/transport.md b/docs/ru/config/transport.md index 75d8b62..4a8b3de 100644 --- a/docs/ru/config/transport.md +++ b/docs/ru/config/transport.md @@ -5,7 +5,6 @@ Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт. Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено. - ## StreamSettingsObject `StreamSettingsObject` соответствует элементу `streamSettings` во входящем или исходящем подключении. Для каждого входящего или исходящего подключения можно настроить различные параметры передачи, и можно использовать `streamSettings` для настройки некоторых параметров передачи. @@ -106,7 +105,7 @@ Reality — это самое безопасное на данный момен ```json { "serverName": "xray.com", - "serverNameToVerify":"", + "serverNameToVerify": "", "rejectUnknownSni": false, "allowInsecure": false, "alpn": ["h2", "http/1.1"], @@ -137,7 +136,7 @@ Reality — это самое безопасное на данный момен > `serverNameToVerify`: string -Только для клиента. Используется для проверки SNI сертификата, переопределяя `serverName`, используемый для проверки. Предназначен для таких специальных целей, как domain fronting. Более безопасен, чем изменение `serverName` и включение `allowInsecure`, так как по-прежнему выполняется проверка подписи сертификата. Однако это эксклюзивная функция utls, требующая настройки `fingerprint` для активации utls. +Только для клиента. Используется для проверки SNI сертификата, переопределяя `serverName`, используемый для проверки. Предназначен для таких специальных целей, как domain fronting. Более безопасен, чем изменение `serverName` и включение `allowInsecure`, так как по-прежнему выполняется проверка подписи сертификата. Однако это эксклюзивная функция utls, требующая настройки `fingerprint` для активации utls. > `rejectUnknownSni`: bool @@ -193,9 +192,9 @@ Reality — это самое безопасное на данный момен Этот параметр используется для настройки указанного отпечатка `TLS Client Hello`. -Значение по умолчанию `chrome` . +Значение по умолчанию `chrome` . -При включении Xray будет **эмулировать** отпечаток `TLS` через библиотеку uTLS или генерировать его случайным образом. +При включении Xray будет **эмулировать** отпечаток `TLS` через библиотеку uTLS или генерировать его случайным образом. Поддерживаются четыре режима настройки: 1. Отпечатки TLS последних версий популярных браузеров, включая: @@ -216,7 +215,6 @@ Reality — это самое безопасное на данный момен 3. Использование имени переменной отпечатка uTLS, например, `"HelloRandomizedNoALPN"` `"HelloChrome_106_Shuffle"`. Полный список см. в [библиотеке uTLS](https://github.com/refraction-networking/utls/blob/master/u_common.go#L434). - 4. Отключение **эмуляции** отпечатка `TLS Client Hello` ::: danger @@ -259,14 +257,15 @@ Reality — это самое безопасное на данный момен Если вам нужно получить оценку A/A+ в ssllibs или myssl, пожалуйста, обратитесь к [этому](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600). ::: -> `curvePreferences`: \[ string \] + +> `curvePreferences`: \[ string \] Массив строк, задающий предпочтительные кривые для выполнения ECDHE во время TLS-рукопожатия. Список поддерживаемых кривых приведён ниже (регистр не имеет значения): CurveP256 CurveP384 CurveP521 X25519 -x25519Kyber768Draft00 +x25519Kyber768Draft00 Например, установка значения `"curvePreferences":["x25519Kyber768Draft00"]` позволяет включить экспериментальный алгоритм. Поскольку этот алгоритм находится на стадии черновика, данное поле может измениться в любой момент. @@ -333,7 +332,7 @@ Reality лишь модифицирует TLS, и для реализации н Обычно он совпадает с `dest`, фактическое допустимое значение — это любой SNI, принимаемый сервером (в зависимости от конфигурации `dest`), в качестве справки можно использовать [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) возвращаемого сертификата. -Может содержать пустое значение ```""```, что означает принятие соединений без SNI. +Может содержать пустое значение `""`, что означает принятие соединений без SNI. > `privateKey` : string @@ -367,7 +366,7 @@ Reality лишь модифицирует TLS, и для реализации н Один из `serverNames` сервера. -Если `serverNames` сервера содержит пустое значение, то, как и в случае с TLS, клиент может использовать ```"serverName": "0.0.0.0"``` для установления соединения без SNI. В отличие от TLS, REALITY не требует и не имеет опции разрешения небезопасных соединений для этой функции. При использовании этой функции убедитесь, что `dest` возвращает сертификат по умолчанию при принятии соединений без SNI. +Если `serverNames` сервера содержит пустое значение, то, как и в случае с TLS, клиент может использовать `"serverName": "0.0.0.0"` для установления соединения без SNI. В отличие от TLS, REALITY не требует и не имеет опции разрешения небезопасных соединений для этой функции. При использовании этой функции убедитесь, что `dest` возвращает сертификат по умолчанию при принятии соединений без SNI. > `fingerprint` : string @@ -556,22 +555,22 @@ Reality лишь модифицирует TLS, и для реализации н > `tcpFastOpen`: true | false | number -Включить [TCP Fast Open](https://ru.wikipedia.org/wiki/TCP_Fast_Open). +Включить [TCP Fast Open](https://ru.wikipedia.org/wiki/TCP_Fast_Open). Если значение равно `true` или **положительному целому числу**, то TFO включается; если значение равно `false` или **отрицательному числу**, то TFO принудительно отключается; если параметр отсутствует или равен `0`, то используются настройки системы по умолчанию. Можно использовать как для входящих, так и для исходящих подключений. - Доступно только в следующих (или более новых) версиях операционных систем: - - Linux 3.16: требуется настройка параметра ядра `net.ipv4.tcp_fastopen`, который представляет собой битовую маску, где `0x1` означает, что клиент может включать TFO, а `0x2` означает, что сервер может включать TFO; значение по умолчанию — `0x1`, если серверу необходимо включить TFO, установите значение этого параметра ядра в `0x3`. - - ~~Windows 10 (1607)~~ (реализовано неправильно) - - Mac OS 10.11 / iOS 9 (требуется тестирование) - - FreeBSD 10.3 (Server) / 12.0 (Client): необходимо установить параметры ядра `net.inet.tcp.fastopen.server_enabled` и `net.inet.tcp.fastopen.client_enabled` в значение `1`. (Требуется тестирование) + - Linux 3.16: требуется настройка параметра ядра `net.ipv4.tcp_fastopen`, который представляет собой битовую маску, где `0x1` означает, что клиент может включать TFO, а `0x2` означает, что сервер может включать TFO; значение по умолчанию — `0x1`, если серверу необходимо включить TFO, установите значение этого параметра ядра в `0x3`. + - ~~Windows 10 (1607)~~ (реализовано неправильно) + - Mac OS 10.11 / iOS 9 (требуется тестирование) + - FreeBSD 10.3 (Server) / 12.0 (Client): необходимо установить параметры ядра `net.inet.tcp.fastopen.server_enabled` и `net.inet.tcp.fastopen.client_enabled` в значение `1`. (Требуется тестирование) - Для входящих подключений установленное здесь **положительное целое число** представляет собой [максимальное количество ожидающих запросов на подключение TFO](https://tools.ietf.org/html/rfc7413#section-5.1), **обратите внимание, что не все операционные системы поддерживают эту настройку**: - - Linux / FreeBSD: установленное здесь **положительное целое число** представляет собой максимальное значение, максимально допустимое значение — 2147483647, если установлено значение `true`, то используется значение `256`; обратите внимание, что в Linux `net.core.somaxconn` ограничивает максимальное значение, если оно превышает `somaxconn`, то необходимо также увеличить `somaxconn`. - - Mac OS: если здесь установлено значение `true` или **положительное целое число**, это означает только включение TFO, максимальное значение необходимо установить отдельно с помощью параметра ядра `net.inet.tcp.fastopen_backlog`. - - Windows: если здесь установлено значение `true` или **положительное целое число**, это означает только включение TFO. + - Linux / FreeBSD: установленное здесь **положительное целое число** представляет собой максимальное значение, максимально допустимое значение — 2147483647, если установлено значение `true`, то используется значение `256`; обратите внимание, что в Linux `net.core.somaxconn` ограничивает максимальное значение, если оно превышает `somaxconn`, то необходимо также увеличить `somaxconn`. + - Mac OS: если здесь установлено значение `true` или **положительное целое число**, это означает только включение TFO, максимальное значение необходимо установить отдельно с помощью параметра ядра `net.inet.tcp.fastopen_backlog`. + - Windows: если здесь установлено значение `true` или **положительное целое число**, это означает только включение TFO. - Для исходящих подключений установка значения `true` или **положительного целого числа** в любой операционной системе означает только включение TFO. @@ -593,21 +592,20 @@ Reality лишь модифицирует TLS, и для реализации н > "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4" > "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" - В предыдущих версиях, когда Xray пытался установить системное соединение с использованием доменного имени, разрешение доменного имени выполнялось системой и не контролировалось Xray. Это приводило к таким проблемам, как [невозможность разрешить доменные имена в нестандартных средах Linux](https://github.com/v2ray/v2ray-core/issues/1909). Для решения этой проблемы в Xray 1.3.1 в Sockopt был добавлен параметр `domainStrategy` в разделе Freedom. Значение по умолчанию: `"AsIs"`. Если целевой адрес представлен доменным именем, можно настроить соответствующее значение. Поведение Freedom в зависимости от настройки следующее: -- При использовании `"AsIs"` Xray будет напрямую использовать встроенную функцию `Dial` из Go для установления соединения, с фиксированным приоритетом, заданным по умолчанию в RFC6724 (игнорируя такие настройки, как `gai.conf`). *(Простыми словами: IPv6 будет использоваться с приоритетом.)* +- При использовании `"AsIs"` Xray будет напрямую использовать встроенную функцию `Dial` из Go для установления соединения, с фиксированным приоритетом, заданным по умолчанию в RFC6724 (игнорируя такие настройки, как `gai.conf`). _(Простыми словами: IPv6 будет использоваться с приоритетом.)_ - При использовании другого значения будет применен [встроенный DNS-сервер](../dns.md) Xray-core для разрешения доменного имени. Если объект `DNSObject` отсутствует, будет использоваться системный DNS. Если существует несколько подходящих IP-адресов, ядро выберет один из них случайным образом. - `"IPv4"` означает попытку установить соединение, используя только IPv4, `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. - *(Если поменять местами v4 и v6, логика остается аналогичной)* + _(Если поменять местами v4 и v6, логика остается аналогичной)_ - Если во встроенном DNS установлен параметр `"queryStrategy"`, то фактическое поведение будет комбинацией с этим параметром, и будут разрешаться только типы IP-адресов, присутствующие в обоих параметрах. Например: - `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`. + `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`. ::: tip TIP При использовании режимов `"UseIP"` и `"ForceIP"` и если в [конфигурации исходящего подключения](../outbound.md#outboundobject) указан `sendThrough`, ядро автоматически определит необходимый тип IP (IPv4 или IPv6) на основе значения `sendThrough`. Если вручную указан один тип IP (например, UseIPv4), но он не соответствует локальному адресу, указанному в `sendThrough`, подключение завершится неудачно. @@ -708,7 +706,6 @@ Reality лишь модифицирует TLS, и для реализации н Указывает имя сетевого интерфейса для исходящего трафика. Поддерживается в Linux, iOS, macOS и Windows. - > `V6Only`: true | false Если установлено значение `true`, адрес `::` принимает только IPv6-соединения. Поддерживается только в Linux. @@ -717,10 +714,9 @@ Reality лишь модифицирует TLS, и для реализации н Объявленный размер окна ограничен этим значением. Ядро выберет максимальное значение между этим значением и SOCK_MIN_RCVBUF/2. - > `tcpMptcp`: true | false -По умолчанию этот параметр имеет значение `false`. Установите его в `true`, чтобы включить [Multipath TCP](https://en.wikipedia.org/wiki/Multipath_TCP). +По умолчанию этот параметр имеет значение `false`. Установите его в `true`, чтобы включить [Multipath TCP](https://en.wikipedia.org/wiki/Multipath_TCP). Обратите внимание, что этот параметр действует только на стороне клиента. В Golang версии 1.24 и выше MPTCP уже включен по умолчанию на стороне сервера (при прослушивании соединений). @@ -728,7 +724,7 @@ Reality лишь модифицирует TLS, и для реализации н > `tcpNoDelay`: true | false -Этот параметр удален, так как golang по умолчанию включает TCP no delay. Если вы хотите отключить его, используйте customSockopt. +Этот параметр удален, так как golang по умолчанию включает TCP no delay. Если вы хотите отключить его, используйте customSockopt. > `addressPortStrategy`: "none" | "SrvPortOnly" | "SrvAddressOnly" | "SrvPortAndAddress" | "TxtPortOnly" | "TxtAddressOnly" | "TxtPortAndAddress" @@ -742,9 +738,9 @@ Reality лишь модифицирует TLS, и для реализации н `AddressOnly`: Сброс только адреса. `PortAndAddress`: Сброс адреса и порта. -Важно! Данная настройка применяется *до* этапа выбора стратегии разрешения доменов (`domainStrategy`) в `sockopt`. После сброса адреса продолжает действовать `domainStrategy` (если она активна), но *после* того, как `domainStrategy` в `Freedom` уже отработала. Если в `Freedom` настроено явное разрешение в IP-адрес, данная опция не оказывает никакого эффекта. +Важно! Данная настройка применяется _до_ этапа выбора стратегии разрешения доменов (`domainStrategy`) в `sockopt`. После сброса адреса продолжает действовать `domainStrategy` (если она активна), но _после_ того, как `domainStrategy` в `Freedom` уже отработала. Если в `Freedom` настроено явное разрешение в IP-адрес, данная опция не оказывает никакого эффекта. -PS: Если трафик домена, например, обычный веб-трафик, маршрутизируется через `Freedom` с установленной стратегией `AsIs`, то при активации этой опции будет предпринята попытка разрешить домен и сбросить адрес/порт в соответствии с полученными данными. Например, ядро Xray попытается запросить SRV-запись для `google.com` и перенаправить трафик, опираясь на информацию из этой записи. +PS: Если трафик домена, например, обычный веб-трафик, маршрутизируется через `Freedom` с установленной стратегией `AsIs`, то при активации этой опции будет предпринята попытка разрешить домен и сбросить адрес/порт в соответствии с полученными данными. Например, ядро Xray попытается запросить SRV-запись для `google.com` и перенаправить трафик, опираясь на информацию из этой записи. > `customSockopt`: [] @@ -765,7 +761,7 @@ PS: Если трафик домена, например, обычный веб- > `type`: "" -Обязательный параметр. Тип настройки. Допустимые значения: int или str. +Обязательный параметр. Тип настройки. Допустимые значения: int или str. > `level`: "" @@ -773,7 +769,7 @@ PS: Если трафик домена, например, обычный веб- > `opt`: "" -Название опции, которую нужно установить. Используется десятичное представление (в примере, значение TCP_CONGESTION, определенное как 0xd, преобразуется в десятичное 13). +Название опции, которую нужно установить. Используется десятичное представление (в примере, значение TCP_CONGESTION, определенное как 0xd, преобразуется в десятичное 13). > `value`: "" diff --git a/docs/ru/config/transports/grpc.md b/docs/ru/config/transports/grpc.md index 88648ac..7c45898 100644 --- a/docs/ru/config/transports/grpc.md +++ b/docs/ru/config/transports/grpc.md @@ -127,5 +127,3 @@ gRPC (HTTP/2) имеет встроенное мультиплексирован ::: tip При использовании CDN Cloudflare можно установить значение `65536` или выше, чтобы отключить механизм динамического окна, что предотвратит отправку непредвиденных кадров h2 GOAWAY CDN Cloudflare для закрытия существующего соединения. ::: - - diff --git a/docs/ru/config/transports/httpupgrade.md b/docs/ru/config/transports/httpupgrade.md index e2f230f..5b1ddca 100644 --- a/docs/ru/config/transports/httpupgrade.md +++ b/docs/ru/config/transports/httpupgrade.md @@ -37,7 +37,7 @@ HTTP-путь, используемый HTTPUpgrade, по умолчанию `"/"`. -Если в пути клиента содержится параметр `ed` (например, ```/mypath?ed=2560```), будет активирована функция `Early Data` для уменьшения задержки, ее значение - порог длины первого пакета. Если длина первого пакета превышает это значение, `Early Data` не будет активирована. Рекомендуемое значение - 2560. +Если в пути клиента содержится параметр `ed` (например, `/mypath?ed=2560`), будет активирована функция `Early Data` для уменьшения задержки, ее значение - порог длины первого пакета. Если длина первого пакета превышает это значение, `Early Data` не будет активирована. Рекомендуемое значение - 2560. > `host`: string @@ -52,6 +52,3 @@ HTTP-путь, используемый HTTPUpgrade, по умолчанию `"/ Пользовательские HTTP-заголовки, пара ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение - строка. По умолчанию пустое. - - - diff --git a/docs/ru/config/transports/mkcp.md b/docs/ru/config/transports/mkcp.md index 4f55e57..38496f7 100644 --- a/docs/ru/config/transports/mkcp.md +++ b/docs/ru/config/transports/mkcp.md @@ -146,7 +146,7 @@ mKCP жертвует пропускной способностью ради у Протокол KCP использует заголовок размером 24 байта, а mKCP уменьшил его до 18 байт для пакета данных и 16 байт для пакета подтверждения. Более компактный заголовок помогает избежать обнаружения по признакам и ускоряет передачу данных. -Кроме того, в оригинальном KCP каждый пакет подтверждения может подтвердить только один пакет данных, то есть, если KCP нужно подтвердить получение 100 пакетов данных, он отправит 24 * 100 = 2400 байт данных. В этом случае многократно повторяются заголовки, что приводит к ненужному расходу полосы пропускания. mKCP сжимает несколько пакетов подтверждения, 100 пакетов подтверждения занимают всего 16 + 2 + 100 * 4 = 418 байт, что в шесть раз меньше, чем в оригинальном KCP. +Кроме того, в оригинальном KCP каждый пакет подтверждения может подтвердить только один пакет данных, то есть, если KCP нужно подтвердить получение 100 пакетов данных, он отправит 24 _ 100 = 2400 байт данных. В этом случае многократно повторяются заголовки, что приводит к ненужному расходу полосы пропускания. mKCP сжимает несколько пакетов подтверждения, 100 пакетов подтверждения занимают всего 16 + 2 + 100 _ 4 = 418 байт, что в шесть раз меньше, чем в оригинальном KCP. ### Передача пакетов подтверждения @@ -157,6 +157,3 @@ mKCP жертвует пропускной способностью ради у mKCP может эффективно управлять состоянием соединения. Когда удаленный хост инициализирует закрытие соединения, соединение будет закрыто в течение двух секунд; когда удаленный хост теряет соединение, соединение будет закрыто в течение максимум 30 секунд. Оригинальный KCP не поддерживает этот сценарий. - - - diff --git a/docs/ru/config/transports/websocket.md b/docs/ru/config/transports/websocket.md index 372fb58..80e1bc3 100644 --- a/docs/ru/config/transports/websocket.md +++ b/docs/ru/config/transports/websocket.md @@ -42,7 +42,7 @@ WebSocket распознает заголовок X-Forwarded-For в HTTP-зап Путь, используемый WebSocket в HTTP-протоколе, значение по умолчанию — `"/"`. -Если в пути клиента есть параметр `ed` (например, ```/mypath?ed=2560```), будет активирован `Early Data` для уменьшения задержки. +Если в пути клиента есть параметр `ed` (например, `/mypath?ed=2560`), будет активирован `Early Data` для уменьшения задержки. > `host`: string @@ -57,6 +57,7 @@ WebSocket распознает заголовок X-Forwarded-For в HTTP-зап Пользовательские HTTP-заголовки, пары ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение является строкой. Значение по умолчанию: пустое. + > `heartbeatPeriod`: int Задает интервал времени для отправки Ping-сообщений с целью поддержания соединения. Если не указано или указано значение 0, Ping-сообщения не отправляются (по умолчанию используется текущее поведение). diff --git a/docs/ru/development/README.md b/docs/ru/development/README.md index b8691f6..319c7b7 100644 --- a/docs/ru/development/README.md +++ b/docs/ru/development/README.md @@ -39,5 +39,3 @@ VMess - это зашифрованный транспортный проток ### [Протокол mKCP](./protocols/mkcp.md) mKCP - это потоковый транспортный протокол, основанный на [протоколе KCP](https://github.com/skywind3000/kcp), который может передавать любые потоки данных по порядку. - - diff --git a/docs/ru/development/intro/compile.md b/docs/ru/development/intro/compile.md index 48b3a66..fdcc84f 100644 --- a/docs/ru/development/intro/compile.md +++ b/docs/ru/development/intro/compile.md @@ -79,5 +79,3 @@ go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main ::: warning Убедитесь, что вы используете ту же версию Golang, что и для сборки релиза. ::: - - diff --git a/docs/ru/development/intro/design.md b/docs/ru/development/intro/design.md index 34a85d3..6a76c5b 100644 --- a/docs/ru/development/intro/design.md +++ b/docs/ru/development/intro/design.md @@ -41,7 +41,3 @@ ### Транспортный уровень Транспортный уровень предоставляет модули инструментов, связанных с передачей сетевых данных. - - - - diff --git a/docs/ru/development/intro/guide.md b/docs/ru/development/intro/guide.md index 0738260..1388150 100644 --- a/docs/ru/development/intro/guide.md +++ b/docs/ru/development/intro/guide.md @@ -117,7 +117,7 @@ Xray-core - Для имен файлов и каталогов по возможности используйте одно английское слово, например, hello.go. - Если это невозможно, используйте дефисы для разделения слов в имени каталога и подчеркивания для разделения слов в имени файла, например, hello-world/hello_again.go. - - Тестовый код должен иметь суффикс _test.go. + - Тестовый код должен иметь суффикс \_test.go. - Для типов используйте нотацию PascalCase, например, ConnectionHandler. - Сокращения не обязательно писать в нижнем регистре, то есть HTML не нужно писать как Html. - Для публичных переменных-членов также используйте нотацию PascalCase. @@ -148,6 +148,3 @@ Xray-core Если вам нужно использовать диапазон в файле конфигурации, используйте тип `Int32Range`. Для получения значений используйте `.From` и `.To` вместо использования строкового типа (`string`) и последующего ручного разбора. Метод `.EnsureOrder()` можно использовать для обмена значений From и To, если From больше, чем To (при необходимости). - - - diff --git a/docs/ru/development/protocols/mkcp.md b/docs/ru/development/protocols/mkcp.md index d093866..fda8870 100644 --- a/docs/ru/development/protocols/mkcp.md +++ b/docs/ru/development/protocols/mkcp.md @@ -29,7 +29,7 @@ mKCP - это протокол, основанный на UDP, все комму ### Пакет данных | 4 байта | 2 байта | L байт | -|---------------------------------|----------------|------------------| +| ------------------------------- | -------------- | ---------------- | | Информация для аутентификации A | Длина данных L | Сегментная часть | Где: @@ -40,7 +40,7 @@ mKCP - это протокол, основанный на UDP, все комму ### Сегмент данных | 2 байта | 1 байт | 1 байт | 4 байта | 4 байта | 4 байта | 2 байта | Len байт | -|--------------------|-------------|-----------|--------------------|---------------------|---------------------------------------|-----------|----------| +| ------------------ | ----------- | --------- | ------------------ | ------------------- | ------------------------------------- | --------- | -------- | | Идентификатор Conv | Команда Cmd | Опция Opt | Временная метка Ts | Порядковый номер Sn | Неподтвержденный порядковый номер Una | Длина Len | Данные | Где: @@ -56,8 +56,8 @@ mKCP - это протокол, основанный на UDP, все комму ### Сегмент подтверждения -| 2 байта | 1 байт | 1 байт | 4 байта | 4 байта | 4 байта | 2 байта | Len * 4 байта | -|--------------------|-------------|-----------|----------|------------------------------------------|--------------------|-----------|----------------------------------| +| 2 байта | 1 байт | 1 байт | 4 байта | 4 байта | 4 байта | 2 байта | Len \* 4 байта | +| ------------------ | ----------- | --------- | -------- | ---------------------------------------- | ------------------ | --------- | -------------------------------- | | Идентификатор Conv | Команда Cmd | Опция Opt | Окно Wnd | Следующий порядковый номер для приема Sn | Временная метка Ts | Длина Len | Подтвержденные порядковые номера | Где: @@ -77,7 +77,7 @@ mKCP - это протокол, основанный на UDP, все комму ### Сегмент пульса | 2 байта | 1 байт | 1 байт | 4 байта | 4 байта | 4 байта | -|--------------------|-------------|-----------|---------------------------------------|------------------------------------------|--------------| +| ------------------ | ----------- | --------- | ------------------------------------- | ---------------------------------------- | ------------ | | Идентификатор Conv | Команда Cmd | Опция Opt | Неподтвержденный порядковый номер Una | Следующий порядковый номер для приема Sn | Задержка Rto | Где: @@ -90,7 +90,3 @@ mKCP - это протокол, основанный на UDP, все комму - Неподтвержденный порядковый номер Una: тот же, что и Una в сегменте данных - Следующий порядковый номер для приема Sn: тот же, что и Sn в сегменте подтверждения - Задержка Rto: задержка, рассчитанная самим удаленным хостом - - - - diff --git a/docs/ru/development/protocols/muxcool.md b/docs/ru/development/protocols/muxcool.md index 314cd30..a838718 100644 --- a/docs/ru/development/protocols/muxcool.md +++ b/docs/ru/development/protocols/muxcool.md @@ -42,7 +42,7 @@ Mux.Cool использует симметричный формат переда ### Формат кадра | 2 байта | L байт | X байт | -|--------------------|------------|-----------------------| +| ------------------ | ---------- | --------------------- | | Длина метаданных L | Метаданные | Дополнительные данные | ### Метаданные @@ -58,13 +58,13 @@ Mux.Cool использует симметричный формат переда Если опция Opt(D) включена, формат дополнительных данных следующий: | 2 байта | X-2 байта | -|-----------|-----------| +| --------- | --------- | | Длина X-2 | Данные | ### Создание нового подсоединения (New) | 2 байта | 1 байт | 1 байт | 1 байт | 2 байта | 1 байт | A байт | 8 байт | -|---------|--------|-----------|------------|---------|--------------|---------|------------------| +| ------- | ------ | --------- | ---------- | ------- | ------------ | ------- | ---------------- | | ID | 0x01 | Опция Opt | Тип сети N | Порт | Тип адреса T | Адрес A | Global ID (XUDP) | Где: @@ -90,13 +90,13 @@ Mux.Cool использует симметричный формат переда TCP | 2 байта | 1 байт | 1 байт | -|---------|--------|-----------| +| ------- | ------ | --------- | | ID | 0x02 | Опция Opt | UDP | 2 байта | 1 байт | 1 байт | 1 байт | 2 байта | 1 байт | A байт | -|---------|--------|-----------|------------|---------|--------------|---------| +| ------- | ------ | --------- | ---------- | ------- | ------------ | ------- | | ID | 0x02 | Опция Opt | Тип сети N | Порт | Тип адреса T | Адрес A | При поддержании подсоединения, если Opt(D) включена, данные, переносимые этим кадром, должны быть отправлены на целевой хост. @@ -105,7 +105,7 @@ XUDP добавляет адрес UDP после Opt(D) в том же форм ### Закрытие подсоединения (End) | 2 байта | 1 байт | 1 байт | -|---------|--------|-----------| +| ------- | ------ | --------- | | ID | 0x03 | Опция Opt | При поддержании подсоединения, если Opt(D) включена, данные, переносимые этим кадром, должны быть отправлены на целевой хост. @@ -113,7 +113,7 @@ XUDP добавляет адрес UDP после Opt(D) в том же форм ### Поддержание соединения (KeepAlive) | 2 байта | 1 байт | 1 байт | -|---------|--------|-----------| +| ------- | ------ | --------- | | ID | 0x04 | Опция Opt | При поддержании соединения: @@ -127,7 +127,3 @@ XUDP добавляет адрес UDP после Opt(D) в том же форм В протоколах, ориентированных на целевой адрес, таких как Shadowsocks и VMess, при установлении соединения должен быть указан целевой адрес. Для обеспечения совместимости протокол Mux.Cool определяет адрес "v1.mux.cool". То есть, если целевой адрес главного соединения совпадает с этим адресом, пересылка осуществляется в режиме Mux.Cool, в противном случае пересылка осуществляется традиционным способом. (Примечание: это внутренняя метка программы, VMess и VLESS не отправляют адрес "v1.mux.cool" в пакетах данных). - - - - diff --git a/docs/ru/development/protocols/vless.md b/docs/ru/development/protocols/vless.md index 1400cbc..0836490 100644 --- a/docs/ru/development/protocols/vless.md +++ b/docs/ru/development/protocols/vless.md @@ -5,11 +5,11 @@ VLESS - это легковесный, не сохраняющий состоя ## Запрос и ответ | 1 байт | 16 байт | 1 байт | M байт | 1 байт | 2 байта | 1 байт | S байт | X байт | -|------------------|--------------------|-----------------------------------|------------------------------------|---------|---------|------------|--------|----------------| +| ---------------- | ------------------ | --------------------------------- | ---------------------------------- | ------- | ------- | ---------- | ------ | -------------- | | Версия протокола | Эквивалентный UUID | Длина дополнительной информации M | Дополнительная информация ProtoBuf | Команда | Порт | Тип адреса | Адрес | Данные запроса | | 1 байт | 1 байт | N байт | Y байт | -|-----------------------------------------------|-----------------------------------|------------------------------------|---------------| +| --------------------------------------------- | --------------------------------- | ---------------------------------- | ------------- | | Версия протокола, совпадает с версией запроса | Длина дополнительной информации N | Дополнительная информация ProtoBuf | Данные ответа | Структура VLESS была такой же, как указано выше, еще во второй альфа-версии (ALPHA 2) (BETA - это пятая бета-версия): @@ -89,5 +89,3 @@ Schedulers не нужно располагать снаружи, как Encrypt Спасибо a [@DuckSoft](https://github.com/DuckSoft) за предложение! Подробнее см. [Предложение по стандарту общих ссылок VMessAEAD / VLESS](https://github.com/XTLS/Xray-core/issues/91) - - diff --git a/docs/ru/development/protocols/vmess.md b/docs/ru/development/protocols/vmess.md index 2e3a553..701fd90 100644 --- a/docs/ru/development/protocols/vmess.md +++ b/docs/ru/development/protocols/vmess.md @@ -44,7 +44,7 @@ VMess использует асимметричный формат, то ест ## Запрос клиента | 16 байт | X байт | Оставшаяся часть | -|-------------------------------|------------------|------------------| +| ----------------------------- | ---------------- | ---------------- | | Информация для аутентификации | Часть с командой | Часть с данными | ### Информация для аутентификации @@ -64,14 +64,14 @@ VMess использует асимметричный формат, то ест - Вектор инициализации: MD5(X + X + X + X), X = []byte(время генерации информации для аутентификации) (8 байт, Big Endian) | 1 байт | 16 байт | 16 байт | 1 байт | 1 байт | 4 бита | 4 бита | 1 байт | 1 байт | 2 байта | 1 байт | N байт | P байт | 4 байта | -|------------------|--------------------------------------------|----------------------------|-------------------------|-----------|-----------|----------------------|-----------------|-------------|-----------|--------------|---------|------------------|---------------------| +| ---------------- | ------------------------------------------ | -------------------------- | ----------------------- | --------- | --------- | -------------------- | --------------- | ----------- | --------- | ------------ | ------- | ---------------- | ------------------- | | Номер версии Ver | Вектор инициализации для шифрования данных | Ключ для шифрования данных | Аутентификация ответа V | Опция Opt | Остаток P | Метод шифрования Sec | Зарезервировано | Команда Cmd | Порт Port | Тип адреса T | Адрес A | Случайные данные | Контрольная сумма F | Подробности опции Opt: (если бит равен 1, опция включена) -| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -|---|---|---|---|---|---|---|---| -| X | X | X | X | X | M | R | S | +| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | +| --- | --- | --- | --- | --- | --- | --- | --- | +| X | X | X | X | X | M | R | S | Где: @@ -112,7 +112,7 @@ VMess использует асимметричный формат, то ест Если Opt(S) включена, для части с данными используется следующий формат. Фактические данные запроса разбиваются на несколько блоков, каждый из которых имеет следующий формат. После проверки всех блоков сервер пересылает их в соответствии с базовым форматом. | 2 байта | L байт | -|---------|--------------| +| ------- | ------------ | | Длина L | Пакет данных | Где: @@ -142,7 +142,7 @@ VMess использует асимметричный формат, то ест Данные заголовка ответа шифруются с помощью AES-128-CFB, вектор инициализации - MD5(вектор инициализации для шифрования данных), ключ - MD5(ключ для шифрования данных). Фактические данные ответа зависят от настроек шифрования. | 1 байт | 1 байт | 1 байт | 1 байт | M байт | Оставшаяся часть | -|-------------------------|-----------|-------------|-----------------|--------------------|---------------------------| +| ----------------------- | --------- | ----------- | --------------- | ------------------ | ------------------------- | | Аутентификация ответа V | Опция Opt | Команда Cmd | Длина команды M | Содержимое команды | Фактические данные ответа | Где: @@ -160,7 +160,7 @@ VMess использует асимметричный формат, то ест ### Команда динамического порта | 1 байт | 2 байта | 16 байт | 2 байта | 1 байт | 1 байт | -|-----------------|-----------|----------------------------|---------|----------------------|------------------| +| --------------- | --------- | -------------------------- | ------- | -------------------- | ---------------- | | Зарезервировано | Порт Port | Идентификатор пользователя | AlterID | Уровень пользователя | Время действия T | Где: @@ -173,6 +173,3 @@ VMess использует асимметричный формат, то ест ## Примечания - Для обеспечения обратной совместимости все зарезервированные поля должны иметь значение 0. - - - diff --git a/docs/ru/document/README.md b/docs/ru/document/README.md index a12b6b8..b56b58a 100644 --- a/docs/ru/document/README.md +++ b/docs/ru/document/README.md @@ -1,6 +1,7 @@ --- sidebar: auto --- + # Быстрый старт > **В этой главе вы узнаете, как максимально просто получить Xray и начать его использовать.** @@ -48,5 +49,3 @@ Xray обладает множеством команд и аргументов, ::: tip Благодарность Огромное спасибо всем за то, что делитесь своими навыками и опытом, которые делают Xray с каждым днем ​​лучше. ::: - - diff --git a/docs/ru/document/command.md b/docs/ru/document/command.md index e09f74d..b0cea55 100644 --- a/docs/ru/document/command.md +++ b/docs/ru/document/command.md @@ -42,15 +42,15 @@ Use "xray help " for more information about a command. ``` Run Xray with config, the default command. -The -config=file, -c=file flags set the config files for +The -config=file, -c=file flags set the config files for Xray. Multiple assign is accepted. The -confdir=dir flag sets a dir with multiple json config -The -format=json flag sets the format of config files. +The -format=json flag sets the format of config files. Default "auto". -The -test flag tells Xray to test config files only, +The -test flag tells Xray to test config files only, without launching the server. The -dump flag tells Xray to print the merged config. @@ -119,6 +119,7 @@ The commands are: ``` Sub-command `pb` + ```bash # Usage: xray convert pb [-debug] [-type] [json file] [json file] ... @@ -136,6 +137,7 @@ xray help convert pb ``` Sub-command JSON + ```bash # Usage: xray convert json [-type] [stdin:] [typedMessage file] @@ -208,5 +210,3 @@ xray wg [-i "(base64.StdEncoding)"] - Рабочий каталог (Working Directory); - Путь, указанный в переменной окружения `Xray.location.asset` (см. [Переменные окружения](../config/features/env.md#ресурсные-файлы)). ::: - - diff --git a/docs/ru/document/config.md b/docs/ru/document/config.md index f0c86f1..951caaa 100644 --- a/docs/ru/document/config.md +++ b/docs/ru/document/config.md @@ -26,7 +26,7 @@ "settings": { "clients": [ { - "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // Не забудьте заменить это поле, сгенерировав UUID с помощью `xray uuid` или `uuidgen` + "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // Не забудьте заменить это поле, сгенерировав UUID с помощью `xray uuid` или `uuidgen` } ] } @@ -68,7 +68,7 @@ "port": 10086, // Порт сервера "users": [ { - "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // Не забудьте заменить это поле, сгенерировав UUID с помощью `xray uuid` или `uuidgen` + "id": "b831381d-6324-4d53-ad4f-8cda48b30811" // Не забудьте заменить это поле, сгенерировав UUID с помощью `xray uuid` или `uuidgen` } ] } @@ -85,13 +85,14 @@ "rules": [ { "type": "field", - "ip": ["geoip:private","geoip:cn"], // Исключить локальную сеть и диапазоны IP-адресов Китая + "ip": ["geoip:private", "geoip:cn"], // Исключить локальную сеть и диапазоны IP-адресов Китая "outboundTag": "direct" } ] } } ``` + Единственное, что вам нужно изменить в приведенной выше конфигурации, - это IP-адрес вашего сервера и UUID пользователя, как указано в комментариях. Эта конфигурация будет перенаправлять весь трафик на ваш сервер, за исключением локальной сети (например, доступ к маршрутизатору) и диапазонов IP-адресов Китая (например, доступ к bilibili, acfun). ## Запуск @@ -103,6 +104,3 @@ - Или используйте systemd или другой инструмент для запуска Xray как службы в фоновом режиме. Более подробную информацию можно найти в [документации по конфигурации](../config/) и в разделе [Простыми словами](./level-0/). - - - diff --git a/docs/ru/document/document.md b/docs/ru/document/document.md index 4d9ef59..cecee58 100644 --- a/docs/ru/document/document.md +++ b/docs/ru/document/document.md @@ -45,5 +45,3 @@ git push -u origin your-branch ## Нашли ошибку? Если вы обнаружили ошибку в документации, вы можете внести исправления или создать задачу (Issue). - - diff --git a/docs/ru/document/install.md b/docs/ru/document/install.md index bd212c3..6a039b7 100644 --- a/docs/ru/document/install.md +++ b/docs/ru/document/install.md @@ -5,7 +5,7 @@ Xray доступен на следующих платформах: - Windows 7 и выше (x86 / amd64 / arm32 / arm64); - - Если вам требуется использовать эти версии (1.8.18 и более новые, отмеченные как ```win7```, 1.8.6, 1.8.4) в Windows 7, необходимо убедиться, что в вашей ОС установлено обновление **KB4474419**. Для повышения уровня безопасности также рекомендуем убедиться, что у вас установлено обновление KB4490628. + - Если вам требуется использовать эти версии (1.8.18 и более новые, отмеченные как `win7`, 1.8.6, 1.8.4) в Windows 7, необходимо убедиться, что в вашей ОС установлено обновление **KB4474419**. Для повышения уровня безопасности также рекомендуем убедиться, что у вас установлено обновление KB4490628. - macOS 10.10 Yosemite и выше (amd64 / arm64); - Linux 2.6.23 и выше (x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64); - Включая, но не ограничиваясь: Debian 7 / 8, Ubuntu 12.04 / 14.04 и выше, CentOS 7 / 8, Arch Linux и др.; diff --git a/docs/ru/document/level-0/ch01-preface.md b/docs/ru/document/level-0/ch01-preface.md index 435429f..22ec00f 100644 --- a/docs/ru/document/level-0/ch01-preface.md +++ b/docs/ru/document/level-0/ch01-preface.md @@ -22,7 +22,7 @@ Поскольку эта статья предназначена для **новичков без опыта**, многие вещи будут объяснены максимально подробно. Поэтому будьте готовы к тому, что текст будет довольно многословным. -## 1.4 Почему самостоятельная настройка — это сложно? +## 1.4 Почему самостоятельная настройка — это сложно? Чтобы ответить на этот вопрос, нужно немного углубиться в историю вопроса. @@ -41,7 +41,7 @@ Во-вторых, о проблемах новичков. -Начинающим пользователям без технического бэкграунда, чтобы разобраться во всех этих премудростях, приходится изучать огромные массивы информации, разбросанной по всему интернету: блогам, форумам, группам в мессенджерах, репозиториям на GitHub, видео на YouTube и так далее. +Начинающим пользователям без технического бэкграунда, чтобы разобраться во всех этих премудростях, приходится изучать огромные массивы информации, разбросанной по всему интернету: блогам, форумам, группам в мессенджерах, репозиториям на GitHub, видео на YouTube и так далее. Вся эта информация часто оказывается противоречивой, неполной или попросту неверной. Новичкам остаётся только гадать, кому верить и как всё это работает на самом деле. @@ -53,7 +53,7 @@ Во-первых, я хотел бы спросить у любителей подобных советов: разве платные VPN — это панацея? -Во-вторых, я считаю, что «не знать» и «не хотеть знать» — это две большие разницы. Конечно, инфантилы, которые хотят всё и сразу, не прилагая никаких усилий, вызывают только раздражение. Но люди, которые искренне хотят разобраться во всём сами, не заслуживают презрения и издёвок. Именно эта нетерпимость к новичкам и побудила меня написать эту статью. +Во-вторых, я считаю, что «не знать» и «не хотеть знать» — это две большие разницы. Конечно, инфантилы, которые хотят всё и сразу, не прилагая никаких усилий, вызывают только раздражение. Но люди, которые искренне хотят разобраться во всём сами, не заслуживают презрения и издёвок. Именно эта нетерпимость к новичкам и побудила меня написать эту статью. Давайте разберёмся, в чём плюсы и минусы платных VPN-сервисов. @@ -82,18 +82,16 @@ 2. Если же вы решили настроить всё самостоятельно, продолжайте чтение! -Цель этой статьи — стать отправной точкой для новичков, предоставить подробное пошаговое руководство по настройке VPN-сервера на VPS, начиная **с ввода первой команды** и заканчивая **успешным подключением к заблокированным ресурсам**. +Цель этой статьи — стать отправной точкой для новичков, предоставить подробное пошаговое руководство по настройке VPN-сервера на VPS, начиная **с ввода первой команды** и заканчивая **успешным подключением к заблокированным ресурсам**. В процессе настройки вы познакомитесь с основными командами Linux, что станет хорошей базой для дальнейшего изучения этой операционной системы. ## 1.7 Немного лирики 1. В интернете много дезинформации, поэтому важно научиться критически мыслить, не поддаваться на провокации и не верить всему, что пишут. -2. Искренне надеюсь, что, получив доступ к свободному интернету, вы сможете узнавать больше нового, наслаждаться разнообразным контентом, знакомиться с интересными людьми и находить единомышленников. +2. Искренне надеюсь, что, получив доступ к свободному интернету, вы сможете узнавать больше нового, наслаждаться разнообразным контентом, знакомиться с интересными людьми и находить единомышленников. 3. Ваша личность в интернете — это всё ещё вы. Добиться полной анонимности крайне сложно, поэтому не забывайте о законах вашей страны и стран, IP-адреса которых вы используете. Всегда помните о собственной безопасности. ## 1.8 Ваш прогресс > ⬛⬜⬜⬜⬜⬜⬜⬜ 12.5% - - diff --git a/docs/ru/document/level-0/ch02-preparation.md b/docs/ru/document/level-0/ch02-preparation.md index 26b1041..595c2df 100644 --- a/docs/ru/document/level-0/ch02-preparation.md +++ b/docs/ru/document/level-0/ch02-preparation.md @@ -14,7 +14,7 @@ 3. Записать порт (Port) SSH для удалённого подключения к VPS. 4. Записать имя пользователя и пароль для удалённого подключения по SSH. -Выбор и покупка VPS — дело непростое. Рекомендуем сначала изучить этот вопрос и выбрать тариф, который соответствует вашим финансовым возможностям и требованиям к скорости и качеству связи. Также можно воспользоваться бесплатными (постоянными или временными) предложениями от крупных облачных провайдеров, таких как Oracle Cloud и Google Cloud. Главное — не влезайте в долги. +Выбор и покупка VPS — дело непростое. Рекомендуем сначала изучить этот вопрос и выбрать тариф, который соответствует вашим финансовым возможностям и требованиям к скорости и качеству связи. Также можно воспользоваться бесплатными (постоянными или временными) предложениями от крупных облачных провайдеров, таких как Oracle Cloud и Google Cloud. Главное — не влезайте в долги. ::: tip Пояснение Несколько слов о выборе Debian 10 в качестве операционной системы. Что бы вы ни слышали в интернете, какой бы дистрибутив Linux ни советовали вам гуру, все эти споры о том, какой Linux лучше, **не имеют к вам никакого отношения**! Debian 10 — это надёжная и стабильная операционная система, которая отлично подходит для работы VPN-сервера и достаточно оптимизирована (например, имеет специальное ядро для облачных сред и своевременную поддержку BBR). Когда вы освоитесь с Linux, можете попробовать и другие дистрибутивы. @@ -53,5 +53,3 @@ Если вы выполнили все пункты из этого раздела, у вас уже есть всё необходимое, чтобы открыть для себя новый мир. Так чего же мы ждём? Давайте перейдём к следующей главе и сделаем это! > ⬛⬛⬜⬜⬜⬜⬜⬜ 25% - - diff --git a/docs/ru/document/level-0/ch03-ssh.md b/docs/ru/document/level-0/ch03-ssh.md index 4d654d6..c431b45 100644 --- a/docs/ru/document/level-0/ch03-ssh.md +++ b/docs/ru/document/level-0/ch03-ssh.md @@ -34,7 +34,7 @@ ![Первое подключение к VPS](./ch03-img05-ssh-login-success.png) - Этот экран — аналог «рабочего стола» на удалённом сервере, но здесь нет привычных значков, курсора мыши и ярких цветов. Только текст. Это и есть **командная строка** — *Command Line Interface* или сокращённо *CLI*. + Этот экран — аналог «рабочего стола» на удалённом сервере, но здесь нет привычных значков, курсора мыши и ярких цветов. Только текст. Это и есть **командная строка** — _Command Line Interface_ или сокращённо _CLI_. Все дальнейшие действия вам придётся выполнять в командной строке, как хакер в кино. Возможно, поначалу это покажется вам непривычным, но поверьте, в использовании командной строки нет ничего страшного или сложного. По сути, это всего лишь способ взаимодействия с компьютером с помощью текстовых команд вместо графического интерфейса. **Вы пишете команду, а компьютер её выполняет.** @@ -55,10 +55,10 @@ 2. Базовые команды Linux: - | Номер | Команда | Описание | - | :----: | :----------: | :----------------- | - | `cmd-01` | `apt update` | Проверить обновления | - | `cmd-02` | `apt upgrade` | Установить обновления| + | Номер | Команда | Описание | + | :------: | :-----------: | :-------------------- | + | `cmd-01` | `apt update` | Проверить обновления | + | `cmd-02` | `apt upgrade` | Установить обновления | 3. Введите первую команду, чтобы получить информацию об обновлениях: @@ -81,7 +81,3 @@ **Поздравляем, вы сделали ещё один важный шаг!** Теперь вы умеете подключаться к своему серверу по SSH! Но что делать после подключения, кроме обновления системы? Узнаем в следующей главе! > ⬛⬛⬛⬜⬜⬜⬜⬜ 37.5% - - - - diff --git a/docs/ru/document/level-0/ch04-security.md b/docs/ru/document/level-0/ch04-security.md index 1969771..d9c1127 100644 --- a/docs/ru/document/level-0/ch04-security.md +++ b/docs/ru/document/level-0/ch04-security.md @@ -2,9 +2,9 @@ ## 4.1 Зачем нужна безопасность? -Безопасность Linux-серверов — это обширная и сложная тема. Бесчисленные веб-сайты, приложения, сервисы и даже критически важная инфраструктура построены на базе Linux. За всем этим стоят огромные деньги и коммерческие интересы, что, естественно, привлекает злоумышленников. В то же время надёжная работа этих сервисов крайне важна, поэтому любые серьёзные уязвимости недопустимы. Именно поэтому множество специалистов по безопасности изо дня в день ведут борьбу на передовой, обеспечивая стабильную работу цифрового мира, к которому мы все привыкли. +Безопасность Linux-серверов — это обширная и сложная тема. Бесчисленные веб-сайты, приложения, сервисы и даже критически важная инфраструктура построены на базе Linux. За всем этим стоят огромные деньги и коммерческие интересы, что, естественно, привлекает злоумышленников. В то же время надёжная работа этих сервисов крайне важна, поэтому любые серьёзные уязвимости недопустимы. Именно поэтому множество специалистов по безопасности изо дня в день ведут борьбу на передовой, обеспечивая стабильную работу цифрового мира, к которому мы все привыкли. -Теперь, когда у вас есть собственный VPS-сервер, и вы собираетесь открыть на нём порты для перенаправления трафика, вы фактически оказываетесь на передовой этой борьбы и подвергаетесь тем же рискам. В то же время, новички, не обладающие достаточными знаниями и информацией, склонны впадать в крайности: либо они считают, что им ничего не угрожает, либо же, наоборот, впадают в паранойю. +Теперь, когда у вас есть собственный VPS-сервер, и вы собираетесь открыть на нём порты для перенаправления трафика, вы фактически оказываетесь на передовой этой борьбы и подвергаетесь тем же рискам. В то же время, новички, не обладающие достаточными знаниями и информацией, склонны впадать в крайности: либо они считают, что им ничего не угрожает, либо же, наоборот, впадают в паранойю. - Первым я бы посоветовал не относиться к безопасности легкомысленно и изучить этот вопрос более подробно, чтобы потом не пришлось кусать локти. @@ -12,31 +12,31 @@ ## 4.2 Какие именно риски существуют? -Как мы уже говорили в главе про удалённое подключение, для доступа к вашему VPS достаточно знать четыре вещи: **IP-адрес**, **порт**, **имя пользователя** и **пароль**. Очевидно, что эти четыре элемента нужно защищать в первую очередь. Давайте разберём каждый из них: +Как мы уже говорили в главе про удалённое подключение, для доступа к вашему VPS достаточно знать четыре вещи: **IP-адрес**, **порт**, **имя пользователя** и **пароль**. Очевидно, что эти четыре элемента нужно защищать в первую очередь. Давайте разберём каждый из них: -1. **IP-адрес**: злоумышленники могут сканировать целые диапазоны IP-адресов в поисках уязвимых серверов. Ваш IP-адрес — это публичная информация, которую невозможно скрыть. +1. **IP-адрес**: злоумышленники могут сканировать целые диапазоны IP-адресов в поисках уязвимых серверов. Ваш IP-адрес — это публичная информация, которую невозможно скрыть. 2. **Порт**: если вы используете настройки по умолчанию, то порт SSH равен `22`. 3. **Имя пользователя**: если вы используете настройки по умолчанию, то имя пользователя — `root`. -4. **Пароль**: пароль не имеет значения по умолчанию. Он либо генерируется автоматически при создании VPS, либо задаётся вами. Таким образом, если вы не меняли настройки сервера, то три из четырёх элементов уже известны злоумышленникам, и вся безопасность вашего сервера держится на одном только пароле. Возможны следующие варианты: +4. **Пароль**: пароль не имеет значения по умолчанию. Он либо генерируется автоматически при создании VPS, либо задаётся вами. Таким образом, если вы не меняли настройки сервера, то три из четырёх элементов уже известны злоумышленникам, и вся безопасность вашего сервера держится на одном только пароле. Возможны следующие варианты: - - Вы используете автоматически сгенерированный пароль из панели управления VPS. Такие пароли обычно состоят из случайного набора символов (букв в разных регистрах, цифр и спецсимволов) и достаточно надёжны. + - Вы используете автоматически сгенерированный пароль из панели управления VPS. Такие пароли обычно состоят из случайного набора символов (букв в разных регистрах, цифр и спецсимволов) и достаточно надёжны. - - Вы установили простой пароль, например, `123456`. Взломать такой сервер не составит труда. + - Вы установили простой пароль, например, `123456`. Взломать такой сервер не составит труда. - - Вы установили сложный пароль, который используете где-то ещё. Это тоже небезопасно. Злоумышленники используют специальные программы, которые перебирают миллионы ранее скомпрометированных паролей из утечек данных. + - Вы установили сложный пароль, который используете где-то ещё. Это тоже небезопасно. Злоумышленники используют специальные программы, которые перебирают миллионы ранее скомпрометированных паролей из утечек данных. -5. Важно понимать, что никакой хакер не будет лично подбирать ваш пароль. Все атаки выполняются автоматически с помощью специальных скриптов, которые работают круглосуточно. Пока вы спите, ваш сервер может подвергаться атакам. +5. Важно понимать, что никакой хакер не будет лично подбирать ваш пароль. Все атаки выполняются автоматически с помощью специальных скриптов, которые работают круглосуточно. Пока вы спите, ваш сервер может подвергаться атакам. - Если пароль будет подобран, злоумышленники получат полный доступ к вашему серверу (права пользователя `root`), смогут установить на него вредоносное ПО и использовать его в своих целях (например, для майнинга криптовалюты, рассылки спама, фишинговых атак, организации торрент-трекера, размещения публичных узлов для доступа к даркнету и т.д.). При этом злоумышленники могут действовать очень скрытно, и вы даже не заметите, что ваш сервер взломан, пока не получите уведомление от хостинг-провайдера о блокировке вашего аккаунта или, что ещё хуже, повестку в суд. + Если пароль будет подобран, злоумышленники получат полный доступ к вашему серверу (права пользователя `root`), смогут установить на него вредоносное ПО и использовать его в своих целях (например, для майнинга криптовалюты, рассылки спама, фишинговых атак, организации торрент-трекера, размещения публичных узлов для доступа к даркнету и т.д.). При этом злоумышленники могут действовать очень скрытно, и вы даже не заметите, что ваш сервер взломан, пока не получите уведомление от хостинг-провайдера о блокировке вашего аккаунта или, что ещё хуже, повестку в суд. -6. Не забывайте, что при покупке VPS вы, скорее всего, указывали свои реальные платёжные данные. А при посещении сайтов и использовании социальных сетей ваш IP-адрес также сохраняется. Всё это может быть использовано против вас. **Поэтому, если на вашем сервере произойдёт что-то противозаконное, отвечать за это придётся вам.** +6. Не забывайте, что при покупке VPS вы, скорее всего, указывали свои реальные платёжные данные. А при посещении сайтов и использовании социальных сетей ваш IP-адрес также сохраняется. Всё это может быть использовано против вас. **Поэтому, если на вашем сервере произойдёт что-то противозаконное, отвечать за это придётся вам.** ## 4.3 Какие меры безопасности нужно предпринять? -Исходя из всего вышесказанного, нам нужно защитить **порт**, **имя пользователя** и **пароль**, чтобы снизить риск взлома. Для этого необходимо: +Исходя из всего вышесказанного, нам нужно защитить **порт**, **имя пользователя** и **пароль**, чтобы снизить риск взлома. Для этого необходимо: 1. Изменить порт SSH на **нестандартный** (отличный от 22) (см. раздел 4.4). 2. Создать **нового пользователя** (не `root`) и **запретить удалённое подключение по SSH** для пользователя `root` (см. разделы 4.5 и 4.6). @@ -46,58 +46,61 @@ ## 4.4 Изменение порта SSH -Давайте решим проблему с портом SSH, который по умолчанию равен `22` (обратите внимание: у некоторых хостинг-провайдеров порт SSH по умолчанию уже отличается от 22. В этом случае вы можете пропустить этот шаг, но можете и изменить порт ещё раз, следуя инструкциям ниже). +Давайте решим проблему с портом SSH, который по умолчанию равен `22` (обратите внимание: у некоторых хостинг-провайдеров порт SSH по умолчанию уже отличается от 22. В этом случае вы можете пропустить этот шаг, но можете и изменить порт ещё раз, следуя инструкциям ниже). 1. Базовые команды Linux: - | Номер | Команда | Описание | - | :----: | :---------------- | :------------------------ | - | `cmd-03` | `nano` | Текстовый редактор | - | `cmd-04` | `systemctl restart` | Перезапуск службы | + | Номер | Команда | Описание | + | :------: | :------------------ | :----------------- | + | `cmd-03` | `nano` | Текстовый редактор | + | `cmd-04` | `systemctl restart` | Перезапуск службы | 2. Важные файлы конфигурации Linux: - | Номер | Путь к файлу | Описание | - | :------ | :----------------------- | :------------------------- | - | `conf-01` | `/etc/ssh/sshd_config` | Настройки SSH-сервера | + | Номер | Путь к файлу | Описание | + | :-------- | :--------------------- | :-------------------- | + | `conf-01` | `/etc/ssh/sshd_config` | Настройки SSH-сервера | -3. Первое, что нужно сделать, — это открыть файл настроек SSH-сервера (`/etc/ssh/sshd_config`) в текстовом редакторе `nano`. В Windows вы бы просто нашли этот файл и дважды кликнули по нему. А как это сделать в Linux? Если вы внимательно читали предыдущие разделы, то наверняка уже догадались! Правильно, нужно выполнить команду: +3. Первое, что нужно сделать, — это открыть файл настроек SSH-сервера (`/etc/ssh/sshd_config`) в текстовом редакторе `nano`. В Windows вы бы просто нашли этот файл и дважды кликнули по нему. А как это сделать в Linux? Если вы внимательно читали предыдущие разделы, то наверняка уже догадались! Правильно, нужно выполнить команду: ```shell nano /etc/ssh/sshd_config ``` -4. После открытия файла вы увидите интерфейс редактора `nano`. Обратите внимание на нижнюю часть экрана, где перечислены основные горячие клавиши (на скриншоте ниже выделены красной рамкой). Не нужно ничего заучивать, всё необходимое всегда перед глазами! +4. После открытия файла вы увидите интерфейс редактора `nano`. Обратите внимание на нижнюю часть экрана, где перечислены основные горячие клавиши (на скриншоте ниже выделены красной рамкой). Не нужно ничего заучивать, всё необходимое всегда перед глазами! ![Интерфейс nano](./ch04-img01-nano-ui.png) -5) Второе, что нужно сделать, — это найти строку, начинающуюся с `Port`, и изменить номер порта. Число после `Port` — это номер порта SSH. Рекомендуется использовать число в диапазоне от `1024` до `65535` (в этой статье мы будем использовать порт `9753`). Как это сделать, используя горячие клавиши `nano`? Вы уже наверняка догадались! +5) Второе, что нужно сделать, — это найти строку, начинающуюся с `Port`, и изменить номер порта. Число после `Port` — это номер порта SSH. Рекомендуется использовать число в диапазоне от `1024` до `65535` (в этой статье мы будем использовать порт `9753`). Как это сделать, используя горячие клавиши `nano`? Вы уже наверняка догадались! - Нажмите `Ctrl+W`, чтобы открыть поиск, введите `Port 22` и нажмите Enter. - Замените `22` на `9753`. - - Примечание: если в начале строки стоит символ `#`, значит, эта строка закомментирована и не будет применяться. Вы можете либо раскомментировать её (удалив `#`), либо добавить новую строку без `#` в конце файла, как показано на скриншоте. + - Примечание: если в начале строки стоит символ `#`, значит, эта строка закомментирована и не будет применяться. Вы можете либо раскомментировать её (удалив `#`), либо добавить новую строку без `#` в конце файла, как показано на скриншоте. ::: warning - Использование порта `9753` в этой статье делает его менее безопасным, поскольку злоумышленники могут начать сканировать этот порт в первую очередь. Кроме того, этот порт может быть заблокирован некоторыми провайдерами. Поэтому настоятельно рекомендуем использовать другой порт. У вас в распоряжении более 60 тысяч портов, так что выбрать есть из чего. + Использование порта `9753` в этой статье делает его менее безопасным, поскольку злоумышленники могут начать сканировать этот порт в первую очередь. Кроме того, этот порт может быть заблокирован некоторыми провайдерами. Поэтому настоятельно рекомендуем использовать другой порт. У вас в распоряжении более 60 тысяч портов, так что выбрать есть из чего. ::: 6. Третье, что нужно сделать, — это сохранить изменения и выйти из редактора. - Как вы уже могли заметить, для сохранения файла используется не `Ctrl+S`, как в большинстве программ. - Горячие клавиши: `Ctrl+O` — сохранить, `Ctrl+X` — выйти. + - Добавьте новое правило в брандмауэр, чтобы открыть новый порт SSH. В противном случае, после перезагрузки инстанса, подключение по SSH будет недоступно. - **Пример для Ubuntu с использованием `ufw`:** - ```shell - sudo ufw allow 9753/tcp - ``` + ```shell + sudo ufw allow 9753/tcp + ``` + 7. И последнее, что нужно сделать, — это перезапустить SSH-сервер, чтобы изменения вступили в силу. ```shell systemctl restart ssh ``` -Затем можно попробовать открыть новую сессию в SSH-клиенте и проверить подключение. Если возникнут проблемы, можно изменить конфигурацию в старой SSH-сессии (открытые SSH-соединения не будут разорваны при перезапуске службы SSHD). + + Затем можно попробовать открыть новую сессию в SSH-клиенте и проверить подключение. Если возникнут проблемы, можно изменить конфигурацию в старой SSH-сессии (открытые SSH-соединения не будут разорваны при перезапуске службы SSHD). 8. Весь процесс показан на гифке ниже: @@ -105,34 +108,34 @@ 9. Изменение настроек PuTTY - Теперь, когда вы изменили порт SSH, вам нужно указать новый порт (`9753`) в настройках PuTTY. Вы ведь помните, где это делается? (Если нет, вернитесь и перечитайте предыдущие разделы!) + Теперь, когда вы изменили порт SSH, вам нужно указать новый порт (`9753`) в настройках PuTTY. Вы ведь помните, где это делается? (Если нет, вернитесь и перечитайте предыдущие разделы!) ## 4.5 Создание нового пользователя Перейдём ко второму шагу — избавлению от пользователя `root`. -Прежде всего, нужно понимать, что пользователь `root` в Linux — это не просто администратор. Это корень системы, её основа, верховный правитель. Если безопасность учётной записи `root` будет нарушена, под угрозой окажется вся система. +Прежде всего, нужно понимать, что пользователь `root` в Linux — это не просто администратор. Это корень системы, её основа, верховный правитель. Если безопасность учётной записи `root` будет нарушена, под угрозой окажется вся система. 1. Базовые команды Linux: - | Номер | Команда | Описание | - | :----: | :------------ | :---------------------------------- | - | `cmd-05` | `adduser` | Добавление нового пользователя | + | Номер | Команда | Описание | + | :------: | :------------ | :--------------------------------- | + | `cmd-05` | `adduser` | Добавление нового пользователя | | `cmd-06` | `apt install` | Установка программного обеспечения | - | `cmd-07` | `visudo` | Редактор файла sudoers | + | `cmd-07` | `visudo` | Редактор файла sudoers | -2. Первое, что нужно сделать, — это создать нового пользователя и установить для него пароль. Имя пользователя может быть любым, в этой статье мы будем использовать имя `vpsadmin`. +2. Первое, что нужно сделать, — это создать нового пользователя и установить для него пароль. Имя пользователя может быть любым, в этой статье мы будем использовать имя `vpsadmin`. ```shell adduser vpsadmin ``` - Следуйте инструкциям на экране. Обязательно укажите пароль для нового пользователя (и не удивляйтесь, что при вводе пароля символы не отображаются). Далее система может запросить дополнительную информацию о пользователе. Можете пропустить эти пункты, нажав Enter. + Следуйте инструкциям на экране. Обязательно укажите пароль для нового пользователя (и не удивляйтесь, что при вводе пароля символы не отображаются). Далее система может запросить дополнительную информацию о пользователе. Можете пропустить эти пункты, нажав Enter. ![Создание нового пользователя](./ch04-img03-adduser.png) ::: warning - Использование имени пользователя `vpsadmin` в этой статье делает его менее безопасным, поскольку злоумышленники могут начать перебирать пароли для этого имени в первую очередь. Поэтому, как и в случае с портом, настоятельно рекомендуем использовать другое имя пользователя. + Использование имени пользователя `vpsadmin` в этой статье делает его менее безопасным, поскольку злоумышленники могут начать перебирать пароли для этого имени в первую очередь. Поэтому, как и в случае с портом, настоятельно рекомендуем использовать другое имя пользователя. ::: 3. Весь процесс показан на гифке ниже: @@ -145,7 +148,7 @@ apt update && apt install sudo ``` - Вы, наверное, заметили, что эта строка содержит две команды. Первая команда, `apt update`, уже знакома вам — она обновляет информацию о доступных пакетах. Вторая команда, `apt install`, используется для установки программного обеспечения. В данном случае мы обновляем информацию о пакетах и устанавливаем последнюю версию `sudo`. Символы `&&` используются для объединения нескольких команд в одну строку. + Вы, наверное, заметили, что эта строка содержит две команды. Первая команда, `apt update`, уже знакома вам — она обновляет информацию о доступных пакетах. Вторая команда, `apt install`, используется для установки программного обеспечения. В данном случае мы обновляем информацию о пакетах и устанавливаем последнюю версию `sudo`. Символы `&&` используются для объединения нескольких команд в одну строку. 5. Третье, что нужно сделать, — это добавить пользователя `vpsadmin` в группу `sudo`, чтобы он мог использовать команду `sudo`. @@ -156,7 +159,7 @@ Добавьте следующую строку в раздел `User Privilege Specification`: `vpsadmin ALL=(ALL) NOPASSWD: ALL`. ::: warning - Обратите внимание на опцию `NOPASSWD`. Она означает, что пользователю `vpsadmin` не нужно будет вводить пароль при использовании команды `sudo`. **Это противоречит общепринятым рекомендациям по безопасности.** Однако я рекомендую сделать именно так, потому что многие новички используют учётную запись `root` именно потому, что им не нужно каждый раз вводить пароль. Я считаю, что **риски от использования учётной записи `root` гораздо выше**, чем риски от использования `sudo` без пароля. + Обратите внимание на опцию `NOPASSWD`. Она означает, что пользователю `vpsadmin` не нужно будет вводить пароль при использовании команды `sudo`. **Это противоречит общепринятым рекомендациям по безопасности.** Однако я рекомендую сделать именно так, потому что многие новички используют учётную запись `root` именно потому, что им не нужно каждый раз вводить пароль. Я считаю, что **риски от использования учётной записи `root` гораздо выше**, чем риски от использования `sudo` без пароля. Если вы всё же хотите, чтобы при каждом использовании `sudo` запрашивался пароль, используйте следующую строку: `vpsadmin ALL=(ALL:ALL) ALL`. ::: @@ -167,23 +170,23 @@ ## 4.6 Запрет удалённого подключения по SSH для пользователя root -1. Вы уже немного освоились в Linux, поэтому попробуйте сами догадаться, что нужно сделать в первую очередь. Правильно, нужно снова открыть файл настроек SSH-сервера (`/etc/ssh/sshd_config`) в редакторе `nano`. Не помните, как это сделать? Вернитесь и перечитайте предыдущие разделы! ... Правильный ответ: +1. Вы уже немного освоились в Linux, поэтому попробуйте сами догадаться, что нужно сделать в первую очередь. Правильно, нужно снова открыть файл настроек SSH-сервера (`/etc/ssh/sshd_config`) в редакторе `nano`. Не помните, как это сделать? Вернитесь и перечитайте предыдущие разделы! ... Правильный ответ: ```shell nano /etc/ssh/sshd_config ``` -2. Найдите строку `PermitRootLogin Yes` и замените `yes` на `no`. Помните, как это сделать? ... Правильный ответ: +2. Найдите строку `PermitRootLogin Yes` и замените `yes` на `no`. Помните, как это сделать? ... Правильный ответ: - Нажмите `Ctrl+W`, чтобы открыть поиск, введите `PermitRootLogin` и нажмите Enter. - Замените `yes` на `no`. -3. Сохраните изменения и выйдите из редактора. Помните, как это сделать? ... Правильный ответ: +3. Сохраните изменения и выйдите из редактора. Помните, как это сделать? ... Правильный ответ: - `Ctrl+O` — сохранить, `Enter` — подтвердить сохранение. - `Ctrl+X` — выйти. -4. Перезапустите SSH-сервер, чтобы изменения вступили в силу. Помните... Ладно, вот правильный ответ: +4. Перезапустите SSH-сервер, чтобы изменения вступили в силу. Помните... Ладно, вот правильный ответ: ```shell systemctl restart ssh @@ -193,7 +196,7 @@ ![Запрет удалённого подключения для root](./ch04-img06-ssh-no-root-full.gif) -6. Теперь при попытке подключения по SSH с помощью PuTTY под пользователем `root` вы получите ошибку. Используйте имя пользователя `vpsadmin` для подключения. Для удобства вы можете указать `vpsadmin` в качестве имени пользователя по умолчанию в настройках PuTTY (не забудьте сохранить сеанс!). +6. Теперь при попытке подключения по SSH с помощью PuTTY под пользователем `root` вы получите ошибку. Используйте имя пользователя `vpsadmin` для подключения. Для удобства вы можете указать `vpsadmin` в качестве имени пользователя по умолчанию в настройках PuTTY (не забудьте сохранить сеанс!). ![Имя пользователя по умолчанию в PuTTY](./ch04-img07-putty-default-user.png) @@ -201,19 +204,19 @@ Перейдём к третьему шагу — защите от подбора пароля. -Как мы уже говорили, хакеры не будут подбирать ваш пароль вручную. Они используют специальные программы и базы данных с миллионами скомпрометированных паролей. Если вы не используете случайно сгенерированный пароль достаточной длины (например, с помощью менеджера паролей, такого как 1Password или Keychain в macOS), ваш пароль могут подобрать. +Как мы уже говорили, хакеры не будут подбирать ваш пароль вручную. Они используют специальные программы и базы данных с миллионами скомпрометированных паролей. Если вы не используете случайно сгенерированный пароль достаточной длины (например, с помощью менеджера паролей, такого как 1Password или Keychain в macOS), ваш пароль могут подобрать. -Конечно, можно использовать длинный и сложный пароль, но такой пароль сложно запомнить и легко ввести неправильно. Чтобы решить эту проблему, можно вообще отказаться от аутентификации по паролю и использовать более безопасный способ — аутентификацию по SSH-ключам. +Конечно, можно использовать длинный и сложный пароль, но такой пароль сложно запомнить и легко ввести неправильно. Чтобы решить эту проблему, можно вообще отказаться от аутентификации по паролю и использовать более безопасный способ — аутентификацию по SSH-ключам. -**Аутентификация по SSH-ключам** основана на использовании пары связанных ключей — **публичного** и **приватного**. Публичный ключ помещается на сервер, а приватный ключ хранится у вас на компьютере. При подключении по SSH клиент предъявляет серверу публичный ключ, а сервер, в свою очередь, шифрует с помощью него случайное сообщение и отправляет клиенту. Клиент расшифровывает сообщение с помощью приватного ключа и отправляет результат обратно на сервер. Если результат совпадает с ожидаемым, аутентификация считается успешной (таким образом, вам не нужно запоминать и вводить сложный пароль, достаточно лишь защитить свой приватный ключ от кражи). +**Аутентификация по SSH-ключам** основана на использовании пары связанных ключей — **публичного** и **приватного**. Публичный ключ помещается на сервер, а приватный ключ хранится у вас на компьютере. При подключении по SSH клиент предъявляет серверу публичный ключ, а сервер, в свою очередь, шифрует с помощью него случайное сообщение и отправляет клиенту. Клиент расшифровывает сообщение с помощью приватного ключа и отправляет результат обратно на сервер. Если результат совпадает с ожидаемым, аутентификация считается успешной (таким образом, вам не нужно запоминать и вводить сложный пароль, достаточно лишь защитить свой приватный ключ от кражи). ::: warning -В этой статье мы рассмотрим использование **RSA-ключей**, поскольку они поддерживаются практически всеми SSH-клиентами и до сих пор считаются достаточно надёжными. Однако это не единственный вариант. +В этой статье мы рассмотрим использование **RSA-ключей**, поскольку они поддерживаются практически всеми SSH-клиентами и до сих пор считаются достаточно надёжными. Однако это не единственный вариант. Существуют и другие алгоритмы: - **DSA**: этот алгоритм считается небезопасным, поэтому использовать его не рекомендуется. -- **ECDSA**: этот алгоритм обеспечивает высокий уровень безопасности при меньшем размере ключа, однако существуют подозрения, что в нём есть уязвимости, которые могут быть использованы АНБ. Поэтому, если вы храните на своём сервере что-то действительно важное, лучше не использовать этот алгоритм. +- **ECDSA**: этот алгоритм обеспечивает высокий уровень безопасности при меньшем размере ключа, однако существуют подозрения, что в нём есть уязвимости, которые могут быть использованы АНБ. Поэтому, если вы храните на своём сервере что-то действительно важное, лучше не использовать этот алгоритм. - **Ed25519**: этот алгоритм похож на ECDSA, но считается более безопасным, поскольку его код открыт и доступен для изучения. Поэтому, если ваше оборудование и программное обеспечение поддерживают этот алгоритм, рекомендуется использовать именно его. @@ -221,27 +224,27 @@ Итак, давайте настроим аутентификацию по SSH-ключам. -1. Запустите программу **PuTTYgen** (генератор ключей PuTTY). Она находится в меню «Пуск» --> «Все программы» --> «PuTTY (64-bit)» --> «PuTTYgen». +1. Запустите программу **PuTTYgen** (генератор ключей PuTTY). Она находится в меню «Пуск» --> «Все программы» --> «PuTTY (64-bit)» --> «PuTTYgen». 1. Нажмите кнопку **Generate**, чтобы сгенерировать ключи (поводите курсором мыши по пустому пространству окна, чтобы добавить энтропии). ![Генерация ключей](./ch04-img08-puttygen-save.png) ::: warning - На скриншоте показан пример генерации 2048-битного RSA-ключа. Однако для достижения уровня безопасности, со comparableного с 256-битным ключом ECDSA/Ed25519, вам нужно сгенерировать 3072-битный RSA-ключ (т.е. ввести значение `3072` в поле «Number of bits in a generated key»). + На скриншоте показан пример генерации 2048-битного RSA-ключа. Однако для достижения уровня безопасности, со comparableного с 256-битным ключом ECDSA/Ed25519, вам нужно сгенерировать 3072-битный RSA-ключ (т.е. ввести значение `3072` в поле «Number of bits in a generated key»). ::: 2. Вы можете установить пароль для защиты приватного ключа. 3. Нажмите кнопку **Save public key**, чтобы сохранить публичный ключ в файл `id_rsa.pub`. 4. Нажмите кнопку **Save private key**, чтобы сохранить приватный ключ в файл `id_rsa` (приватные ключи PuTTY имеют расширение `.ppk`). - 5. **Важно!** Скопируйте содержимое поля, выделенного красной рамкой (не забудьте прокрутить текст до конца!), и сохраните его в файл `authorized_keys`. (Если вы будете использовать для этого VSCode, файл будет сохранён с расширением `.txt` — `authorized_keys.txt`. Это нормально, позже мы переименуем файл). + 5. **Важно!** Скопируйте содержимое поля, выделенного красной рамкой (не забудьте прокрутить текст до конца!), и сохраните его в файл `authorized_keys`. (Если вы будете использовать для этого VSCode, файл будет сохранён с расширением `.txt` — `authorized_keys.txt`. Это нормально, позже мы переименуем файл). ![Сохранение ключей](./ch04-img09-puttygen-save-keys.png) 2. Скопируйте публичный ключ на VPS в домашний каталог пользователя `vpsadmin`. 1. Для этого используйте программу **WinSCP**, которую мы установили ранее. - 2. Скачайте и установите WinSCP с [официального сайта](https://winscp.net/eng/index.php). При первом запуске программа предложит импортировать настройки из PuTTY. Согласитесь на импорт. + 2. Скачайте и установите WinSCP с [официального сайта](https://winscp.net/eng/index.php). При первом запуске программа предложит импортировать настройки из PuTTY. Согласитесь на импорт. ![Импорт настроек из PuTTY](./ch04-img10-winscp-import-session.png) @@ -249,9 +252,9 @@ ![Настройки подключения в WinSCP](./ch04-img11-winscp-ui.png) - 4. В левой части окна WinSCP отображаются файлы и папки на вашем компьютере, а в правой — на VPS. Перейдите в папку с сохранёнными ключами на вашем компьютере. + 4. В левой части окна WinSCP отображаются файлы и папки на вашем компьютере, а в правой — на VPS. Перейдите в папку с сохранёнными ключами на вашем компьютере. - 5. В правой части окна (VPS) по умолчанию открыт каталог `/home/vpsadmin/`. Нажмите кнопку «Show hidden files» (скрытые файлы), чтобы отобразить скрытые файлы и папки. + 5. В правой части окна (VPS) по умолчанию открыт каталог `/home/vpsadmin/`. Нажмите кнопку «Show hidden files» (скрытые файлы), чтобы отобразить скрытые файлы и папки. ![Локальные и удалённые папки](./ch04-img12-winscp-locations.png) @@ -274,10 +277,10 @@ 3. Настройте SSH-сервер на использование ключей и отключите аутентификацию по паролю. 1. Базовые команды Linux: - | Номер | Команда | Описание | + | Номер | Команда | Описание | | :----: | :------ | :--------------------------------------- | - | `cmd-08` | `sudo` | Выполнение команды от имени root | - | `cmd-09` | `chmod` | Изменение прав доступа к файлам и папкам | + | `cmd-08` | `sudo` | Выполнение команды от имени root | + | `cmd-09` | `chmod` | Изменение прав доступа к файлам и папкам | 2. Подключитесь к VPS по SSH (PuTTY). @@ -287,7 +290,7 @@ chmod 600 ~/.ssh/authorized_keys ``` - 4. Откройте файл настроек SSH. Мы уже делали это раньше, но теперь мы работаем не под пользователем `root`, а под пользователем `vpsadmin`. У этого пользователя нет прав на редактирование системных файлов, поэтому нужно использовать команду `sudo`: + 4. Откройте файл настроек SSH. Мы уже делали это раньше, но теперь мы работаем не под пользователем `root`, а под пользователем `vpsadmin`. У этого пользователя нет прав на редактирование системных файлов, поэтому нужно использовать команду `sudo`: ```shell sudo nano /etc/ssh/sshd_config @@ -295,7 +298,7 @@ 5. Найдите (`Ctrl+W`) строку `PasswordAuthentication` и измените значение на `no`. - 6. Найдите (`Ctrl+W`) строку `PubkeyAuthentication` и измените значение на `yes`. Сохраните изменения (`Ctrl+O`) и выйдите из редактора (`Ctrl+X`). + 6. Найдите (`Ctrl+W`) строку `PubkeyAuthentication` и измените значение на `yes`. Сохраните изменения (`Ctrl+O`) и выйдите из редактора (`Ctrl+X`). 7. Перезапустите SSH-сервер (не забудьте, что теперь вам нужно использовать команду `sudo`): @@ -311,29 +314,24 @@ ![Путь к приватному ключу в PuTTY](./ch04-img18-putty-privatekey-location.png) -5. Готово! Теперь у вас настроена аутентификация по SSH-ключам, а аутентификация по паролю отключена. Кроме того, вы сохранили имя пользователя и путь к приватному ключу в сеансе PuTTY. Теперь для подключения к VPS достаточно будет выбрать сохранённый сеанс `VPS-SERVER` и нажать кнопку «Open». +5. Готово! Теперь у вас настроена аутентификация по SSH-ключам, а аутентификация по паролю отключена. Кроме того, вы сохранили имя пользователя и путь к приватному ключу в сеансе PuTTY. Теперь для подключения к VPS достаточно будет выбрать сохранённый сеанс `VPS-SERVER` и нажать кнопку «Open». Если вы установили пароль для защиты приватного ключа, вам нужно будет ввести его при подключении, как показано на скриншоте ниже: ![Парольная фраза для приватного ключа](./ch04-img19-putty-privatekey-passphrase.png) -6. Не забудьте настроить аутентификацию по ключам и в WinSCP. В противном случае вы не сможете подключаться к серверу для передачи файлов: +6. Не забудьте настроить аутентификацию по ключам и в WinSCP. В противном случае вы не сможете подключаться к серверу для передачи файлов: ![Путь к приватному ключу в WinSCP](./ch04-img20-winscp-privatekey-location.png) ::: warning -Теперь для подключения к вашему серверу по SSH требуется авторизация по ключам. Мы рассмотрели настройку PuTTY и WinSCP, но существует множество других программ, которые также используют SSH. Настройте их самостоятельно при необходимости. +Теперь для подключения к вашему серверу по SSH требуется авторизация по ключам. Мы рассмотрели настройку PuTTY и WinSCP, но существует множество других программ, которые также используют SSH. Настройте их самостоятельно при необходимости. ::: ## 4.8 Ваш прогресс -На этом этапе ваш VPS защищён базовыми мерами безопасности. Конечно, это не панацея, но большинство автоматизированных атак вам уже не страшны! +На этом этапе ваш VPS защищён базовыми мерами безопасности. Конечно, это не панацея, но большинство автоматизированных атак вам уже не страшны! Теперь у нас есть надёжный фундамент, и в следующей главе мы можем приступить к установке и настройке необходимых компонентов Xray (а именно, веб-сервера и SSL-сертификата). > ⬛⬛⬛⬛⬜⬜⬜⬜ 50% - - - - - diff --git a/docs/ru/document/level-0/ch05-webpage.md b/docs/ru/document/level-0/ch05-webpage.md index de14488..9631997 100644 --- a/docs/ru/document/level-0/ch05-webpage.md +++ b/docs/ru/document/level-0/ch05-webpage.md @@ -2,9 +2,9 @@ ## 5.1 Зачем нужен веб-сайт? -Начинающие пользователи могут задаться вопросом: зачем создавать веб-сайт для обхода блокировок? Я не программист, это же сложно? +Начинающие пользователи могут задаться вопросом: зачем создавать веб-сайт для обхода блокировок? Я не программист, это же сложно? -Начнём с первого вопроса. Веб-сайт нужен для того, чтобы: +Начнём с первого вопроса. Веб-сайт нужен для того, чтобы: 1. Получить действующий SSL-сертификат (это очень важно). 2. Обеспечить маскировку трафика (fallback) и защититься от атак, направленных на выявление VPN-серверов. @@ -12,29 +12,32 @@ Теперь ответим на второй вопрос: -1. В этой статье мы создадим максимально простой веб-сайт, состоящий из **одного HTML-файла** и работающий на веб-сервере **Nginx**, чтобы решить поставленные выше задачи. Это очень просто. -2. Этот веб-сайт не обязательно должен быть просто прикрытием. Вы можете развивать его и превратить в полноценный проект. Всё зависит от ваших желаний и возможностей. -3. Создание сайта-прикрытия и его продвижение — это отдельная большая тема, которая выходит за рамки этой статьи. Если вам интересно, вы можете найти информацию об этом в интернете. +1. В этой статье мы создадим максимально простой веб-сайт, состоящий из **одного HTML-файла** и работающий на веб-сервере **Nginx**, чтобы решить поставленные выше задачи. Это очень просто. +2. Этот веб-сайт не обязательно должен быть просто прикрытием. Вы можете развивать его и превратить в полноценный проект. Всё зависит от ваших желаний и возможностей. +3. Создание сайта-прикрытия и его продвижение — это отдельная большая тема, которая выходит за рамки этой статьи. Если вам интересно, вы можете найти информацию об этом в интернете. ## 5.2 Подключение к VPS и установка Nginx -1. В этом разделе мы будем использовать команды, которые уже были подробно рассмотрены ранее. Если вы что-то не понимаете, вернитесь и перечитайте предыдущие главы. +1. В этом разделе мы будем использовать команды, которые уже были подробно рассмотрены ранее. Если вы что-то не понимаете, вернитесь и перечитайте предыдущие главы. ```shell sudo apt update && sudo apt install nginx ``` -2. После завершения установки Nginx запустится автоматически. Откройте браузер на своём компьютере и введите адрес `http://100.200.300.400:80`. Если вы увидите страницу, как на скриншоте ниже, значит, Nginx работает. +2. После завершения установки Nginx запустится автоматически. Откройте браузер на своём компьютере и введите адрес `http://100.200.300.400:80`. Если вы увидите страницу, как на скриншоте ниже, значит, Nginx работает. ![Стандартная страница Nginx](./ch05-img01-nginx-default-running.png) 3. Если вы не видите страницу Nginx, возможно, вам нужно настроить Uncomplicated Firewall (UFW), стандартный брандмауэр в Debian, чтобы разрешить трафик на портах HTTP (80) и HTTPS (443). a. Чтобы проверить, введите: + ```shell sudo ufw status ``` - b. Если вывод команды такой, как показано ниже, это означает, что порты 80 и 443 закрыты. Выполните действия, описанные в пункте c. + + b. Если вывод команды такой, как показано ниже, это означает, что порты 80 и 443 закрыты. Выполните действия, описанные в пункте c. + ```shell Status: active To Action From @@ -42,11 +45,15 @@ 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6) ``` + c. Чтобы открыть порты 80 и 443 для Nginx в UFW, выполните команду: + ```shell sudo ufw allow 'Nginx Full' ``` - d. Снова проверьте статус UFW, выполнив команду из пункта a. Если вы видите вывод, как показано ниже, значит, трафик для Nginx разрешён, и вы должны увидеть стандартную страницу Nginx. + + d. Снова проверьте статус UFW, выполнив команду из пункта a. Если вы видите вывод, как показано ниже, значит, трафик для Nginx разрешён, и вы должны увидеть стандартную страницу Nginx. + ```shell Status: active To Action From @@ -60,15 +67,15 @@ ## 5.3 Создание простой веб-страницы 1. Базовые команды Linux: - | Номер | Команда | Описание | + | Номер | Команда | Описание | | :----: | :-------- | :------------------------ | - | `cmd-10` | `mkdir` | Создание папки | - | `cmd-11` | `systemctl reload` | Перезагрузка службы | + | `cmd-10` | `mkdir` | Создание папки | + | `cmd-11` | `systemctl reload` | Перезагрузка службы | 2. Важные файлы конфигурации Linux: - | Номер | Путь к файлу | Описание | + | Номер | Путь к файлу | Описание | | :------ | :-------------------- | :------------------------- | - | `conf-02` | `/etc/nginx/nginx.conf` | Настройки Nginx | + | `conf-02` | `/etc/nginx/nginx.conf` | Настройки Nginx | 3. Создайте папку `/home/vpsadmin/www/webpage/` для вашего сайта и файл `index.html` внутри неё: ```shell @@ -137,7 +144,7 @@ sudo nano /etc/nginx/nginx.conf ``` - 2. Добавьте следующий блок кода внутрь блока `http{}` и сохраните изменения (`Ctrl+O`, `Enter`), затем выйдите из редактора (`Ctrl+X`). (Не забудьте заменить доменное имя на ваше реальное доменное имя, включая поддомен). + 2. Добавьте следующий блок кода внутрь блока `http{}` и сохраните изменения (`Ctrl+O`, `Enter`), затем выйдите из редактора (`Ctrl+X`). (Не забудьте заменить доменное имя на ваше реальное доменное имя, включая поддомен). ``` server { @@ -168,11 +175,11 @@ ## 5.4 Распространённые ошибки -Вообще, если вы внимательно следовали инструкциям, ошибок быть не должно. Однако на этом этапе многие пользователи сталкиваются с проблемами. В чём же дело? Ответ прост: **невнимательность**. Здесь возможны только две ошибки, и обе они связаны с невнимательностью. +Вообще, если вы внимательно следовали инструкциям, ошибок быть не должно. Однако на этом этапе многие пользователи сталкиваются с проблемами. В чём же дело? Ответ прост: **невнимательность**. Здесь возможны только две ошибки, и обе они связаны с невнимательностью. **Ошибки:** -- Путь `/home/vpsadmin/www/webpage` в файле `nginx.conf` не соответствует реальному пути к файлу `index.html`. Nginx не может найти файл. +- Путь `/home/vpsadmin/www/webpage` в файле `nginx.conf` не соответствует реальному пути к файлу `index.html`. Nginx не может найти файл. - Путь указан верно, но у Nginx нет прав на чтение файла. **Причины:** @@ -183,13 +190,13 @@ Если у вас возникли проблемы, вернитесь к разделу 5.3 и внимательно перечитайте пункты 3 и 6.2. ::: warning -В предыдущих главах мы много говорили о важности использования пользователя, отличного от `root`, и вся статья написана с учётом этого. Поэтому проблемы, связанные с использованием `root`, не рассматриваются в рамках этой статьи. +В предыдущих главах мы много говорили о важности использования пользователя, отличного от `root`, и вся статья написана с учётом этого. Поэтому проблемы, связанные с использованием `root`, не рассматриваются в рамках этой статьи. Однако я уверен, что те, кто всё-таки работает под `root`, достаточно опытны и смогут решить эти проблемы самостоятельно. ::: ## 5.5 Ваш прогресс -Первый компонент Xray — веб-сайт — готов. Давайте перейдём ко второму компоненту — SSL-сертификату! +Первый компонент Xray — веб-сайт — готов. Давайте перейдём ко второму компоненту — SSL-сертификату! -> ⬛⬛⬛⬛⬛⬜⬜⬜ 62.5% \ No newline at end of file +> ⬛⬛⬛⬛⬛⬜⬜⬜ 62.5% diff --git a/docs/ru/document/level-0/ch06-certificates.md b/docs/ru/document/level-0/ch06-certificates.md index 49b6f71..526d618 100644 --- a/docs/ru/document/level-0/ch06-certificates.md +++ b/docs/ru/document/level-0/ch06-certificates.md @@ -2,23 +2,23 @@ ## 6.1 Получение SSL-сертификата -Теперь нам нужно получить действующий SSL-сертификат для нашего доменного имени, чтобы веб-сайт работал по протоколу HTTPS. Это важнейший инструмент для обеспечения безопасности трафика при использовании современных VPN-сервисов, таких как Xray. +Теперь нам нужно получить действующий SSL-сертификат для нашего доменного имени, чтобы веб-сайт работал по протоколу HTTPS. Это важнейший инструмент для обеспечения безопасности трафика при использовании современных VPN-сервисов, таких как Xray. ::: warning -Не используйте самоподписанные сертификаты. Это ненамного упростит задачу, но создаст дополнительные риски (например, возможность атак типа «человек посередине»). +Не используйте самоподписанные сертификаты. Это ненамного упростит задачу, но создаст дополнительные риски (например, возможность атак типа «человек посередине»). ::: -Мы будем использовать инструмент для управления сертификатами [`acme.sh`](https://github.com/acmesh-official/acme.sh). Он простой, лёгкий, эффективный и умеет автоматически обновлять сертификаты. +Мы будем использовать инструмент для управления сертификатами [`acme.sh`](https://github.com/acmesh-official/acme.sh). Он простой, лёгкий, эффективный и умеет автоматически обновлять сертификаты. -Я уверен, что вы уже освоились с базовыми командами Linux, поэтому скриншоты с выводом команд, которые мы уже использовали ранее, будут опущены. Если вы забыли, как выполнять ту или иную команду, вернитесь и перечитайте предыдущие главы. +Я уверен, что вы уже освоились с базовыми командами Linux, поэтому скриншоты с выводом команд, которые мы уже использовали ранее, будут опущены. Если вы забыли, как выполнять ту или иную команду, вернитесь и перечитайте предыдущие главы. ## 6.2 Установка `acme.sh` 1. Базовые команды Linux: - | Номер | Команда | Описание | + | Номер | Команда | Описание | | :----: | :---------- | :---------------------------- | - | `cmd-12` | `wget` | Загрузка файла из интернета | - | `cmd-13` | `acme.sh` | Управление сертификатами | + | `cmd-12` | `wget` | Загрузка файла из интернета | + | `cmd-13` | `acme.sh` | Управление сертификатами | 2. Запустите скрипт установки: @@ -44,7 +44,7 @@ ## 6.3 Тестовый запрос сертификата -Перед тем, как запросить настоящий сертификат, давайте сделаем тестовый запрос (`--issue --test`), чтобы убедиться, что всё настроено правильно. Это позволит избежать превышения лимита на количество запросов Let's Encrypt (например, не более 5 неудачных запросов в час для одного домена и одного аккаунта). +Перед тем, как запросить настоящий сертификат, давайте сделаем тестовый запрос (`--issue --test`), чтобы убедиться, что всё настроено правильно. Это позволит избежать превышения лимита на количество запросов Let's Encrypt (например, не более 5 неудачных запросов в час для одного домена и одного аккаунта). 1. Команда для тестового запроса сертификата (в этой статье мы будем использовать сертификаты **ECC**, поскольку на сегодняшний день нет причин не использовать их): @@ -53,7 +53,7 @@ ``` ::: warning Пояснение - Главное преимущество **ECC-сертификатов** — это меньший размер ключа, что означает более высокий уровень безопасности при том же размере ключа, а также более высокую скорость шифрования и расшифровки. Например, ECC-256 обеспечивает уровень безопасности, примерно соответствующий RSA-3072, так зачем же отказываться от ECC? Некоторые утверждают, что рукопожатие TLS с ECC-сертификатами происходит заметно быстрее. Я считаю, что это преувеличение. RSA-рукопожатие и так достаточно быстрое, а разница в скорости, если она и есть, составляет всего несколько миллисекунд и практически незаметна. + Главное преимущество **ECC-сертификатов** — это меньший размер ключа, что означает более высокий уровень безопасности при том же размере ключа, а также более высокую скорость шифрования и расшифровки. Например, ECC-256 обеспечивает уровень безопасности, примерно соответствующий RSA-3072, так зачем же отказываться от ECC? Некоторые утверждают, что рукопожатие TLS с ECC-сертификатами происходит заметно быстрее. Я считаю, что это преувеличение. RSA-рукопожатие и так достаточно быстрое, а разница в скорости, если она и есть, составляет всего несколько миллисекунд и практически незаметна. Конечно, если вам нужно обеспечить совместимость с очень старыми устройствами, то можно использовать и RSA-сертификат. ::: @@ -113,7 +113,7 @@ [Wed 30 Dec 2022 15:21:52 AM EST] And the full chain certs is there: /home/vpsadmin/.acme.sh/поддомен.ваш_домен.com_ecc/fullchain.cer ``` -3. Обратите внимание, что мы запросили тестовый сертификат, который нельзя использовать в реальной среде. Он нужен только для проверки корректности настроек. Если вы посмотрите на вывод команды, то увидите, что сертификат был выпущен сервером `https://acme-staging-v02.api.letsencrypt.org`. Слово `staging` означает, что это тестовый сервер Let's Encrypt. +3. Обратите внимание, что мы запросили тестовый сертификат, который нельзя использовать в реальной среде. Он нужен только для проверки корректности настроек. Если вы посмотрите на вывод команды, то увидите, что сертификат был выпущен сервером `https://acme-staging-v02.api.letsencrypt.org`. Слово `staging` означает, что это тестовый сервер Let's Encrypt. 4. Если на этом этапе возникли ошибки, выполните следующую команду, чтобы увидеть подробную информацию о процессе запроса сертификата: @@ -138,7 +138,7 @@ ``` ::: warning Пояснение - Параметр `--force` используется для принудительного обновления сертификата до истечения срока действия старого. В предыдущем шаге мы получили тестовый сертификат, который всё ещё действителен. Поэтому нам нужно использовать этот параметр. + Параметр `--force` используется для принудительного обновления сертификата до истечения срока действия старого. В предыдущем шаге мы получили тестовый сертификат, который всё ещё действителен. Поэтому нам нужно использовать этот параметр. ::: 2. В случае успеха вы увидите примерно такой же вывод, как и в предыдущем шаге: @@ -207,10 +207,6 @@ ## 6.6 Ваш прогресс -Наконец-то все необходимые компоненты Xray готовы! Мы подошли к самому интересному — установке и настройке самого Xray! +Наконец-то все необходимые компоненты Xray готовы! Мы подошли к самому интересному — установке и настройке самого Xray! > ⬛⬛⬛⬛⬛⬛⬜⬜ 75% - - - - diff --git a/docs/ru/document/level-0/ch07-xray-server.md b/docs/ru/document/level-0/ch07-xray-server.md index 4e33cb6..f0cf4b3 100644 --- a/docs/ru/document/level-0/ch07-xray-server.md +++ b/docs/ru/document/level-0/ch07-xray-server.md @@ -19,7 +19,7 @@ ## 7.2 Установка Xray -Xray основан на проекте с открытым исходным кодом [xray-core](https://github.com/XTLS/Xray-core) (лицензия `MPL 2.0`). Запущенный на сервере, скомпилированный бинарный файл этого проекта, работает как серверная часть Xray; запущенный на локальном компьютере, он становится клиентской частью. Основное различие заключается в **конфигурации**. +Xray основан на проекте с открытым исходным кодом [xray-core](https://github.com/XTLS/Xray-core) (лицензия `MPL 2.0`). Запущенный на сервере, скомпилированный бинарный файл этого проекта, работает как серверная часть Xray; запущенный на локальном компьютере, он становится клиентской частью. Основное различие заключается в **конфигурации**. Для установки воспользуемся официальным скриптом. Он предлагает несколько вариантов установки. Вы можете ознакомиться с ними в [репозитории скриптов](https://github.com/XTLS/Xray-install). **В данном руководстве мы будем использовать установку от имени непривилегированного пользователя**. @@ -27,9 +27,9 @@ Xray основан на проекте с открытым исходным к 1. Базовые команды Linux: - | Номер | Команда | Описание | - | :----: | :--------: | :-------------- | - | `cmd-14` | `rm` | Удаление файлов | + | Номер | Команда | Описание | + | :------: | :-----: | :-------------- | + | `cmd-14` | `rm` | Удаление файлов | 2. Скачиваем установочный скрипт: @@ -89,8 +89,8 @@ Xray основан на проекте с открытым исходным к 1. Базовые команды Linux: - | Номер | Команда | Описание | - | :----: | :----------: | :------------------------------------ | + | Номер | Команда | Описание | + | :------: | :----------: | :------------------------------------------- | | `cmd-15` | `crontab -e` | Редактирование crontab текущего пользователя | 2. Создаём файл скрипта (`xray-cert-renew.sh`): @@ -157,9 +157,9 @@ Xray основан на проекте с открытым исходным к 1. Базовые команды Linux: - | Номер | Команда | Описание | - | :----: | :-----: | :---------------------- | - | `cmd-16` | `touch` | Создание пустого файла | + | Номер | Команда | Описание | + | :------: | :-----: | :--------------------- | + | `cmd-16` | `touch` | Создание пустого файла | 2. Создаём папку для логов в домашней директории пользователя `vpsadmin`: @@ -571,4 +571,4 @@ Xray основан на проекте с открытым исходным к Затронутые разделы: - - 7.8 Оптимизация сервера: автоматическое перенаправление HTTP на HTTPS - 4. Добавляем новый сервер, который будет прослушивать локальный порт и отдавать файлы сайта. \ No newline at end of file + - 7.8 Оптимизация сервера: автоматическое перенаправление HTTP на HTTPS - 4. Добавляем новый сервер, который будет прослушивать локальный порт и отдавать файлы сайта. diff --git a/docs/ru/document/level-0/ch08-xray-clients.md b/docs/ru/document/level-0/ch08-xray-clients.md index 4227788..e1c7554 100644 --- a/docs/ru/document/level-0/ch08-xray-clients.md +++ b/docs/ru/document/level-0/ch08-xray-clients.md @@ -12,17 +12,17 @@ 2. Поступивший на клиент трафик обрабатывается **модулем маршрутизации** (`routing`) в соответствии с заданными правилами и перенаправляется на разные **исходящие подключения** (`outbounds`) клиента `Xray`, например: - - Трафик на китайские ресурсы — напрямую (`direct`) - - Трафик на зарубежные ресурсы — через VPS (`proxy`) - - Рекламный трафик — блокируется (`block`) + - Трафик на китайские ресурсы — напрямую (`direct`) + - Трафик на зарубежные ресурсы — через VPS (`proxy`) + - Рекламный трафик — блокируется (`block`) 3. Трафик на зарубежные ресурсы, перенаправленный на VPS, проходит через Великий Китайский Файрвол и попадает на **входящее подключение** (`inbounds`) сервера `Xray`. 4. Как и на клиенте, трафик, поступивший на сервер, обрабатывается **модулем маршрутизации** (`routing`) в соответствии с заданными правилами и перенаправляется на разные **исходящие подключения** (`outbounds`): - - Поскольку сервер находится за пределами Китая, трафик по умолчанию идёт напрямую, что позволяет получить доступ к заблокированным ресурсам (`direct`). - - При необходимости можно настроить перенаправление трафика на другие VPS (`proxy`). - - На сервере также можно блокировать нежелательный трафик, например, рекламу или торренты (`block`). + - Поскольку сервер находится за пределами Китая, трафик по умолчанию идёт напрямую, что позволяет получить доступ к заблокированным ресурсам (`direct`). + - При необходимости можно настроить перенаправление трафика на другие VPS (`proxy`). + - На сервере также можно блокировать нежелательный трафик, например, рекламу или торренты (`block`). :::warning Внимание! @@ -39,12 +39,12 @@ Набор параметров подключения в `Xray` зависит от используемого [протокола](../../config/inbounds/). В главе 7 мы настроили сервер на использование протокола `VLESS` с шифрованием `XTLS`. Посмотрим на файл конфигурации сервера, чтобы узнать, какие параметры нужны для подключения: -- **Адрес сервера**: `sub.yourdomain.com` -- **Порт сервера**: `443` -- **Протокол**: `vless` -- **Поток**: `xtls-rprx-vision` (режим `vision` подходит для всех платформ) -- **Идентификатор**: `uuiduuid-uuid-uuid-uuid-uuiduuiduuid` -- **Безопасность**: `"allowInsecure": false` +- **Адрес сервера**: `sub.yourdomain.com` +- **Порт сервера**: `443` +- **Протокол**: `vless` +- **Поток**: `xtls-rprx-vision` (режим `vision` подходит для всех платформ) +- **Идентификатор**: `uuiduuid-uuid-uuid-uuid-uuiduuiduuid` +- **Безопасность**: `"allowInsecure": false` Ниже приведен список популярных клиентов Xray для мобильных и настольных устройств. Каждый клиент имеет свой собственный интерфейс, поэтому я не буду делать скриншоты для каждого из них. Внимательно изучите документацию к выбранному клиенту и укажите нужные параметры подключения. @@ -53,33 +53,33 @@ Многие клиенты поддерживают как `xray-core`, так и `v2fly-core`. Но по умолчанию может использоваться не тот, который вам нужен. Убедитесь, что вы выбрали нужный инструмент! ::: -- **v2rayN - для Windows** +- **v2rayN - для Windows** - - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/2dust/v2rayN/releases) - - Настройте клиент в соответствии с документацией + - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/2dust/v2rayN/releases) + - Настройте клиент в соответствии с документацией -- **v2rayNG - для Android** +- **v2rayNG - для Android** - - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/2dust/v2rayNG/releases) - - Настройте клиент в соответствии с документацией + - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/2dust/v2rayNG/releases) + - Настройте клиент в соответствии с документацией -- **Shadowrocket - для iOS, macOS на базе Apple M1** +- **Shadowrocket - для iOS, macOS на базе Apple M1** - - Создайте учётную запись iCloud **не** в китайском регионе - - Купите приложение в App Store - - Настройте клиент в соответствии с документацией + - Создайте учётную запись iCloud **не** в китайском регионе + - Купите приложение в App Store + - Настройте клиент в соответствии с документацией -- **Qv2ray - кроссплатформенный графический интерфейс для Linux, Windows, macOS** +- **Qv2ray - кроссплатформенный графический интерфейс для Linux, Windows, macOS** - - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/Qv2ray/Qv2ray/releases) (или более новую версию из раздела [сборок на GitHub](https://github.com/Qv2ray/Qv2ray/actions)) - - Изучите документацию на [сайте проекта](https://qv2ray.net/) - - Настройте клиент в соответствии с документацией + - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/Qv2ray/Qv2ray/releases) (или более новую версию из раздела [сборок на GitHub](https://github.com/Qv2ray/Qv2ray/actions)) + - Изучите документацию на [сайте проекта](https://qv2ray.net/) + - Настройте клиент в соответствии с документацией -- **V2RayXS - клиент для macOS, основанный на V2RayX и использующий xray-core** +- **V2RayXS - клиент для macOS, основанный на V2RayX и использующий xray-core** - - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/tzmax/v2rayXS/releases) - - Поддерживает импорт ссылок на конфигурации VLESS / VMessAEAD по стандарту, предложенному в [этой задаче](https://github.com/XTLS/Xray-core/issues/91) - - Настройте клиент в соответствии с документацией + - Скачайте последнюю версию из [репозитория на GitHub](https://github.com/tzmax/v2rayXS/releases) + - Поддерживает импорт ссылок на конфигурации VLESS / VMessAEAD по стандарту, предложенному в [этой задаче](https://github.com/XTLS/Xray-core/issues/91) + - Настройте клиент в соответствии с документацией На этом этапе ваша система готова к работе! @@ -89,9 +89,9 @@ Чтобы ответить на этот вопрос, я добавил этот раздел с дополнительным заданием. Оно немного выходит за рамки основного материала и может показаться сложным, но у него есть свои преимущества: -- Вы всегда будете использовать самую последнюю версию `xray-core`, не дожидаясь, пока разработчики клиентов выпустят обновления. -- Вы получите максимальную гибкость в настройке маршрутизации (хотя стоит отметить, что Qv2ray имеет мощный редактор маршрутизации, который позволяет настраивать все функции `xray-core`). -- Вы сэкономите системные ресурсы (графические клиенты всегда потребляют больше ресурсов, чем консольные). +- Вы всегда будете использовать самую последнюю версию `xray-core`, не дожидаясь, пока разработчики клиентов выпустят обновления. +- Вы получите максимальную гибкость в настройке маршрутизации (хотя стоит отметить, что Qv2ray имеет мощный редактор маршрутизации, который позволяет настраивать все функции `xray-core`). +- Вы сэкономите системные ресурсы (графические клиенты всегда потребляют больше ресурсов, чем консольные). Недостаток этого способа заключается в том, что вам придётся **настраивать клиент вручную, редактируя файл конфигурации**. Но ведь на сервере вы уже делали это, так что ничего сложного здесь нет. Давайте разберёмся по шагам: @@ -100,11 +100,11 @@ 3. Что значит "удобное место"? Это зависит от платформы. 4. Заполните файл конфигурации. - - Я написал пример конфигурации, основанный на схеме из раздела 8.1 (прямое подключение к китайским ресурсам, проксирование трафика на зарубежные ресурсы через VPS, блокировка рекламы) и параметрах подключения из раздела 8.2. - - Замените `uuid` на идентификатор из вашей конфигурации сервера. - - Замените `address` на доменное имя вашего сервера. - - Замените `serverName` на доменное имя вашего сервера. - - Я добавил подробные комментарии к каждому разделу конфигурации. + - Я написал пример конфигурации, основанный на схеме из раздела 8.1 (прямое подключение к китайским ресурсам, проксирование трафика на зарубежные ресурсы через VPS, блокировка рекламы) и параметрах подключения из раздела 8.2. + - Замените `uuid` на идентификатор из вашей конфигурации сервера. + - Замените `address` на доменное имя вашего сервера. + - Замените `serverName` на доменное имя вашего сервера. + - Я добавил подробные комментарии к каждому разделу конфигурации. ```json // ССЫЛКИ: diff --git a/docs/ru/document/level-0/ch09-appendix.md b/docs/ru/document/level-0/ch09-appendix.md index fa182e4..ce593be 100644 --- a/docs/ru/document/level-0/ch09-appendix.md +++ b/docs/ru/document/level-0/ch09-appendix.md @@ -2,45 +2,45 @@ ## 1. Индекс основных команд Linux для начинающих -| Номер | Название команды | Описание команды | Глава | -| :------: | :------------------ | :--------------------------- | :----------------------------------------: | -| `cmd-01` | `apt update` | Обновление списка пакетов | [Глава о удаленном подключении](./ch03-ssh.md) | -| `cmd-02` | `apt upgrade` | Обновление пакетов системы | [Глава о удаленном подключении](./ch03-ssh.md) | -| `cmd-03` | `nano` | Текстовый редактор | [Глава о безопасности](./ch04-security.md) | -| `cmd-04` | `systemctl restart` | Перезапуск сервиса | [Глава о безопасности](./ch04-security.md) | -| `cmd-05` | `adduser` | Добавление пользователя | [Глава о безопасности](./ch04-security.md) | -| `cmd-06` | `apt install` | Установка пакета | [Глава о безопасности](./ch04-security.md) | -| `cmd-07` | `visudo` | Редактор для настройки sudo | [Глава о безопасности](./ch04-security.md) | -| `cmd-08` | `sudo` | Выполнение команды от имени root | [Глава о безопасности](./ch04-security.md) | -| `cmd-09` | `chmod` | Изменение прав доступа к файлу/папке | [Глава о безопасности](./ch04-security.md) | -| `cmd-10` | `mkdir` | Создание папки | [Глава о создании сайта](./ch05-webpage.md) | -| `cmd-11` | `systemctl reload` | Перезагрузка конфигурации сервиса | [Глава о создании сайта](./ch05-webpage.md) | -| `cmd-12` | `wget` | Загрузка файла/страницы из сети | [Глава об управлении сертификатами](./ch06-certificates.md) | -| `cmd-13` | `acme.sh` | Управление сертификатами с помощью acme.sh | [Глава об управлении сертификатами](./ch06-certificates.md) | -| `cmd-14` | `rm` | Удаление файлов/папок | [Глава о Xray сервере](./ch07-xray-server.md) | -| `cmd-15` | `crontab -e` | Редактирование crontab текущего пользователя | [Глава о Xray сервере](./ch07-xray-server.md) | -| `cmd-16` | `touch` | Создание пустого файла | [Глава о Xray сервере](./ch07-xray-server.md) | -| `cmd-17` | `systemctl` | Базовые команды управления сервисами systemd | [Глава о Xray сервере](./ch07-xray-server.md) | -| `cmd-18` | `reboot` | Перезагрузка Linux | [Глава о Xray сервере](./ch07-xray-server.md) | +| Номер | Название команды | Описание команды | Глава | +| :------: | :------------------ | :------------------------------------------- | :---------------------------------------------------------: | +| `cmd-01` | `apt update` | Обновление списка пакетов | [Глава о удаленном подключении](./ch03-ssh.md) | +| `cmd-02` | `apt upgrade` | Обновление пакетов системы | [Глава о удаленном подключении](./ch03-ssh.md) | +| `cmd-03` | `nano` | Текстовый редактор | [Глава о безопасности](./ch04-security.md) | +| `cmd-04` | `systemctl restart` | Перезапуск сервиса | [Глава о безопасности](./ch04-security.md) | +| `cmd-05` | `adduser` | Добавление пользователя | [Глава о безопасности](./ch04-security.md) | +| `cmd-06` | `apt install` | Установка пакета | [Глава о безопасности](./ch04-security.md) | +| `cmd-07` | `visudo` | Редактор для настройки sudo | [Глава о безопасности](./ch04-security.md) | +| `cmd-08` | `sudo` | Выполнение команды от имени root | [Глава о безопасности](./ch04-security.md) | +| `cmd-09` | `chmod` | Изменение прав доступа к файлу/папке | [Глава о безопасности](./ch04-security.md) | +| `cmd-10` | `mkdir` | Создание папки | [Глава о создании сайта](./ch05-webpage.md) | +| `cmd-11` | `systemctl reload` | Перезагрузка конфигурации сервиса | [Глава о создании сайта](./ch05-webpage.md) | +| `cmd-12` | `wget` | Загрузка файла/страницы из сети | [Глава об управлении сертификатами](./ch06-certificates.md) | +| `cmd-13` | `acme.sh` | Управление сертификатами с помощью acme.sh | [Глава об управлении сертификатами](./ch06-certificates.md) | +| `cmd-14` | `rm` | Удаление файлов/папок | [Глава о Xray сервере](./ch07-xray-server.md) | +| `cmd-15` | `crontab -e` | Редактирование crontab текущего пользователя | [Глава о Xray сервере](./ch07-xray-server.md) | +| `cmd-16` | `touch` | Создание пустого файла | [Глава о Xray сервере](./ch07-xray-server.md) | +| `cmd-17` | `systemctl` | Базовые команды управления сервисами systemd | [Глава о Xray сервере](./ch07-xray-server.md) | +| `cmd-18` | `reboot` | Перезагрузка Linux | [Глава о Xray сервере](./ch07-xray-server.md) | ## 2. Индекс важных конфигурационных файлов Linux -| Номер | Расположение файла | Описание файла | Глава | -| :-------: | :-------------------------------------- | :----------------------------- | :----------------------------------------: | -| `conf-01` | `/etc/ssh/sshd_config` | Конфигурация SSH сервера | [Глава о удаленном подключении](./ch03-ssh.md) | -| `conf-02` | `/etc/nginx/nginx.conf` | Конфигурация Nginx | [Глава о создании сайта](./ch05-webpage.md) | -| `conf-03` | `/etc/apt/sources.list` | Список репозиториев APT | [Глава о Xray сервере](./ch07-xray-server.md) | -| `conf-04` | `/etc/apt/sources.list.d/vpsadmin.list` | Список пользовательских репозиториев APT | [Глава о Xray сервере](./ch07-xray-server.md) | -| `conf-05` | `crontab -e` | Crontab текущего пользователя | [Глава о Xray сервере](./ch07-xray-server.md) | -| `conf-06` | `/etc/sysctl.conf` | Настройки ядра Linux | [Глава о Xray сервере](./ch07-xray-server.md) | -| `conf-07` | `/etc/sysctl.d/vpsadmin.conf` | Пользовательские настройки ядра Linux | [Глава о Xray сервере](./ch07-xray-server.md) | +| Номер | Расположение файла | Описание файла | Глава | +| :-------: | :-------------------------------------- | :--------------------------------------- | :--------------------------------------------: | +| `conf-01` | `/etc/ssh/sshd_config` | Конфигурация SSH сервера | [Глава о удаленном подключении](./ch03-ssh.md) | +| `conf-02` | `/etc/nginx/nginx.conf` | Конфигурация Nginx | [Глава о создании сайта](./ch05-webpage.md) | +| `conf-03` | `/etc/apt/sources.list` | Список репозиториев APT | [Глава о Xray сервере](./ch07-xray-server.md) | +| `conf-04` | `/etc/apt/sources.list.d/vpsadmin.list` | Список пользовательских репозиториев APT | [Глава о Xray сервере](./ch07-xray-server.md) | +| `conf-05` | `crontab -e` | Crontab текущего пользователя | [Глава о Xray сервере](./ch07-xray-server.md) | +| `conf-06` | `/etc/sysctl.conf` | Настройки ядра Linux | [Глава о Xray сервере](./ch07-xray-server.md) | +| `conf-07` | `/etc/sysctl.d/vpsadmin.conf` | Пользовательские настройки ядра Linux | [Глава о Xray сервере](./ch07-xray-server.md) | ## 3. Индекс важных файлов Xray -| Номер | Расположение файла | Описание файла | Глава | -| :-------: | :----------------------------------- | :------------ | :----------------------------------------: | -| `xray-01` | `/usr/local/etc/xray/config.json` | Конфигурация Xray | [Глава о Xray сервере](./ch07-xray-server.md) | -| `xray-02` | `/home/vpsadmin/xray_cert/xray.cert` | TLS сертификат | [Глава о Xray сервере](./ch07-xray-server.md) | -| `xray-03` | `/home/vpsadmin/xray_cert/xray.key` | TLS ключ | [Глава о Xray сервере](./ch07-xray-server.md) | -| `xray-04` | `/home/vpsadmin/xray_log/access.log` | Лог доступа Xray | [Глава о Xray сервере](./ch07-xray-server.md) | -| `xray-05` | `/home/vpsadmin/xray_log/error.log` | Лог ошибок Xray | [Глава о Xray сервере](./ch07-xray-server.md) | +| Номер | Расположение файла | Описание файла | Глава | +| :-------: | :----------------------------------- | :---------------- | :-------------------------------------------: | +| `xray-01` | `/usr/local/etc/xray/config.json` | Конфигурация Xray | [Глава о Xray сервере](./ch07-xray-server.md) | +| `xray-02` | `/home/vpsadmin/xray_cert/xray.cert` | TLS сертификат | [Глава о Xray сервере](./ch07-xray-server.md) | +| `xray-03` | `/home/vpsadmin/xray_cert/xray.key` | TLS ключ | [Глава о Xray сервере](./ch07-xray-server.md) | +| `xray-04` | `/home/vpsadmin/xray_log/access.log` | Лог доступа Xray | [Глава о Xray сервере](./ch07-xray-server.md) | +| `xray-05` | `/home/vpsadmin/xray_log/error.log` | Лог ошибок Xray | [Глава о Xray сервере](./ch07-xray-server.md) | diff --git a/docs/ru/document/level-1/fallbacks-lv1.md b/docs/ru/document/level-1/fallbacks-lv1.md index 713a8ae..2efd126 100644 --- a/docs/ru/document/level-1/fallbacks-lv1.md +++ b/docs/ru/document/level-1/fallbacks-lv1.md @@ -33,33 +33,33 @@ Как объяснить этот фрагмент конфигурации простыми словами? -1. **`Xray` прослушивает порт `[inbound port]` `443`** +1. **`Xray` прослушивает порт `[inbound port]` `443`** - Это означает, что `Xray` отвечает за прослушивание трафика `HTTPS` на порту `443`. + Это означает, что `Xray` отвечает за прослушивание трафика `HTTPS` на порту `443`. -2. **`Xray` использует протокол `[inbound protocol]` `vless`** +2. **`Xray` использует протокол `[inbound protocol]` `vless`** - Только трафик протокола `vless` будет обрабатываться `Xray` и перенаправляться на исходящие модули. + Только трафик протокола `vless` будет обрабатываться `Xray` и перенаправляться на исходящие модули. - ::: warning - **Примечание:** Легковесный протокол `VLESS` был разработан с целью добавления функции fallback в `xray`, `v2fly` и другие ядра, а также для уменьшения избыточных проверок/шифрования. (Конечно, на данный момент протокол `trojan` в `xray` также полностью поддерживает функцию fallback.) - ::: + ::: warning + **Примечание:** Легковесный протокол `VLESS` был разработан с целью добавления функции fallback в `xray`, `v2fly` и другие ядра, а также для уменьшения избыточных проверок/шифрования. (Конечно, на данный момент протокол `trojan` в `xray` также полностью поддерживает функцию fallback.) + ::: -3. **Целевой порт fallback `[fallback dest]` - `8080`** +3. **Целевой порт fallback `[fallback dest]` - `8080`** - После того, как `Xray` получает входящий трафик на порт `443`, трафик протокола `vless` обрабатывается внутренне и перенаправляется на исходящий модуль. Другой трафик, не относящийся к протоколу `vless`, перенаправляется на порт `8080`. + После того, как `Xray` получает входящий трафик на порт `443`, трафик протокола `vless` обрабатывается внутренне и перенаправляется на исходящий модуль. Другой трафик, не относящийся к протоколу `vless`, перенаправляется на порт `8080`. - ::: warning - **Вопрос:** Использовать единственное или множественное число? + ::: warning + **Вопрос:** Использовать единственное или множественное число? - Ответ: Внимательные читатели, должно быть, заметили, что в файле конфигурации используются множественные числа `inbounds`, `fallbacks`, но почему я использую единственное число: `inbound`, `fallback`? + Ответ: Внимательные читатели, должно быть, заметили, что в файле конфигурации используются множественные числа `inbounds`, `fallbacks`, но почему я использую единственное число: `inbound`, `fallback`? - Потому что множественное число в файле конфигурации означает, что `xray` поддерживает N элементов одного уровня (т.е. N входящих, M резервных и т.д.), а в приведенном выше примере анализа используется только один, поэтому я использовал единственное число. - ::: + Потому что множественное число в файле конфигурации означает, что `xray` поддерживает N элементов одного уровня (т.е. N входящих, M резервных и т.д.), а в приведенном выше примере анализа используется только один, поэтому я использовал единственное число. + ::: 4. **Трафик, перенаправляемый на порт `8080`, обрабатывается последующей программой** - В нашем примере порт `8080` обрабатывается `Nginx`, который находит и отображает страницу с маленькой пандой в соответствии с конфигурацией. + В нашем примере порт `8080` обрабатывается `Nginx`, который находит и отображает страницу с маленькой пандой в соответствии с конфигурацией. 5. **В итоге, полный маршрут данных в нашем примере выглядит следующим образом:** @@ -101,29 +101,29 @@ Интерпретировать ответы сервера можно потому, что полный запрос данных на самом деле состоит из множества этапов обмена данными, и на каждом этапе генерируются определенные характеристики программного обеспечения. Проще говоря: - Ответ обычного сайта **обязательно будет** содержать характеристики таких инструментов веб-сервиса и базы данных, как `Nginx`, `Apache`, `MySQL` и т.д. -- Ответ обычного сайта **не будет** содержать характеристики таких прокси-инструментов, как `xray`, `v2fly`, `shadowsocks` и т.д. +- Ответ обычного сайта **не будет** содержать характеристики таких прокси-инструментов, как `xray`, `v2fly`, `shadowsocks` и т.д. -Таким образом, когда мы предоставляем `Xray` функцию **"fallback"** (как в приведенном выше примере, fallback на `Nginx`), любой запрос, используемый для зондирования, приводит к следующему: +Таким образом, когда мы предоставляем `Xray` функцию **"fallback"** (как в приведенном выше примере, fallback на `Nginx`), любой запрос, используемый для зондирования, приводит к следующему: -- Зондирующий трафик не может получить доступ к вашим параметрам `VLESS` и поэтому будет перенаправлен на `Nginx`. +- Зондирующий трафик не может получить доступ к вашим параметрам `VLESS` и поэтому будет перенаправлен на `Nginx`. - Весь зондирующий трафик перенаправляется на `Nginx`, поэтому ответ VPS-сервера **обязательно будет** содержать характеристики `Nginx`. -- Поскольку сам `Xray` не отвечает на зондирующий трафик, ответ VPS **не будет** содержать характеристики `Xray`. +- Поскольку сам `Xray` не отвечает на зондирующий трафик, ответ VPS **не будет** содержать характеристики `Xray`. -Таким образом, функция **"fallback"** решает проблему безопасности **активного зондирования** сервера с точки зрения логики взаимодействия данных. +Таким образом, функция **"fallback"** решает проблему безопасности **активного зондирования** сервера с точки зрения логики взаимодействия данных. ## 4. Полное понимание Fallback (ЧТО, ЗАЧЕМ, КАК `v2`) Почему нужно снова говорить о fallback? Потому что выше мы рассмотрели только первую версию fallback, основанную на "протоколе" и защите от **активного зондирования**. -В процессе постоянного развития и обновления протокола `VLESS` и функции `fallback` командой [RPRX](https://github.com/rprx) постепенно выяснилось, что fallback может быть более гибким и мощным. При условии обеспечения защиты от **активного зондирования** можно в полной мере использовать информацию, содержащуюся в первом пакете данных, для реализации многоэлементного и многоуровневого fallback (например, `path`, `alpn` и т.д.). +В процессе постоянного развития и обновления протокола `VLESS` и функции `fallback` командой [RPRX](https://github.com/rprx) постепенно выяснилось, что fallback может быть более гибким и мощным. При условии обеспечения защиты от **активного зондирования** можно в полной мере использовать информацию, содержащуюся в первом пакете данных, для реализации многоэлементного и многоуровневого fallback (например, `path`, `alpn` и т.д.). -Основываясь на этой концепции разработки, функция **"fallback"** постепенно превратилась в то, чем она является сейчас, - в механизм, реализующий **полную маскировку --> ws-разделение --> многопротокольное и многопараметрическое разделение**. Финальная версия даже полностью заменила функцию разделения, которую раньше выполняли веб-серверы и другие инструменты. А поскольку описанная выше обработка **"fallback/разделения"** выполняется на этапе определения первого пакета за миллисекунды и не связана с какими-либо операциями с данными, она практически не приводит к потерям производительности. +Основываясь на этой концепции разработки, функция **"fallback"** постепенно превратилась в то, чем она является сейчас, - в механизм, реализующий **полную маскировку --> ws-разделение --> многопротокольное и многопараметрическое разделение**. Финальная версия даже полностью заменила функцию разделения, которую раньше выполняли веб-серверы и другие инструменты. А поскольку описанная выше обработка **"fallback/разделения"** выполняется на этапе определения первого пакета за миллисекунды и не связана с какими-либо операциями с данными, она практически не приводит к потерям производительности. **Таким образом, сейчас **полноценная функция "fallback" в `Xray`** обладает следующими свойствами:** -- **Безопасность:** полная защита от атак активного зондирования. -- **Эффективность:** практически полное отсутствие потерь производительности. -- **Гибкость:** гибкое разделение данных, повторное использование часто используемых портов (например, 443). +- **Безопасность:** полная защита от атак активного зондирования. +- **Эффективность:** практически полное отсутствие потерь производительности. +- **Гибкость:** гибкое разделение данных, повторное использование часто используемых портов (например, 443). ::: tip Хотя такой подробный подход может показаться несколько утомительным, только он позволяет в полной мере раскрыть уникальные преимущества **полноценного "fallback"**. @@ -189,22 +189,22 @@ Как объяснить этот фрагмент конфигурации простыми словами? -1. **`Xray` прослушивает порт (`inbound port`) `443`** +1. **`Xray` прослушивает порт (`inbound port`) `443`** - Это означает, что `Xray` отвечает за прослушивание трафика `HTTPS` на порту `443` и использует сертификат `TLS`, указанный в `certificates`, для аутентификации. + Это означает, что `Xray` отвечает за прослушивание трафика `HTTPS` на порту `443` и использует сертификат `TLS`, указанный в `certificates`, для аутентификации. -2. **`Xray` использует протокол (`inbound protocol`) `vless`** +2. **`Xray` использует протокол (`inbound protocol`) `vless`** - Трафик протокола `vless` напрямую передается в `Xray` для дальнейшей обработки. + Трафик протокола `vless` напрямую передается в `Xray` для дальнейшей обработки. 3. **Трафик, не относящийся к протоколу `VLESS`, перенаправляется на 4 различных порта fallback:** - 1. Трафик с `path`, равным `websocket`, перенаправляется на порт `1234` для дальнейшей обработки. - 2. Трафик с `path`, равным `vmesstcp`, перенаправляется на порт `2345` для дальнейшей обработки. - 3. Трафик с `path`, равным `vmessws`, перенаправляется на порт `3456` для дальнейшей обработки. - 4. Весь остальной трафик перенаправляется на порт `1310` для дальнейшей обработки. + 1. Трафик с `path`, равным `websocket`, перенаправляется на порт `1234` для дальнейшей обработки. + 2. Трафик с `path`, равным `vmesstcp`, перенаправляется на порт `2345` для дальнейшей обработки. + 3. Трафик с `path`, равным `vmessws`, перенаправляется на порт `3456` для дальнейшей обработки. + 4. Весь остальной трафик перенаправляется на порт `1310` для дальнейшей обработки. -4. **`xver`, равный `1`, означает, что функция `proxy protocol` включена, и реальный IP-адрес источника будет передан дальше.** +4. **`xver`, равный `1`, означает, что функция `proxy protocol` включена, и реальный IP-адрес источника будет передан дальше.** 5. **Структура fallback показана на рисунке ниже:** @@ -224,7 +224,7 @@ 6. **Куда делся fallback на веб-страницу?** - Верно, внимательные читатели должны были заметить, что `fallback на nginx`, защищающий от **активного зондирования**, исчез!!! Почему? Не опасно ли это? Не волнуйтесь, давайте разбираться дальше: + Верно, внимательные читатели должны были заметить, что `fallback на nginx`, защищающий от **активного зондирования**, исчез!!! Почему? Не опасно ли это? Не волнуйтесь, давайте разбираться дальше: ### 5.2 Фрагмент конфигурации, отвечающий за обработку fallback: @@ -259,10 +259,10 @@ } ``` - Смотрите, произошло чудо, в протоколе `trojan` появился новый `fallbacks`. Как уже говорилось ранее, протокол `trojan` в `xray` также обладает полной функциональностью fallback, поэтому на этом этапе протокол `trojan` может снова выполнять проверку и fallback (это и есть легендарный "fallback в fallback"): + Смотрите, произошло чудо, в протоколе `trojan` появился новый `fallbacks`. Как уже говорилось ранее, протокол `trojan` в `xray` также обладает полной функциональностью fallback, поэтому на этом этапе протокол `trojan` может снова выполнять проверку и fallback (это и есть легендарный "fallback в fallback"): - - Весь трафик протокола `trojan` передается в `Xray` для дальнейшей обработки. - - Весь остальной трафик перенаправляется на порт `80`. **Защита от активного зондирования** реализована! + - Весь трафик протокола `trojan` передается в `Xray` для дальнейшей обработки. + - Весь остальной трафик перенаправляется на порт `80`. **Защита от активного зондирования** реализована! 2. Трафик, перенаправляемый на порт `1234`, на самом деле является `vless+ws`: @@ -386,7 +386,7 @@ ## 6. Заключение -На этом обзор функции **"fallback"** в `Xray` завершен. Надеемся, что эта статья поможет вам лучше понять возможности `Xray`. +На этом обзор функции **"fallback"** в `Xray` завершен. Надеемся, что эта статья поможет вам лучше понять возможности `Xray`. ## 7. Дополнительное задание diff --git a/docs/ru/document/level-1/fallbacks-with-sni.md b/docs/ru/document/level-1/fallbacks-with-sni.md index 8606305..60f9071 100644 --- a/docs/ru/document/level-1/fallbacks-with-sni.md +++ b/docs/ru/document/level-1/fallbacks-with-sni.md @@ -329,5 +329,3 @@ http://blog.example.com:5002 { [^2]: [Proxy Protocol - HAProxy Technologies](https://www.haproxy.com/blog/haproxy/proxy-protocol/) [^3]: [proxy protocol 介绍及 nginx 配置 - 简书](https://www.jianshu.com/p/cc8d592582c9) [^4]: [v2fly-github-io/vless.md at master · rprx/v2fly-github-io](https://github.com/rprx/v2fly-github-io/blob/master/docs/config/protocols/vless.md) - - diff --git a/docs/ru/document/level-1/routing-lv1-part1.md b/docs/ru/document/level-1/routing-lv1-part1.md index 8a0e1bc..611680b 100644 --- a/docs/ru/document/level-1/routing-lv1-part1.md +++ b/docs/ru/document/level-1/routing-lv1-part1.md @@ -14,7 +14,7 @@ Поскольку маршрутизация очень гибкая, чтение только технической документации может вас запутать, поэтому в этой статье мы будем использовать конкретные примеры, чтобы объяснить все пошагово. -::: warning +::: warning Функция маршрутизации настолько гибкая, что примеры в этой статье приведены только для объяснения соответствующих концепций. На практике, пожалуйста, корректируйте их в соответствии с вашими потребностями. ::: @@ -49,7 +49,7 @@ **Входящий трафик (inbound):** это то, как трафик попадает в `Xray`. ::: -Пример конфигурации входящего трафика ниже означает, что данные поступают в `Xray` по протоколу `socks` через порт `10808` с локального адреса `127.0.0.1`. `Xray` присваивает этому входящему трафику имя `inbound-10808` с помощью `[tag]`. +Пример конфигурации входящего трафика ниже означает, что данные поступают в `Xray` по протоколу `socks` через порт `10808` с локального адреса `127.0.0.1`. `Xray` присваивает этому входящему трафику имя `inbound-10808` с помощью `[tag]`. ```json { @@ -73,7 +73,7 @@ **Исходящий трафик (outbound):** это то, как трафик выходит из `Xray`. ::: -Пример конфигурации исходящего трафика ниже означает, что данные отправляются на соответствующий VPS по протоколу `VLESS` с использованием `tcp + xtls` и других параметров. `Xray` присваивает этому исходящему трафику имя `proxy-out-vless` с помощью `[tag]`. +Пример конфигурации исходящего трафика ниже означает, что данные отправляются на соответствующий VPS по протоколу `VLESS` с использованием `tcp + xtls` и других параметров. `Xray` присваивает этому исходящему трафику имя `proxy-out-vless` с помощью `[tag]`. ```json { @@ -117,7 +117,7 @@ **Маршрутизация (routing):** это соединение канала между **входящим** и **исходящим** трафиком с помощью определенного **условия**. ::: -Пример конфигурации маршрутизации ниже означает, что весь трафик, поступающий в `Xray` через входящий трафик с `[tag]="inbound-10808"`, **на 100%** перенаправляется на исходящий трафик с `[tag]="proxy-out-vless"` без разделения или каких-либо других действий. +Пример конфигурации маршрутизации ниже означает, что весь трафик, поступающий в `Xray` через входящий трафик с `[tag]="inbound-10808"`, **на 100%** перенаправляется на исходящий трафик с `[tag]="proxy-out-vless"` без разделения или каких-либо других действий. ```json { @@ -134,7 +134,7 @@ } ``` -Таким образом, мы реализовали очень простое правило, описанное в начале: **входящий трафик от приложения поступает на `Xray` на клиенте, маршрутизируется на исходящий трафик и отправляется на VPS**. +Таким образом, мы реализовали очень простое правило, описанное в начале: **входящий трафик от приложения поступает на `Xray` на клиенте, маршрутизируется на исходящий трафик и отправляется на VPS**. ### 2.4 Анализ параметров конфигурации маршрутизации: критерии фильтрации трафика @@ -146,16 +146,16 @@ 4. `"inboundTag": ["inbound-10808"]` 5. `"outboundTag": "proxy-out-vless"` -Пока оставим `domainStrategy` в стороне и кратко объясним остальные: +Пока оставим `domainStrategy` в стороне и кратко объясним остальные: -| Название параметра | Значение параметра | Описание параметра | -| :---------------- | :----------------- | :------------------ | -| `“rules”` |                                                     | Внутри этого параметра находятся подробные настройки **правил маршрутизации**. | -| `"type"` | `"field"` | На данный момент этот параметр не имеет особого значения, но его нельзя опускать, поэтому просто укажите его. | -| `"inboundTag"` | `["inbound-10808"]` | **Критерий** фильтрации трафика - это **тег входящего трафика**, а **условие** сейчас только одно: **источник входящего трафика - `inbound-10808`**. | -| `"outboundTag"` | `"proxy-out-vless"` | Если указанное выше условие фильтрации выполняется (т.е. входящий трафик имеет `[tag]="inbound-10808"`), `Xray` направит трафик на исходящий трафик с `[tag]="proxy-out-vless"`. | +| Название параметра | Значение параметра | Описание параметра | +| :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `“rules”` |                                                     | Внутри этого параметра находятся подробные настройки **правил маршрутизации**. | +| `"type"` | `"field"` | На данный момент этот параметр не имеет особого значения, но его нельзя опускать, поэтому просто укажите его. | +| `"inboundTag"` | `["inbound-10808"]` | **Критерий** фильтрации трафика - это **тег входящего трафика**, а **условие** сейчас только одно: **источник входящего трафика - `inbound-10808`**. | +| `"outboundTag"` | `"proxy-out-vless"` | Если указанное выше условие фильтрации выполняется (т.е. входящий трафик имеет `[tag]="inbound-10808"`), `Xray` направит трафик на исходящий трафик с `[tag]="proxy-out-vless"`. | -В этом примере у нас есть только один входящий трафик с `"inboundTag" = "inbound-10808"` и один исходящий трафик с `[tag]="proxy-out-vless"`. Поэтому, согласно приведенному выше правилу маршрутизации, весь трафик, поступающий в `Xray` через порт `10808`, **на 100%** соответствует условиям фильтрации, выбирается модулем маршрутизации и перенаправляется на единственный исходящий трафик. +В этом примере у нас есть только один входящий трафик с `"inboundTag" = "inbound-10808"` и один исходящий трафик с `[tag]="proxy-out-vless"`. Поэтому, согласно приведенному выше правилу маршрутизации, весь трафик, поступающий в `Xray` через порт `10808`, **на 100%** соответствует условиям фильтрации, выбирается модулем маршрутизации и перенаправляется на единственный исходящий трафик. Таким образом, **входящий трафик**, **маршрутизация** и **исходящий трафик** уже могут работать вместе. Конечно, в данном случае 100% перенаправление не имеет особого смысла. Давайте посмотрим, какие преимущества может дать такой механизм разделения труда. @@ -229,8 +229,8 @@ Приведенная выше конфигурация означает: 1. Конфигурация исходящего трафика `[proxy-out-vless]` из предыдущего примера остается без изменений. -2. Добавлен протокол **`blackhole` (черная дыра)**. Трафик, отправляемый через этот протокол, попадает в "черную дыру" внутри `Xray` и не может выйти наружу, что фактически блокирует его (`[block]`). -3. Добавлен протокол **`freedom` (свобода)**. Трафик, отправляемый через этот протокол, свободно покидает `Xray` и следует к своему первоначальному адресу, как будто его и не было, что фактически означает прямое подключение (`[direct]`). (Здесь я назвал его `[direct-out]`, чтобы подчеркнуть, что это исходящий трафик). +2. Добавлен протокол **`blackhole` (черная дыра)**. Трафик, отправляемый через этот протокол, попадает в "черную дыру" внутри `Xray` и не может выйти наружу, что фактически блокирует его (`[block]`). +3. Добавлен протокол **`freedom` (свобода)**. Трафик, отправляемый через этот протокол, свободно покидает `Xray` и следует к своему первоначальному адресу, как будто его и не было, что фактически означает прямое подключение (`[direct]`). (Здесь я назвал его `[direct-out]`, чтобы подчеркнуть, что это исходящий трафик). ### 3.3 Маршрутизация @@ -272,7 +272,7 @@ На самом деле, вы, вероятно, уже догадались по названиям этих параметров: - `"domain"`: **критерий** фильтрации трафика в этот раз - это **доменное имя** (а не тег входящего трафика). -- `"geosite"`: `Xray` будет искать **соответствующие доменные имена** в файле `geosite.dat`. +- `"geosite"`: `Xray` будет искать **соответствующие доменные имена** в файле `geosite.dat`. - `"category-ads-all"`: **все рекламные домены**, указанные в этом файле. - `"cn"`: **китайские домены**, указанные в этом файле. - `"geolocation-!cn"`: **не китайские домены**, указанные в этом файле. @@ -296,14 +296,14 @@ Такая модульная структура обеспечивает гораздо большую гибкость, чем традиционный список заблокированных доменов [`GFWList`](https://github.com/gfwlist/gfwlist). Например, вы можете указать, что домены Apple (`geosite:apple`) и домены, связанные с iCloud (`geosite:icloud`), должны проксироваться (`[proxy]`), а домены обновлений Apple (`geosite:apple-update`) должны подключаться напрямую (`[direct]`) для максимальной скорости загрузки. ::: warning -**Внимание:** на данный момент существует несколько вариантов файла `geosite.dat`: +**Внимание:** на данный момент существует несколько вариантов файла `geosite.dat`: -- Изначально, когда `Victoria Raymond` активно занималась проектом `Project V`, она предоставляла соответствующий проект [`domain-list-community`](https://github.com/v2ray/domain-list-community), который использовался для сбора, хранения и классификации часто используемых типов доменов. -- После того, как Виктория внезапно исчезла, и разработка `Project V` приостановилась, сообщество `v2fly` продолжило поддерживать и обновлять свою версию [`domain-list-community`](https://github.com/v2fly/domain-list-community). +- Изначально, когда `Victoria Raymond` активно занималась проектом `Project V`, она предоставляла соответствующий проект [`domain-list-community`](https://github.com/v2ray/domain-list-community), который использовался для сбора, хранения и классификации часто используемых типов доменов. +- После того, как Виктория внезапно исчезла, и разработка `Project V` приостановилась, сообщество `v2fly` продолжило поддерживать и обновлять свою версию [`domain-list-community`](https://github.com/v2fly/domain-list-community). - В то же время [@Loyalsoldier](Loyalsoldier) ведет свой собственный, модифицированный и расширенный файл правил маршрутизации [v2ray-rules-dat](https://github.com/Loyalsoldier/v2ray-rules-dat), который предлагает множество различных вариантов и логики классификации. -- Кроме того, команда `Project X` планирует в будущем создать и поддерживать файл правил маршрутизации [Xray-rules-dat](https://github.com/XTLS/Xray-rules-dat), который будет лучше подходить для использования с `Xray`. ~~(Как видите, папка уже создана, так что это дело времени)~~ +- Кроме того, команда `Project X` планирует в будущем создать и поддерживать файл правил маршрутизации [Xray-rules-dat](https://github.com/XTLS/Xray-rules-dat), который будет лучше подходить для использования с `Xray`. ~~(Как видите, папка уже создана, так что это дело времени)~~ -Вы даже можете создать свой собственный файл `geosite` и подключить его к `Xray`, но это выходит за рамки данной статьи, поэтому мы не будем на этом останавливаться. +Вы даже можете создать свой собственный файл `geosite` и подключить его к `Xray`, но это выходит за рамки данной статьи, поэтому мы не будем на этом останавливаться. Если вы обнаружите, что некоторые домены не классифицированы должным образом, пожалуйста, создайте issue или отправьте pull request в один из перечисленных выше проектов! Поддерживайте сообщество - каждый за всех, и все за одного! @@ -311,19 +311,19 @@ ### 3.6 Секретное оружие: скрытое правило маршрутизации -На самом деле, если вы внимательно посмотрите на приведенные выше правила, то заметите одну проблему: все наши правила определяют только то, **куда** следует перенаправлять входящий трафик, **если он соответствует определенному условию**. Но что произойдет, если файл `geosite.dat` неполный, и наш входящий трафик **не соответствует ни одному условию**? Как поступит `Xray`? +На самом деле, если вы внимательно посмотрите на приведенные выше правила, то заметите одну проблему: все наши правила определяют только то, **куда** следует перенаправлять входящий трафик, **если он соответствует определенному условию**. Но что произойдет, если файл `geosite.dat` неполный, и наш входящий трафик **не соответствует ни одному условию**? Как поступит `Xray`? ::: warning Внимание Если вы думаете, что **если условие не выполняется, то соединение не будет установлено**, то вам нужно подумать еще раз. Соединение будет разорвано только в том случае, если указано правило `[block]`, которое перенаправляет трафик в "черную дыру" (`blackhole`). ::: -На самом деле, чтобы избежать путаницы из-за неполных правил маршрутизации, `Xray` предоставляет скрытое правило: **если входящий трафик не соответствует ни одному условию, он перенаправляется на первый исходящий трафик**. +На самом деле, чтобы избежать путаницы из-за неполных правил маршрутизации, `Xray` предоставляет скрытое правило: **если входящий трафик не соответствует ни одному условию, он перенаправляется на первый исходящий трафик**. Таким образом, ни один трафик не будет потерян. Поэтому важно поместить ваш самый надежный исходящий трафик на **первое место**, чтобы он служил вам верным стражем. ### 3.7 Снова смотрим на карту "трех царств" -Поскольку в предыдущем примере мы поместили `[proxy-out-vless]` на первое место в списке исходящего трафика, при срабатывании скрытого правила трафик будет перенаправляться на удаленный VPS по протоколу `VLESS`. Таким образом, полная логика работы `Xray` выглядит следующим образом: +Поскольку в предыдущем примере мы поместили `[proxy-out-vless]` на первое место в списке исходящего трафика, при срабатывании скрытого правила трафик будет перенаправляться на удаленный VPS по протоколу `VLESS`. Таким образом, полная логика работы `Xray` выглядит следующим образом: ```mermaid graph LR; @@ -359,7 +359,7 @@ Теперь, когда вы знаете о скрытом правиле маршрутизации по умолчанию (**"если входящий трафик не соответствует ни одному условию, он перенаправляется на первый исходящий трафик"**), вы должны понимать, что то, будет ли **проксирование** или **прямое подключение** основным режимом работы, зависит от того, какой исходящий трафик стоит на первом месте! -На предыдущем шаге мы настроили правило **"проксирование по умолчанию, прямой доступ к внутренним сайтам по белому списку"**. Теперь, чтобы получить правило **"прямое подключение по умолчанию, проксирование иностранных сайтов по белому списку"**, нам просто нужно **поместить правило прямого подключения на первое место**. +На предыдущем шаге мы настроили правило **"проксирование по умолчанию, прямой доступ к внутренним сайтам по белому списку"**. Теперь, чтобы получить правило **"прямое подключение по умолчанию, проксирование иностранных сайтов по белому списку"**, нам просто нужно **поместить правило прямого подключения на первое место**. Это очень просто, не правда ли? @@ -413,7 +413,7 @@ В этом и заключается гибкость функции маршрутизации - вы можете свободно менять порядок правил для достижения различных результатов. -На этом мы закончили объяснение того, **как использовать файл `geosite.dat` для разделения сетевого трафика по доменному имени с помощью правил маршрутизации**. +На этом мы закончили объяснение того, **как использовать файл `geosite.dat` для разделения сетевого трафика по доменному имени с помощью правил маршрутизации**. ## 5. Покорение новых высот - Различные условия сопоставления маршрутов diff --git a/docs/ru/document/level-1/routing-lv1-part2.md b/docs/ru/document/level-1/routing-lv1-part2.md index 46fa4ef..2ff1f1c 100644 --- a/docs/ru/document/level-1/routing-lv1-part2.md +++ b/docs/ru/document/level-1/routing-lv1-part2.md @@ -25,28 +25,28 @@ 9. Как настроить принудительное прямое подключение для торрент-трафика, который, хотя и поступает извне, может привести к блокировке VPS при проксировании? 10. ...... -Я говорю, что разделение по домену имеет много недостатков, потому что файл `geosite.dat` содержит только ограниченный набор часто используемых доменов. Другими словами, полагаясь только на него, мы: +Я говорю, что разделение по домену имеет много недостатков, потому что файл `geosite.dat` содержит только ограниченный набор часто используемых доменов. Другими словами, полагаясь только на него, мы: - не сможем сопоставить новые домены, которых нет в файле; - не сможем сопоставить правила на основе IP-адресов; - не сможем сопоставить правила на основе сетевых протоколов. -::: warning -Давайте вспомним, что происходит, когда эти условия не выполняются? Верно, срабатывает скрытое правило маршрутизации: **трафик перенаправляется на первый исходящий трафик**. Это означает, что: +::: warning +Давайте вспомним, что происходит, когда эти условия не выполняются? Верно, срабатывает скрытое правило маршрутизации: **трафик перенаправляется на первый исходящий трафик**. Это означает, что: - если вашим первым исходящим трафиком является `[direct-out]`: **все, что должно идти напрямую, будет работать правильно, а все, что должно проксироваться, будет работать неправильно**; - если вашим первым исходящим трафиком является `[proxy-out-vless]`: **все, что должно проксироваться, будет работать правильно, а все, что должно идти напрямую, будет работать неправильно**. -::: + ::: Поэтому нам нужен способ, который позволит нам получить и то, и другое. Существует ли такой способ? **Конечно, существует!** Нам просто нужны дополнительные **критерии сопоставления** помимо **домена**. -### 5.1 Разделение по определенному домену: `[domain], [full]` и т. д. +### 5.1 Разделение по определенному домену: `[domain], [full]` и т. д. -1. Для сопоставления поддомена, например `a-name.yourdomain.com`, мы используем `full: "a-name.yourdomain.com"`. -2. **Проблемы 1** и **2**, описанные выше, можно решить, указав исходящий трафик `[proxy-out-vless]` для `proxy.yourdomain.com` и исходящий трафик `[direct-out]` для `direct.yourdomain.com`. -3. Для сопоставления всех поддоменов `yourdomain.com` мы используем `domain: "yourdomain.com"`. +1. Для сопоставления поддомена, например `a-name.yourdomain.com`, мы используем `full: "a-name.yourdomain.com"`. +2. **Проблемы 1** и **2**, описанные выше, можно решить, указав исходящий трафик `[proxy-out-vless]` для `proxy.yourdomain.com` и исходящий трафик `[direct-out]` для `direct.yourdomain.com`. +3. Для сопоставления всех поддоменов `yourdomain.com` мы используем `domain: "yourdomain.com"`. 4. Эти два правила могут быть независимыми, чтобы настроить прямое подключение для одних поддоменов и проксирование для других. -5. Кроме того, `[domain]` поддерживает сопоставление с помощью регулярных выражений. Подробнее см. [документацию по модулю маршрутизации](../../../config/base/routing/). +5. Кроме того, `[domain]` поддерживает сопоставление с помощью регулярных выражений. Подробнее см. [документацию по модулю маршрутизации](../../../config/base/routing/). Конфигурация выглядит следующим образом: @@ -80,12 +80,11 @@ ### 5.2 Разделение по IP-адресам из файла: `geoip.dat` -Подобно файлу правил `geosite.dat`, у нас есть файл правил `geoip.dat`, который предоставляет **готовый к использованию список категорий IP-адресов**, чтобы удовлетворить Ваши различные потребности. +Подобно файлу правил `geosite.dat`, у нас есть файл правил `geoip.dat`, который предоставляет **готовый к использованию список категорий IP-адресов**, чтобы удовлетворить Ваши различные потребности. - -1. Чтобы решить **проблемы 3** и **4**, описанные выше, мы используем категорию `geoip:private` и указываем исходящий трафик `[direct-out]`. -2. Чтобы решить **проблему 7**, мы используем категорию `geoip:cn` и указываем исходящий трафик `[direct-out]`. -3. Чтобы решить **проблему 8**, мы используем скрытое правило маршрутизации, поскольку в `geoip` нет категории "не китайские IP-адреса" (потому что это равносильно сбору всех IP-адресов в мире). Другими словами, мы размещаем `[proxy-out-vless]` на первом месте в списке исходящего трафика. +1. Чтобы решить **проблемы 3** и **4**, описанные выше, мы используем категорию `geoip:private` и указываем исходящий трафик `[direct-out]`. +2. Чтобы решить **проблему 7**, мы используем категорию `geoip:cn` и указываем исходящий трафик `[direct-out]`. +3. Чтобы решить **проблему 8**, мы используем скрытое правило маршрутизации, поскольку в `geoip` нет категории "не китайские IP-адреса" (потому что это равносильно сбору всех IP-адресов в мире). Другими словами, мы размещаем `[proxy-out-vless]` на первом месте в списке исходящего трафика. Конфигурация выглядит следующим образом: @@ -113,8 +112,8 @@ ### 5.3 Разделение по определенному IP-адресу -1. Чтобы решить **проблему 5**, мы используем `ip: "223.5.5.5"` и указываем исходящий трафик `[direct-out]`. -2. Чтобы решить **проблему 6**, мы используем `ip: "1.1.1.1"` и указываем исходящий трафик `[proxy-out-vless]`. +1. Чтобы решить **проблему 5**, мы используем `ip: "223.5.5.5"` и указываем исходящий трафик `[direct-out]`. +2. Чтобы решить **проблему 6**, мы используем `ip: "1.1.1.1"` и указываем исходящий трафик `[proxy-out-vless]`. Конфигурация выглядит следующим образом: @@ -140,12 +139,12 @@ } ``` -### 5.4 Разделение по типу протокола: `[protocol]` и т. д. +### 5.4 Разделение по типу протокола: `[protocol]` и т. д. -1. Чтобы решить **проблему 9**, мы используем `"protocol": ["bittorrent"]` и указываем исходящий трафик `[direct-out]`. +1. Чтобы решить **проблему 9**, мы используем `"protocol": ["bittorrent"]` и указываем исходящий трафик `[direct-out]`. ::: tip -Вам нужно включить `sniffing` во входящем прокси, чтобы использовать этот метод разделения. +Вам нужно включить `sniffing` во входящем прокси, чтобы использовать этот метод разделения. ::: ```json @@ -166,7 +165,7 @@ ### 5.5 Разделение по другим критериям -На данный момент мы рассмотрели лишь малую часть возможностей разделения трафика **функции маршрутизации**! Она поддерживает множество других критериев сопоставления! Я перечислю их здесь: +На данный момент мы рассмотрели лишь малую часть возможностей разделения трафика **функции маршрутизации**! Она поддерживает множество других критериев сопоставления! Я перечислю их здесь: Критерии, которые мы уже рассмотрели: @@ -184,7 +183,7 @@ - `user` - `attrs` -Однако, это слишком много информации для уровня 1, поэтому, если вам нужны эти сложные критерии, пожалуйста, внимательно изучите [документацию по модулю маршрутизации](../../config/base/routing/) самостоятельно! Если у вас возникнут вопросы, задавайте их в Telegram-группе! +Однако, это слишком много информации для уровня 1, поэтому, если вам нужны эти сложные критерии, пожалуйста, внимательно изучите [документацию по модулю маршрутизации](../../config/base/routing/) самостоятельно! Если у вас возникнут вопросы, задавайте их в Telegram-группе! ## 6. "Начало новой эры": обзор правил маршрутизации @@ -290,11 +289,11 @@ ``` -Будет ли первым исходящим трафиком `[direct-out]` или `[proxy-out-vless]`, зависит от ваших потребностей. +Будет ли первым исходящим трафиком `[direct-out]` или `[proxy-out-vless]`, зависит от ваших потребностей. ## 7. Распространенные ошибки в конфигурации маршрутизации -Обратите внимание, что каждое правило маршрутизации, которое я привел выше, имеет **только один критерий сопоставления**. Это необходимо для того, чтобы правило работало корректно. Частая ошибка новичков при настройке маршрутизации заключается в том, что они **указывют несколько критериев сопоставления в одном правиле, что делает его недействительным**. +Обратите внимание, что каждое правило маршрутизации, которое я привел выше, имеет **только один критерий сопоставления**. Это необходимо для того, чтобы правило работало корректно. Частая ошибка новичков при настройке маршрутизации заключается в том, что они **указывют несколько критериев сопоставления в одном правиле, что делает его недействительным**. Например, предположим, что нужно настроить следующее: @@ -327,7 +326,7 @@ **В одном правиле все критерии должны выполняться одновременно**, чтобы правило сработало. Логическое отношение — "**И**", а не "**ИЛИ**". ::: -Другими словами, это правило означает: **`Xray` направит трафик на исходящий трафик `[direct-out]` только в том случае, если целевой адрес равен `direct.yourdomain.com` **и** `223.5.5.5` одновременно**. +Другими словами, это правило означает: **`Xray` направит трафик на исходящий трафик `[direct-out]` только в том случае, если целевой адрес равен `direct.yourdomain.com` **и** `223.5.5.5` одновременно**. Очевидно, что один адрес не может быть равен двум разным значениям одновременно, поэтому это не только невыполнимое правило, но и не имеет ничего общего с нашей первоначальной целью. @@ -361,11 +360,11 @@ > Секретный проход для преобразования `[domain]` в `[ip]`: `domainStrategy` -В пункте 5.4 мы рассмотрели различные **критерии** для сопоставления трафика, среди которых были **домен** `[domain]` и **IP-адрес** `[IP]`. +В пункте 5.4 мы рассмотрели различные **критерии** для сопоставления трафика, среди которых были **домен** `[domain]` и **IP-адрес** `[IP]`. -Если вы знакомы с принципами работы DNS, то знаете, что при обращении к домену `[domain]` сначала нужно отправить запрос на DNS-сервер, чтобы получить IP-адрес `[IP]`, соответствующий домену, а затем отправить фактический запрос на этот IP-адрес. +Если вы знакомы с принципами работы DNS, то знаете, что при обращении к домену `[domain]` сначала нужно отправить запрос на DNS-сервер, чтобы получить IP-адрес `[IP]`, соответствующий домену, а затем отправить фактический запрос на этот IP-адрес. -Поэтому у `Xray` есть два шанса определить тип входящего запроса к домену. Использовать ли эти два шанса, решает параметр `domainStrategy`. Он имеет три значения: +Поэтому у `Xray` есть два шанса определить тип входящего запроса к домену. Использовать ли эти два шанса, решает параметр `domainStrategy`. Он имеет три значения: - `AsIs` - `IPIfNonMatch` @@ -380,10 +379,10 @@ Проще говоря, **"сопоставлять только по домену"**. ::: tip -`AsIs` на самом деле означает **"как есть, без изменений"**. Описание 🍉-sensei не совсем точное. +`AsIs` на самом деле означает **"как есть, без изменений"**. Описание 🍉-sensei не совсем точное. ::: -В этом режиме вся обработка выполняется внутри `Xray` без обмена данными с внешним миром, поэтому скорость максимальна. Стратегия обработки несопоставимых доменов также ясна: как уже говорилось ранее, они автоматически перенаправляются на первый исходящий трафик. Поэтому это **наиболее рекомендуемая стратегия** для обычного использования функции маршрутизации. +В этом режиме вся обработка выполняется внутри `Xray` без обмена данными с внешним миром, поэтому скорость максимальна. Стратегия обработки несопоставимых доменов также ясна: как уже говорилось ранее, они автоматически перенаправляются на первый исходящий трафик. Поэтому это **наиболее рекомендуемая стратегия** для обычного использования функции маршрутизации. ### 8.2 Стратегия домена: `"IPIfNonMatch"` @@ -391,45 +390,42 @@ Проще говоря, **"сначала сопоставить целевой адрес со всеми правилами, а если совпадений не найдено, то получить IP-адрес через DNS и снова сопоставить его со всеми правилами"**. -В этом режиме домены, не сопоставленные ни с одним правилом, будут проходить через DNS-запрос и второй этап сопоставления правил, что займет больше времени, чем в режиме `AsIs`. Поэтому это **не самая рекомендуемая стратегия**. +В этом режиме домены, не сопоставленные ни с одним правилом, будут проходить через DNS-запрос и второй этап сопоставления правил, что займет больше времени, чем в режиме `AsIs`. Поэтому это **не самая рекомендуемая стратегия**. ### 8.3 Стратегия домена: `"IPOnDemand"` "Demand IP" означает **"запрашивать IP-адрес"**. -Проще говоря, **"если в правилах маршрутизации есть правила на основе IP-адреса, то все запросы на основе домена `[domain]` будут преобразованы в IP-адреса `[IP]` и сопоставлены с правилами на основе IP-адреса"**. +Проще говоря, **"если в правилах маршрутизации есть правила на основе IP-адреса, то все запросы на основе домена `[domain]` будут преобразованы в IP-адреса `[IP]` и сопоставлены с правилами на основе IP-адреса"**. -В этом режиме все запросы к доменам будут проходить через DNS-запрос, поэтому первый запрос будет медленным. Хотя благодаря механизму кэширования DNS в `Xray` последующие запросы к тому же домену будут быстрыми, в целом это **не самая рекомендуемая стратегия**. +В этом режиме все запросы к доменам будут проходить через DNS-запрос, поэтому первый запрос будет медленным. Хотя благодаря механизму кэширования DNS в `Xray` последующие запросы к тому же домену будут быстрыми, в целом это **не самая рекомендуемая стратегия**. -::: warning -`domainStrategy` действует **только для доменов**, не путайте! +::: warning +`domainStrategy` действует **только для доменов**, не путайте! ::: ## 9. Задание для размышления До сих пор мы рассматривали логику конфигурации **маршрутизации** на основе **одного входящего** и **одного исходящего** трафика. -Но, как вы знаете, `Xray` поддерживает несколько портов и протоколов. Что, если я спрошу вас: +Но, как вы знаете, `Xray` поддерживает несколько портов и протоколов. Что, если я спрошу вас: -1. Я хочу, чтобы протокол `VLESS` перенаправлял мой обычный веб-трафик и трафик приложений на высокоскоростной сервер в США. -2. Я хочу, чтобы протокол `trojan` перенаправлял весь мой трафик Netflix на сервер в Японии, чтобы разблокировать все аниме. -3. Я хочу, чтобы протокол `shadowsocks` перенаправлял весь мой игровой трафик на сервер в Гонконге для минимальной задержки. -4. Я хочу, чтобы был отдельный порт, который перенаправлял бы весь трафик `telegram` на VPS. +1. Я хочу, чтобы протокол `VLESS` перенаправлял мой обычный веб-трафик и трафик приложений на высокоскоростной сервер в США. +2. Я хочу, чтобы протокол `trojan` перенаправлял весь мой трафик Netflix на сервер в Японии, чтобы разблокировать все аниме. +3. Я хочу, чтобы протокол `shadowsocks` перенаправлял весь мой игровой трафик на сервер в Гонконге для минимальной задержки. +4. Я хочу, чтобы был отдельный порт, который перенаправлял бы весь трафик `telegram` на VPS. 5. Я хочу, чтобы был отдельный порт, который перенаправлял бы весь торрент-трафик на мощный сервер в Европе. 6. Я хочу...... Можно ли реализовать эти сценарии с помощью **функции маршрутизации**? -Ответ, конечно же, **да**! Однако, это выходит за рамки уровня 1, поэтому я оставлю это вам для самостоятельного изучения! +Ответ, конечно же, **да**! Однако, это выходит за рамки уровня 1, поэтому я оставлю это вам для самостоятельного изучения! ## 10. Заключение -На этом обзор **функции маршрутизации** в `Xray` завершен. Надеюсь, эта статья помогла вам лучше понять гибкость `Xray`. +На этом обзор **функции маршрутизации** в `Xray` завершен. Надеюсь, эта статья помогла вам лучше понять гибкость `Xray`. ## 11. Примечания - Теперь вы можете перечитать раздел [Маршрутизация](../../config/routing.md) и посмотреть, стало ли вам что-то понятнее. - 🍉🍉🍉🍉🍉 :D - - - diff --git a/docs/ru/document/level-1/work.md b/docs/ru/document/level-1/work.md index 38dc5ed..d592597 100644 --- a/docs/ru/document/level-1/work.md +++ b/docs/ru/document/level-1/work.md @@ -31,7 +31,7 @@ D --> F(Внутренний сайт); ## Принцип работы -Перед настройкой Xray давайте рассмотрим, как он работает. Ниже представлена схема внутреннего устройства одного процесса Xray. Несколько процессов Xray работают независимо друг от друга. +Перед настройкой Xray давайте рассмотрим, как он работает. Ниже представлена схема внутреннего устройства одного процесса Xray. Несколько процессов Xray работают независимо друг от друга. ```mermaid graph LR; @@ -52,5 +52,3 @@ D --> B4(outbound); - Исходящее соединение отвечает за отправку данных на сервер, например, на другой Xray, работающий на другом хосте. - При наличии нескольких исходящих соединений можно настроить маршрутизацию (Routing) для указания, какое исходящее соединение должно использоваться для определенного типа трафика. - При необходимости маршрутизатор обращается к DNS для получения дополнительной информации для принятия решения. - - diff --git a/docs/ru/document/level-2/README.md b/docs/ru/document/level-2/README.md index 1c94b38..12437ac 100644 --- a/docs/ru/document/level-2/README.md +++ b/docs/ru/document/level-2/README.md @@ -1,4 +1,4 @@ -# Продвинутая документация +# Продвинутая документация **В этом разделе представлены советы и рекомендации по использованию Xray для продвинутых пользователей. Если вы уже знакомы с Xray, то информация, представленная здесь, поможет вам использовать Xray по максимуму.** @@ -33,5 +33,3 @@ [Статистика трафика Xray](./traffic_stats.md) от a [@yuhan6665](https://github.com/yuhan6665) Статистика трафика и скрипты для Xray. - - diff --git a/docs/ru/document/level-2/iptables_gid.md b/docs/ru/document/level-2/iptables_gid.md index 1a5ee96..6cb8488 100644 --- a/docs/ru/document/level-2/iptables_gid.md +++ b/docs/ru/document/level-2/iptables_gid.md @@ -4,7 +4,7 @@ title: GID Прозрачное проксирование # Прозрачное проксирование: Исключение трафика Xray с помощью GID -В существующих русскоязычных руководствах по прозрачному проксированию с использованием iptables (**[Новое руководство по V2Ray на русском языке - Прозрачное проксирование](https://guide.v2fly.org/app/transparent_proxy.html)**, **[Новое руководство по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html)**, **[Руководство по настройке прозрачного проксирования (TProxy)](./tproxy)**) исключение трафика Xray осуществляется с помощью меток. Исходящий трафик Xray помечается, а затем с помощью правил iptables трафик с соответствующей меткой направляется напрямую, минуя Xray и предотвращая зацикливание. +В существующих русскоязычных руководствах по прозрачному проксированию с использованием iptables (**[Новое руководство по V2Ray на русском языке - Прозрачное проксирование](https://guide.v2fly.org/app/transparent_proxy.html)**, **[Новое руководство по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html)**, **[Руководство по настройке прозрачного проксирования (TProxy)](./tproxy)**) исключение трафика Xray осуществляется с помощью меток. Исходящий трафик Xray помечается, а затем с помощью правил iptables трафик с соответствующей меткой направляется напрямую, минуя Xray и предотвращая зацикливание. У такого подхода есть несколько недостатков: @@ -237,4 +237,3 @@ ip6tables -t mangle -A XRAY6_MASK -j MARK --set-mark 1 ip6tables -t mangle -A OUTPUT -p tcp -j XRAY6_MASK ip6tables -t mangle -A OUTPUT -p udp -j XRAY6_MASK ``` - diff --git a/docs/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md b/docs/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md index 2f64272..70412f3 100644 --- a/docs/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md +++ b/docs/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md @@ -126,10 +126,7 @@ WantedBy=multi-user.target }, "sniffing": { "enabled": true, - "destOverride": [ - "http", - "tls" - ] + "destOverride": ["http", "tls"] } } ], @@ -153,12 +150,8 @@ WantedBy=multi-user.target "1.1.1.1", { "address": "119.29.29.29", - "domains": [ - "geosite:cn" - ], - "expectIP": [ - "geoip:cn" - ] + "domains": ["geosite:cn"], + "expectIP": ["geoip:cn"] } ], "disableFallback": true, @@ -175,10 +168,7 @@ WantedBy=multi-user.target }, "sniffing": { "enabled": true, - "destOverride": [ - "http", - "tls" - ] + "destOverride": ["http", "tls"] }, "streamSettings": { "sockopt": { @@ -194,10 +184,7 @@ WantedBy=multi-user.target "protocol": "http", "sniffing": { "enabled": true, - "destOverride": [ - "http", - "tls" - ] + "destOverride": ["http", "tls"] } } ], @@ -251,9 +238,7 @@ WantedBy=multi-user.target "rules": [ { "type": "field", - "domain": [ - "geosite:category-ads-all" - ], + "domain": ["geosite:category-ads-all"], "outboundTag": "block" }, { @@ -264,37 +249,27 @@ WantedBy=multi-user.target }, { "type": "field", - "ip": [ - "1.1.1.1" - ], + "ip": ["1.1.1.1"], "outboundTag": "proxy" }, { "type": "field", - "domain": [ - "geosite:cn" - ], + "domain": ["geosite:cn"], "outboundTag": "direct" }, { "type": "field", - "protocol": [ - "bittorrent" - ], + "protocol": ["bittorrent"], "outboundTag": "direct" }, { "type": "field", - "ip": [ - "geoip:private" - ], + "ip": ["geoip:private"], "outboundTag": "direct" }, { "type": "field", - "inboundTag": [ - "tproxy-in" - ], + "inboundTag": ["tproxy-in"], "outboundTag": "nginxtls" } ] diff --git a/docs/ru/document/level-2/redirect.md b/docs/ru/document/level-2/redirect.md index b43b88e..f0f7f85 100644 --- a/docs/ru/document/level-2/redirect.md +++ b/docs/ru/document/level-2/redirect.md @@ -8,11 +8,11 @@ title: Перенаправление исходящего трафика ## Введение -Я видел много прокси-серверов или VPN, которые перехватывают весь трафик, что приводит к неработоспособности Xray, если он установлен одновременно с ними. Многие руководства, которые я находил, предлагали решать эту проблему путем разделения трафика на основе таблиц маршрутизации CIDR. Это не очень элегантно, и если я хочу иметь возможность гибко переключаться между маршрутами и реализовывать разделение трафика по требованию, то есть ли лучший способ? Да, есть! +Я видел много прокси-серверов или VPN, которые перехватывают весь трафик, что приводит к неработоспособности Xray, если он установлен одновременно с ними. Многие руководства, которые я находил, предлагали решать эту проблему путем разделения трафика на основе таблиц маршрутизации CIDR. Это не очень элегантно, и если я хочу иметь возможность гибко переключаться между маршрутами и реализовывать разделение трафика по требованию, то есть ли лучший способ? Да, есть! С помощью fwmark или sendThrough/sockopt.interface в Xray и простой настройки таблицы маршрутизации можно добиться следующего: -1. Xray может направлять трафик с определенным тегом, доменным именем и т.д. через определенный интерфейс. Если ваш интерфейс поддерживает dual-stack, вы можете указать IPv4 или IPv6. +1. Xray может направлять трафик с определенным тегом, доменным именем и т.д. через определенный интерфейс. Если ваш интерфейс поддерживает dual-stack, вы можете указать IPv4 или IPv6. 2. Остальной трафик будет идти через исходный интерфейс IPv4 или IPv6. Вот как это настроить (на примере Debian 10): @@ -40,6 +40,7 @@ Endpoint = : ``` Добавьте следующие строки в раздел `[Interface]`: + ```ini Table =
### fwmark @@ -58,13 +59,14 @@ PostDown = ip rule del oif %i lookup
PreUp = ip -6 rule add oif %i lookup
PostDown = ip -6 rule del oif %i lookup
``` + ::: tip + - В этом конфигурационном файле объединены `fwmark`, `sendThrough` и `sockopt.interface`. -- Подключения, поступающие на этот интерфейс `%i`, с этого IP-адреса `` или помеченные `fwmark` как ``, +- Подключения, поступающие на этот интерфейс `%i`, с этого IP-адреса `` или помеченные `fwmark` как ``, - будут перенаправлены через WireGuard. - `%i` - это заполнитель в конфигурационном файле WireGuard, который будет заменен на имя интерфейса во время запуска. -::: - + ::: Сохраните файл. @@ -238,9 +240,8 @@ systemctl start wg-quick@wg0 ## Послесловие -Цель этой статьи - показать, как избежать ненужных затрат трафика, переложив функции маршрутизации и разделения трафика на Xray. Это позволяет избежать утомительной работы по обслуживанию таблиц маршрутизации и повышает технический уровень. +Цель этой статьи - показать, как избежать ненужных затрат трафика, переложив функции маршрутизации и разделения трафика на Xray. Это позволяет избежать утомительной работы по обслуживанию таблиц маршрутизации и повышает технический уровень. ## Благодарности [XTLS/Xray-core](https://github.com/XTLS/Xray-core); [v2fly/v2ray-core](https://github.com/v2fly/v2ray-core); [WireGuard](https://www.wireguard.com/); [@p3terx](https://p3terx.com/); @w; @Hiram; @Luminous; @Ln; @JackChou; - diff --git a/docs/ru/document/level-2/tproxy.md b/docs/ru/document/level-2/tproxy.md index 10c5941..0159271 100644 --- a/docs/ru/document/level-2/tproxy.md +++ b/docs/ru/document/level-2/tproxy.md @@ -6,16 +6,16 @@ title: Прозрачное проксирование TProxy Эта конфигурация основана на [Новом руководстве по V2Ray на русском языке - Прозрачное проксирование (TPROXY)](https://guide.v2fly.org/app/tproxy.html) с добавлением новых функций Xray, использованием схемы VLESS + XTLS Vision и изменением режима разделения трафика с проксирования по умолчанию на прямое подключение по умолчанию. Пользователи должны настроить конфигурацию в соответствии со своими потребностями. -Все конфигурации, представленные в этой статье, были успешно протестированы в средах Raspberry Pi 2B и Ubuntu 20.04. При использовании в других средах вам может потребоваться изменить конфигурацию. +Все конфигурации, представленные в этой статье, были успешно протестированы в средах Raspberry Pi 2B и Ubuntu 20.04. При использовании в других средах вам может потребоваться изменить конфигурацию. ## Перед началом работы Убедитесь, что на вашем устройстве есть доступное сетевое подключение, сервер настроен, а клиент установлен. -Обратите внимание, что многие руководства по настройке прозрачного проксирования предлагают включить переадресацию IP в системе Linux, но это может привести к снижению производительности Splice. Дополнительную информацию см. в статье [Расследование снижения производительности Splice до уровня ниже, чем Direct](https://github.com/XTLS/Xray-core/discussions/59). +Обратите внимание, что многие руководства по настройке прозрачного проксирования предлагают включить переадресацию IP в системе Linux, но это может привести к снижению производительности Splice. Дополнительную информацию см. в статье [Расследование снижения производительности Splice до уровня ниже, чем Direct](https://github.com/XTLS/Xray-core/discussions/59). -Хочу добавить, что многие руководства по настройке прозрачного проксирования используют Netfilter для разделения трафика, отправляя прямой трафик напрямую, минуя Xray. В этом случае необходимо включить переадресацию IP. -Другие руководства, например это, направляют весь трафик через Xray, где он разделяется модулем маршрутизации Xray. В этом случае переадресацию IP включать не нужно. +Хочу добавить, что многие руководства по настройке прозрачного проксирования используют Netfilter для разделения трафика, отправляя прямой трафик напрямую, минуя Xray. В этом случае необходимо включить переадресацию IP. +Другие руководства, например это, направляют весь трафик через Xray, где он разделяется модулем маршрутизации Xray. В этом случае переадресацию IP включать не нужно. ## Настройка Xray @@ -280,7 +280,7 @@ iptables -t mangle -A OUTPUT -j XRAY_SELF -После завершения настройки измените шлюз по умолчанию на других устройствах в локальной сети на IP-адрес этого устройства, и они смогут использовать VPN. После того, как вы проверите, что все работает правильно на других хостах и на самом устройстве, перейдите к следующему шагу. +После завершения настройки измените шлюз по умолчанию на других устройствах в локальной сети на IP-адрес этого устройства, и они смогут использовать VPN. После того, как вы проверите, что все работает правильно на других хостах и на самом устройстве, перейдите к следующему шагу. ## Настройка автозагрузки и сохранения конфигурации @@ -353,5 +353,3 @@ WantedBy=multi-user.target - - diff --git a/docs/ru/document/level-2/tproxy_ipv4_and_ipv6.md b/docs/ru/document/level-2/tproxy_ipv4_and_ipv6.md index ec31505..6519c3d 100644 --- a/docs/ru/document/level-2/tproxy_ipv4_and_ipv6.md +++ b/docs/ru/document/level-2/tproxy_ipv4_and_ipv6.md @@ -19,11 +19,11 @@ title: Прозрачное проксирование TProxy (ipv4 и ipv6) В данной статье используется сетевая структура с пограничным маршрутизатором с одним интерфейсом. -Все конфигурации, представленные в этой статье, были успешно протестированы в среде Arch Linux (Kernel: 6.0.10). В других средах настройка аналогична. +Все конфигурации, представленные в этой статье, были успешно протестированы в среде Arch Linux (Kernel: 6.0.10). В других средах настройка аналогична. Убедитесь, что установлены необходимые программы: `# sudo apt install iptables ip6tables` или `# sudo apt install nftables`. -Если на пограничном маршрутизаторе не установлена программа Xray, можно вручную скачать соответствующую версию Xray, например [Xray-linux-64.zip](https://github.com/XTLS/Xray-core/releases/download/v1.7.0/Xray-linux-64.zip), а затем скопировать файл [install-release.sh](https://github.com/XTLS/Xray-install/blob/main/install-release.sh) на пограничный маршрутизатор. Предоставьте файлу права на выполнение `# chmod 700 install-release.sh` и запустите его с помощью команды `# ./install-release.sh --local Xray-linux-64.zip`. Следуйте инструкциям для локальной установки. +Если на пограничном маршрутизаторе не установлена программа Xray, можно вручную скачать соответствующую версию Xray, например [Xray-linux-64.zip](https://github.com/XTLS/Xray-core/releases/download/v1.7.0/Xray-linux-64.zip), а затем скопировать файл [install-release.sh](https://github.com/XTLS/Xray-install/blob/main/install-release.sh) на пограничный маршрутизатор. Предоставьте файлу права на выполнение `# chmod 700 install-release.sh` и запустите его с помощью команды `# ./install-release.sh --local Xray-linux-64.zip`. Следуйте инструкциям для локальной установки. ## Настройка Xray @@ -68,8 +68,8 @@ title: Прозрачное проксирование TProxy (ipv4 и ipv6) ], "outbounds": [ { - // Это исходящее подключение по умолчанию. Если модуль маршрутизации (routing) не найдет подходящего правила, трафик будет направлен через этот выходной узел proxy. - // Если вы хотите, чтобы трафик в Китай направлялся напрямую, переместите исходящее подключение direct на первое место в списке outbound. + // Это исходящее подключение по умолчанию. Если модуль маршрутизации (routing) не найдет подходящего правила, трафик будет направлен через этот выходной узел proxy. + // Если вы хотите, чтобы трафик в Китай направлялся напрямую, переместите исходящее подключение direct на первое место в списке outbound. // Если вы не понимаете, что это значит, просто пропустите этот комментарий. "tag": "proxy", "protocol": "vless", @@ -80,7 +80,7 @@ title: Прозрачное проксирование TProxy (ipv4 и ipv6) "port": 443, "users": [ { - "id": "uuid", // Введите UUID, который можно сгенерировать, выполнив команду xray uuid в терминале. + "id": "uuid", // Введите UUID, который можно сгенерировать, выполнив команду xray uuid в терминале. // Также поддерживаются произвольные строки (https://xtls.github.io/config/inbounds/vless.html#clientobject). "encryption": "none", "flow": "xtls-rprx-vision" @@ -138,8 +138,8 @@ title: Прозрачное проксирование TProxy (ipv4 и ipv6) "hosts": { "domain:googleapis.cn": "googleapis.com", "dns.google": "8.8.8.8", - "yourdomain.domain": "your VPS IP" // Если в разделе address исходящего подключения proxy указано доменное имя: - // для проксирования через IPv4 укажите IPv4-адрес VPS, для проксирования через IPv6 укажите IPv6-адрес VPS. + "yourdomain.domain": "your VPS IP" // Если в разделе address исходящего подключения proxy указано доменное имя: + // для проксирования через IPv4 укажите IPv4-адрес VPS, для проксирования через IPv6 укажите IPv6-адрес VPS. // Если в разделе address исходящего подключения proxy указан IP-адрес, эту строку можно удалить. }, "servers": [ @@ -227,7 +227,7 @@ title: Прозрачное проксирование TProxy (ipv4 и ipv6) "domainStrategy": "IPIfNonMatch", "rules": [ { - // Блокировка китайских IP-адресов для повышения безопасности. + // Блокировка китайских IP-адресов для повышения безопасности. // Также можно направить китайский трафик через Warp, см. https://xtls.github.io/document/level-2/warp.html "type": "field", "ip": ["geoip:cn"], @@ -298,9 +298,9 @@ ip -6 rule add fwmark 1 table 106 ip -6 route add local ::/0 dev lo table 106 # Прямое подключение через основной маршрутизатор -ip route add default via 192.168.31.1 # Укажите IPv4-адрес основного маршрутизатора. +ip route add default via 192.168.31.1 # Укажите IPv4-адрес основного маршрутизатора. # Если используется метод 1 для настройки доступа к интернету на устройствах локальной сети, эту команду можно не выполнять. -ip -6 route add default via fd00:6868:6868::1 # Укажите IPv6-адрес основного маршрутизатора. +ip -6 route add default via fd00:6868:6868::1 # Укажите IPv6-адрес основного маршрутизатора. # Если используется метод 1 для настройки доступа к интернету на устройствах локальной сети, эту команду можно не выполнять. ``` @@ -312,13 +312,13 @@ ip -6 route add default via fd00:6868:6868::1 # Укажите IPv6-адрес ::: tip О прямом подключении через основной маршрутизатор -Выполните команду `ip route show` на пограничном маршрутизаторе. Если используется метод 1, то после `default via` должен быть указан IP-адрес основного маршрутизатора, ничего менять не нужно. -Если используется метод 2, то после `default via` должен быть указан IP-адрес пограничного маршрутизатора. В этом случае DNS-запросы для сайтов, к которым должно быть установлено прямое подключение, будут зацикливаться, что приведет к невозможности доступа к этим сайтам. Поэтому необходимо указать IP-адрес основного маршрутизатора. +Выполните команду `ip route show` на пограничном маршрутизаторе. Если используется метод 1, то после `default via` должен быть указан IP-адрес основного маршрутизатора, ничего менять не нужно. +Если используется метод 2, то после `default via` должен быть указан IP-адрес пограничного маршрутизатора. В этом случае DNS-запросы для сайтов, к которым должно быть установлено прямое подключение, будут зацикливаться, что приведет к невозможности доступа к этим сайтам. Поэтому необходимо указать IP-адрес основного маршрутизатора. ::: Если в настройках маршрутизатора указан пограничный маршрутизатор в качестве шлюза по умолчанию (то есть используется метод 2 для настройки доступа к интернету на устройствах локальной сети), то необходимо выполнить команду `# Прямое подключение через основной маршрутизатор`. Кроме настройки через командную строку iproute2, можно использовать dhcpcd или systemctl-network для настройки статического IP-адреса. -В качестве примера рассмотрим dhcpcd. Отредактируйте файл `/etc/dhcpcd.conf` и добавьте следующие строки в конец файла. Измените IP-адреса в соответствии с вашей конфигурацией. +В качестве примера рассмотрим dhcpcd. Отредактируйте файл `/etc/dhcpcd.conf` и добавьте следующие строки в конец файла. Измените IP-адреса в соответствии с вашей конфигурацией. `interface` - это имя сетевого интерфейса или беспроводного устройства, которое можно узнать с помощью команды `# ip link show`. ``` @@ -546,7 +546,7 @@ WantedBy=multi-user.target Обратите внимание на IP-адрес основного маршрутизатора и измените его в соответствии с вашей конфигурацией. -Команда `ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'` гарантирует, что команды будут выполнены только после получения IP-адреса, иначе могут возникнуть странные ошибки. IP-адрес - это адрес основного маршрутизатора, измените его в соответствии с вашей конфигурацией. +Команда `ExecStartPre=/bin/sh -c 'until ping -c1 192.168.31.1; do sleep 1; done;'` гарантирует, что команды будут выполнены только после получения IP-адреса, иначе могут возникнуть странные ошибки. IP-адрес - это адрес основного маршрутизатора, измените его в соответствии с вашей конфигурацией. ::: ::: warning Внимание @@ -556,7 +556,7 @@ WantedBy=multi-user.target ## Настройка доступа к интернету на устройствах локальной сети -Предположим, что IPv4- и IPv6-адреса пограничного маршрутизатора - `192.168.31.100` и `fd00:6868:6868::8866` соответственно. +Предположим, что IPv4- и IPv6-адреса пограничного маршрутизатора - `192.168.31.100` и `fd00:6868:6868::8866` соответственно. IP-адреса пограничного маршрутизатора можно узнать с помощью команды `ip add`. ### Метод 1 @@ -594,4 +594,4 @@ IP-адреса пограничного маршрутизатора можно ## Заключение В настоящее время IPv6 еще не получил широкого распространения, и 99% трафика, к которому мы обращаемся, по-прежнему приходится на IPv4. -Многие провайдеры VPS \ No newline at end of file +Многие провайдеры VPS diff --git a/docs/ru/document/level-2/traffic_stats.md b/docs/ru/document/level-2/traffic_stats.md index 440c413..6bbabcf 100644 --- a/docs/ru/document/level-2/traffic_stats.md +++ b/docs/ru/document/level-2/traffic_stats.md @@ -10,7 +10,7 @@ title: Статистика трафика ## Просмотр статистики трафика Способ настройки такой же, как и для v2fly. -Просмотр статистики трафика - одна из функций командной строки Xray. Порт api dokodemo-door, указанный в конфигурации, - это порт, используемый в параметре `--server`. +Просмотр статистики трафика - одна из функций командной строки Xray. Порт api dokodemo-door, указанный в конфигурации, - это порт, используемый в параметре `--server`. ```bash xray api statsquery --server=127.0.0.1:10085 # Просмотр всей статистики трафика @@ -118,5 +118,3 @@ echo "-------------User------------" print_sum "$DATA" "user" echo "-----------------------------" ``` - - diff --git a/docs/ru/document/level-2/transparent_proxy/transparent_proxy.md b/docs/ru/document/level-2/transparent_proxy/transparent_proxy.md index 3065e68..24c090b 100644 --- a/docs/ru/document/level-2/transparent_proxy/transparent_proxy.md +++ b/docs/ru/document/level-2/transparent_proxy/transparent_proxy.md @@ -85,6 +85,7 @@ Linux использует `Netfilter` для управления сетью, 4. Умение писать конфигурационные файлы клиента в формате json или, по крайней мере, понимать их. ### Предварительная подготовка + ::: warning Перед началом работы не забудьте включить пересылку пакетов ipv4 в Linux с помощью команды `sysctl -w net.ipv4.ip_forward=1` ::: diff --git a/docs/ru/document/level-2/warp.md b/docs/ru/document/level-2/warp.md index 48f6d2f..37766e1 100644 --- a/docs/ru/document/level-2/warp.md +++ b/docs/ru/document/level-2/warp.md @@ -4,23 +4,25 @@ title: Повышение безопасности проксирования с # Повышение безопасности проксирования с помощью Cloudflare Warp -В Xray (1.6.5+) добавлен исходящий WireGuard. Хотя это увеличивает размер ядра из-за дополнительных кода и зависимостей, мы считаем, что это важная новая функция по трем причинам: +В Xray (1.6.5+) добавлен исходящий WireGuard. Хотя это увеличивает размер ядра из-за дополнительных кода и зависимостей, мы считаем, что это важная новая функция по трем причинам: 1. Из недавних обсуждений и [экспериментов](https://github.com/net4people/bbs/issues/129#issuecomment-1308102504) мы знаем, что проксирование трафика в Китай небезопасно. - Одним из способов решения этой проблемы является перенаправление трафика в Китай в черный дыры. - Недостаток этого метода заключается в том, что geosite и geoip обновляются нерегулярно, и новички могут не знать, как правильно настроить разделение трафика на клиенте, в результате чего трафик попадает в черный дыры, что снижает удобство использования. - В этом случае мы можем просто перенаправить трафик в Китай через Cloudflare Warp, что обеспечит такую же безопасность без ущерба для удобства использования. + Одним из способов решения этой проблемы является перенаправление трафика в Китай в черный дыры. + Недостаток этого метода заключается в том, что geosite и geoip обновляются нерегулярно, и новички могут не знать, как правильно настроить разделение трафика на клиенте, в результате чего трафик попадает в черный дыры, что снижает удобство использования. + В этом случае мы можем просто перенаправить трафик в Китай через Cloudflare Warp, что обеспечит такую же безопасность без ущерба для удобства использования. 2. Как известно, большинство VPN-провайдеров ведут журналы посещенных пользователями доменов, а некоторые даже проверяют и блокируют определенный трафик. - Один из способов защиты конфиденциальности пользователей - использовать цепочку прокси-серверов на клиенте. - Warp использует легкий VPN-протокол WireGuard, который добавляет дополнительный уровень шифрования. - Для VPN-провайдера весь трафик пользователя будет направляться на Warp, что обеспечивает максимальную защиту конфиденциальности. + Один из способов защиты конфиденциальности пользователей - использовать цепочку прокси-серверов на клиенте. + Warp использует легкий VPN-протокол WireGuard, который добавляет дополнительный уровень шифрования. + Для VPN-провайдера весь трафик пользователя будет направляться на Warp, что обеспечивает максимальную защиту конфиденциальности. 3. Простота использования. - Для настройки разделения трафика, WireGuard-туннеля и цепочки прокси-серверов достаточно одного ядра. + Для настройки разделения трафика, WireGuard-туннеля и цепочки прокси-серверов достаточно одного ядра. ## Создание аккаунта Warp -### Спасибо Cloudflare за содействие свободному интернету! Теперь вы можете бесплатно пользоваться услугами Warp. При подключении автоматически выбирается ближайший сервер. +### Спасибо Cloudflare за содействие свободному интернету! Теперь вы можете бесплатно пользоваться услугами Warp. При подключении автоматически выбирается ближайший сервер. + #### Метод 1: + 1. Используйте VPS и загрузите [wgcf](https://github.com/ViRb3/wgcf/releases). 2. Запустите `wgcf register`, чтобы создать файл `wgcf-account.toml`. 3. Запустите `wgcf generate`, чтобы создать файл `wgcf-profile.conf`. Скопируйте его содержимое: @@ -38,35 +40,45 @@ AllowedIPs = 0.0.0.0/0 AllowedIPs = ::/0 Endpoint = engage.cloudflareclient.com:2408 ``` + #### Метод 2: + 1. Используйте [warp-reg.sh](https://github.com/chise0713/warp-reg.sh). Запустите: + ``` bash -c "$(curl -L warp-reg.vercel.app)" ``` + - Вывод: + ```json { - "endpoint":{ - "v4": "162.159.192.7", - "v6": "[2606:4700:d0::a29f:c007]" - }, - "reserved_dec": [35, 74, 190], - "reserved_hex": "0x234abe", - "reserved_str": "I0q+", - "private_key": "yL0kApRiZW4VFfNkKAQ/nYxnMFT3AH0dfVkj1GAlr1k=", - "public_key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", - "v4": "172.16.0.2", - "v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6" + "endpoint": { + "v4": "162.159.192.7", + "v6": "[2606:4700:d0::a29f:c007]" + }, + "reserved_dec": [35, 74, 190], + "reserved_hex": "0x234abe", + "reserved_str": "I0q+", + "private_key": "yL0kApRiZW4VFfNkKAQ/nYxnMFT3AH0dfVkj1GAlr1k=", + "public_key": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", + "v4": "172.16.0.2", + "v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6" } ``` + 2. Скопируйте вывод. #### Метод 3: -1. Используйте [wgcf-cli](https://github.com/ArchiveNetwork/wgcf-cli). Запустите следующие команды для установки: + +1. Используйте [wgcf-cli](https://github.com/ArchiveNetwork/wgcf-cli). Запустите следующие команды для установки: + ``` bash -c "$(curl -L wgcf-cli.vercel.app)" ``` + 2. Запустите `wgcf-cli register` для регистрации. Вывод: + ```json ❯ wgcf-cli register { @@ -89,39 +101,34 @@ bash -c "$(curl -L wgcf-cli.vercel.app)" } } ``` + - Полный файл будет сохранен в файле `wgcf.json` в рабочем каталоге. + 3. Запустите `wgcf-cli generate --xray`, чтобы создать исходящий WireGuard. Содержимое будет сохранено в файле `wgcf.json.xray.json`. + - Пример файла: + ```json { - "protocol": "wireguard", - "settings": { - "secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=", - "address": [ - "172.16.0.2/32", - "2606:4700:110:857a:6a95:fe27:1870:2a9d/128" - ], - "peers": [ - { - "publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", - "allowedIPs": [ - "0.0.0.0/0", - "::/0" - ], - "endpoint": "162.159.192.1:2408" - } - ], - "reserved": [ - 240, - 25, - 146 - ], - "mtu": 1280 - }, - "tag": "wireguard" + "protocol": "wireguard", + "settings": { + "secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=", + "address": ["172.16.0.2/32", "2606:4700:110:857a:6a95:fe27:1870:2a9d/128"], + "peers": [ + { + "publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", + "allowedIPs": ["0.0.0.0/0", "::/0"], + "endpoint": "162.159.192.1:2408" + } + ], + "reserved": [240, 25, 146], + "mtu": 1280 + }, + "tag": "wireguard" } ``` + ## Перенаправление трафика в Китай через Warp на сервере Добавьте исходящий WireGuard к существующим исходящим подключениям: @@ -138,7 +145,7 @@ bash -c "$(curl -L wgcf-cli.vercel.app)" "endpoint": "engage.cloudflareclient.com:2408" } ], - "reserved":[0, 0, 0] // Вставьте reserved, если у вас есть. + "reserved": [0, 0, 0] // Вставьте reserved, если у вас есть. }, "tag": "wireguard-1" } @@ -213,5 +220,3 @@ bash -c "$(curl -L wgcf-cli.vercel.app)" ] } ``` - - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32d3283..07a4487 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,29 +1,28 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: - .: dependencies: - '@popperjs/core': + "@popperjs/core": specifier: ^2.11.5 version: 2.11.8 - '@vuepress/plugin-google-analytics': + "@vuepress/plugin-google-analytics": specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-register-components': + "@vuepress/plugin-register-components": specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-shiki': + "@vuepress/plugin-shiki": specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/theme-default': + "@vuepress/theme-default": specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(sass-loader@14.2.1(sass@1.77.4)(webpack@5.91.0(esbuild@0.24.0)))(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vueuse/core': + "@vueuse/core": specifier: ^11.2.0 version: 11.2.0(vue@3.3.13(typescript@5.8.2)) anywhere: @@ -48,25 +47,25 @@ importers: specifier: 3.3.13 version: 3.3.13(typescript@5.8.2) devDependencies: - '@types/bootstrap': + "@types/bootstrap": specifier: ^5.2.0 version: 5.2.10 - '@types/jquery': + "@types/jquery": specifier: ^3.5.14 version: 3.5.30 - '@types/node': + "@types/node": specifier: ^22.10.1 version: 22.10.1 - '@vuepress/bundler-vite': + "@vuepress/bundler-vite": specifier: 2.0.0-rc.2 version: 2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2) - '@vuepress/bundler-webpack': + "@vuepress/bundler-webpack": specifier: 2.0.0-rc.2 version: 2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2) - '@vuepress/plugin-back-to-top': + "@vuepress/plugin-back-to-top": specifier: ^2.0.0-rc.3 version: 2.0.0-rc.33(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-search': + "@vuepress/plugin-search": specifier: 2.0.0-rc.3 version: 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) postcss-loader: @@ -95,916 +94,1590 @@ importers: version: https://codeload.github.com/XTLS/vuepress-plugin-i18n/tar.gz/5ae5b2d(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) packages: + "@antfu/install-pkg@0.4.1": + resolution: + { + integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==, + } - '@antfu/install-pkg@0.4.1': - resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} + "@antfu/utils@0.7.10": + resolution: + { + integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==, + } - '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + "@babel/code-frame@7.24.6": + resolution: + { + integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==, + } + engines: { node: ">=6.9.0" } - '@babel/code-frame@7.24.6': - resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} - engines: {node: '>=6.9.0'} + "@babel/helper-string-parser@7.24.6": + resolution: + { + integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-string-parser@7.24.6': - resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} - engines: {node: '>=6.9.0'} + "@babel/helper-validator-identifier@7.24.6": + resolution: + { + integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==, + } + engines: { node: ">=6.9.0" } - '@babel/helper-validator-identifier@7.24.6': - resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} - engines: {node: '>=6.9.0'} + "@babel/highlight@7.24.6": + resolution: + { + integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==, + } + engines: { node: ">=6.9.0" } - '@babel/highlight@7.24.6': - resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.24.6': - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} - engines: {node: '>=6.0.0'} + "@babel/parser@7.24.6": + resolution: + { + integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==, + } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/types@7.24.6': - resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} - engines: {node: '>=6.9.0'} + "@babel/types@7.24.6": + resolution: + { + integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==, + } + engines: { node: ">=6.9.0" } - '@braintree/sanitize-url@7.1.0': - resolution: {integrity: sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==} + "@braintree/sanitize-url@7.1.0": + resolution: + { + integrity: sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==, + } - '@chevrotain/cst-dts-gen@11.0.3': - resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + "@chevrotain/cst-dts-gen@11.0.3": + resolution: + { + integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==, + } - '@chevrotain/gast@11.0.3': - resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + "@chevrotain/gast@11.0.3": + resolution: + { + integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==, + } - '@chevrotain/regexp-to-ast@11.0.3': - resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + "@chevrotain/regexp-to-ast@11.0.3": + resolution: + { + integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==, + } - '@chevrotain/types@11.0.3': - resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + "@chevrotain/types@11.0.3": + resolution: + { + integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==, + } - '@chevrotain/utils@11.0.3': - resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + "@chevrotain/utils@11.0.3": + resolution: + { + integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==, + } - '@esbuild/aix-ppc64@0.19.12': - resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} - engines: {node: '>=12'} + "@esbuild/aix-ppc64@0.19.12": + resolution: + { + integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} - engines: {node: '>=18'} + "@esbuild/aix-ppc64@0.24.0": + resolution: + { + integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.12': - resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} - engines: {node: '>=12'} + "@esbuild/android-arm64@0.19.12": + resolution: + { + integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.24.0": + resolution: + { + integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==, + } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.12': - resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} - engines: {node: '>=12'} + "@esbuild/android-arm@0.19.12": + resolution: + { + integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==, + } + engines: { node: ">=12" } cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.24.0": + resolution: + { + integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==, + } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.12': - resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} - engines: {node: '>=12'} + "@esbuild/android-x64@0.19.12": + resolution: + { + integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==, + } + engines: { node: ">=12" } cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.24.0": + resolution: + { + integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.12': - resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} - engines: {node: '>=12'} + "@esbuild/darwin-arm64@0.19.12": + resolution: + { + integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==, + } + engines: { node: ">=12" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.24.0": + resolution: + { + integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==, + } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.12': - resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} - engines: {node: '>=12'} + "@esbuild/darwin-x64@0.19.12": + resolution: + { + integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==, + } + engines: { node: ">=12" } cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.24.0": + resolution: + { + integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==, + } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.12': - resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} - engines: {node: '>=12'} + "@esbuild/freebsd-arm64@0.19.12": + resolution: + { + integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.24.0": + resolution: + { + integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==, + } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.12': - resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} - engines: {node: '>=12'} + "@esbuild/freebsd-x64@0.19.12": + resolution: + { + integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==, + } + engines: { node: ">=12" } cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.24.0": + resolution: + { + integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==, + } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.12': - resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} - engines: {node: '>=12'} + "@esbuild/linux-arm64@0.19.12": + resolution: + { + integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==, + } + engines: { node: ">=12" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.24.0": + resolution: + { + integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==, + } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.12': - resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} - engines: {node: '>=12'} + "@esbuild/linux-arm@0.19.12": + resolution: + { + integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==, + } + engines: { node: ">=12" } cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.24.0": + resolution: + { + integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==, + } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.12': - resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} - engines: {node: '>=12'} + "@esbuild/linux-ia32@0.19.12": + resolution: + { + integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==, + } + engines: { node: ">=12" } cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.24.0": + resolution: + { + integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==, + } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.12': - resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} - engines: {node: '>=12'} + "@esbuild/linux-loong64@0.19.12": + resolution: + { + integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==, + } + engines: { node: ">=12" } cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.24.0": + resolution: + { + integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==, + } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.12': - resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} - engines: {node: '>=12'} + "@esbuild/linux-mips64el@0.19.12": + resolution: + { + integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==, + } + engines: { node: ">=12" } cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.24.0": + resolution: + { + integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==, + } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.12': - resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} - engines: {node: '>=12'} + "@esbuild/linux-ppc64@0.19.12": + resolution: + { + integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==, + } + engines: { node: ">=12" } cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.24.0": + resolution: + { + integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==, + } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.12': - resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} - engines: {node: '>=12'} + "@esbuild/linux-riscv64@0.19.12": + resolution: + { + integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==, + } + engines: { node: ">=12" } cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.24.0": + resolution: + { + integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==, + } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.12': - resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} - engines: {node: '>=12'} + "@esbuild/linux-s390x@0.19.12": + resolution: + { + integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==, + } + engines: { node: ">=12" } cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.24.0": + resolution: + { + integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==, + } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.12': - resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} - engines: {node: '>=12'} + "@esbuild/linux-x64@0.19.12": + resolution: + { + integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==, + } + engines: { node: ">=12" } cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.24.0": + resolution: + { + integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==, + } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.12': - resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} - engines: {node: '>=12'} + "@esbuild/netbsd-x64@0.19.12": + resolution: + { + integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==, + } + engines: { node: ">=12" } cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.24.0": + resolution: + { + integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==, + } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.24.0": + resolution: + { + integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==, + } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.19.12': - resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} - engines: {node: '>=12'} + "@esbuild/openbsd-x64@0.19.12": + resolution: + { + integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==, + } + engines: { node: ">=12" } cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.24.0": + resolution: + { + integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==, + } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.12': - resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} - engines: {node: '>=12'} + "@esbuild/sunos-x64@0.19.12": + resolution: + { + integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==, + } + engines: { node: ">=12" } cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.24.0": + resolution: + { + integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==, + } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.12': - resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} - engines: {node: '>=12'} + "@esbuild/win32-arm64@0.19.12": + resolution: + { + integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==, + } + engines: { node: ">=12" } cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.24.0": + resolution: + { + integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==, + } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.12': - resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} - engines: {node: '>=12'} + "@esbuild/win32-ia32@0.19.12": + resolution: + { + integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==, + } + engines: { node: ">=12" } cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.24.0": + resolution: + { + integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==, + } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.12': - resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} - engines: {node: '>=12'} + "@esbuild/win32-x64@0.19.12": + resolution: + { + integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==, + } + engines: { node: ">=12" } cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.24.0": + resolution: + { + integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==, + } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + "@iconify/types@2.0.0": + resolution: + { + integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==, + } - '@iconify/utils@2.1.33': - resolution: {integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==} + "@iconify/utils@2.1.33": + resolution: + { + integrity: sha512-jP9h6v/g0BIZx0p7XGJJVtkVnydtbgTgt9mVNcGDYwaa7UhdHdI9dvoq+gKj9sijMSJKxUPEG2JyjsgXjxL7Kw==, + } - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + "@jridgewell/gen-mapping@0.3.5": + resolution: + { + integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + } + engines: { node: ">=6.0.0" } - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + "@jridgewell/set-array@1.2.1": + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: ">=6.0.0" } - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + "@jridgewell/source-map@0.3.6": + resolution: + { + integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, + } - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + "@jridgewell/sourcemap-codec@1.4.15": + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + "@jridgewell/trace-mapping@0.3.25": + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + "@leichtgewicht/ip-codec@2.0.5": + resolution: + { + integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, + } - '@mdit-vue/plugin-component@2.1.3': - resolution: {integrity: sha512-9AG17beCgpEw/4ldo/M6Y/1Rh4E1bqMmr/rCkWKmCAxy9tJz3lzY7HQJanyHMJufwsb3WL5Lp7Om/aPcQTZ9SA==} + "@mdit-vue/plugin-component@2.1.3": + resolution: + { + integrity: sha512-9AG17beCgpEw/4ldo/M6Y/1Rh4E1bqMmr/rCkWKmCAxy9tJz3lzY7HQJanyHMJufwsb3WL5Lp7Om/aPcQTZ9SA==, + } - '@mdit-vue/plugin-frontmatter@2.1.3': - resolution: {integrity: sha512-KxsSCUVBEmn6sJcchSTiI5v9bWaoRxe68RBYRDGcSEY1GTnfQ5gQPMIsM48P4q1luLEIWurVGGrRu7u93//LDQ==} + "@mdit-vue/plugin-frontmatter@2.1.3": + resolution: + { + integrity: sha512-KxsSCUVBEmn6sJcchSTiI5v9bWaoRxe68RBYRDGcSEY1GTnfQ5gQPMIsM48P4q1luLEIWurVGGrRu7u93//LDQ==, + } - '@mdit-vue/plugin-headers@2.1.3': - resolution: {integrity: sha512-AcL7a7LHQR3ISINhfjGJNE/bHyM0dcl6MYm1Sr//zF7ZgokPGwD/HhD7TzwmrKA9YNYCcO9P3QmF/RN9XyA6CA==} + "@mdit-vue/plugin-headers@2.1.3": + resolution: + { + integrity: sha512-AcL7a7LHQR3ISINhfjGJNE/bHyM0dcl6MYm1Sr//zF7ZgokPGwD/HhD7TzwmrKA9YNYCcO9P3QmF/RN9XyA6CA==, + } - '@mdit-vue/plugin-sfc@2.1.3': - resolution: {integrity: sha512-Ezl0dNvQNS639Yl4siXm+cnWtQvlqHrg+u+lnau/OHpj9Xh3LVap/BSQVugKIV37eR13jXXYf3VaAOP1fXPN+w==} + "@mdit-vue/plugin-sfc@2.1.3": + resolution: + { + integrity: sha512-Ezl0dNvQNS639Yl4siXm+cnWtQvlqHrg+u+lnau/OHpj9Xh3LVap/BSQVugKIV37eR13jXXYf3VaAOP1fXPN+w==, + } - '@mdit-vue/plugin-title@2.1.3': - resolution: {integrity: sha512-XWVOQoZqczoN97xCDrnQicmXKoqwOjIymIm9HQnRXhHnYKOgJPW1CxSGhkcOGzvDU1v0mD/adojVyyj/s6ggWw==} + "@mdit-vue/plugin-title@2.1.3": + resolution: + { + integrity: sha512-XWVOQoZqczoN97xCDrnQicmXKoqwOjIymIm9HQnRXhHnYKOgJPW1CxSGhkcOGzvDU1v0mD/adojVyyj/s6ggWw==, + } - '@mdit-vue/plugin-toc@2.1.3': - resolution: {integrity: sha512-41Q+iXpLHZt0zJdApVwoVt7WF6za/xUjtjEPf90Z3KLzQO01TXsv48Xp9BsrFHPcPcm8tiZ0+O1/ICJO80V/MQ==} + "@mdit-vue/plugin-toc@2.1.3": + resolution: + { + integrity: sha512-41Q+iXpLHZt0zJdApVwoVt7WF6za/xUjtjEPf90Z3KLzQO01TXsv48Xp9BsrFHPcPcm8tiZ0+O1/ICJO80V/MQ==, + } - '@mdit-vue/shared@2.1.3': - resolution: {integrity: sha512-27YI8b0VVZsAlNwaWoaOCWbr4eL8B04HxiYk/y2ktblO/nMcOEOLt4p0RjuobvdyUyjHvGOS09RKhq7qHm1CHQ==} + "@mdit-vue/shared@2.1.3": + resolution: + { + integrity: sha512-27YI8b0VVZsAlNwaWoaOCWbr4eL8B04HxiYk/y2ktblO/nMcOEOLt4p0RjuobvdyUyjHvGOS09RKhq7qHm1CHQ==, + } - '@mdit-vue/types@2.1.0': - resolution: {integrity: sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==} + "@mdit-vue/types@2.1.0": + resolution: + { + integrity: sha512-TMBB/BQWVvwtpBdWD75rkZx4ZphQ6MN0O4QB2Bc0oI5PC2uE57QerhNxdRZ7cvBHE2iY2C+BUNUziCfJbjIRRA==, + } - '@mermaid-js/parser@0.3.0': - resolution: {integrity: sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==} + "@mermaid-js/parser@0.3.0": + resolution: + { + integrity: sha512-HsvL6zgE5sUPGgkIDlmAWR1HTNHz2Iy11BAWPTa4Jjabkpguy4Ze2gzfLrg6pdRuBvFwgUYyxiaNqZwrEEXepA==, + } - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + "@popperjs/core@2.11.8": + resolution: + { + integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==, + } - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + "@rollup/rollup-android-arm-eabi@4.18.0": + resolution: + { + integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==, + } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + "@rollup/rollup-android-arm64@4.18.0": + resolution: + { + integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==, + } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + "@rollup/rollup-darwin-arm64@4.18.0": + resolution: + { + integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==, + } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + "@rollup/rollup-darwin-x64@4.18.0": + resolution: + { + integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==, + } cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + "@rollup/rollup-linux-arm-gnueabihf@4.18.0": + resolution: + { + integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==, + } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + "@rollup/rollup-linux-arm-musleabihf@4.18.0": + resolution: + { + integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==, + } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + "@rollup/rollup-linux-arm64-gnu@4.18.0": + resolution: + { + integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==, + } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + "@rollup/rollup-linux-arm64-musl@4.18.0": + resolution: + { + integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==, + } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + resolution: + { + integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==, + } cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + "@rollup/rollup-linux-riscv64-gnu@4.18.0": + resolution: + { + integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==, + } cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + "@rollup/rollup-linux-s390x-gnu@4.18.0": + resolution: + { + integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==, + } cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + "@rollup/rollup-linux-x64-gnu@4.18.0": + resolution: + { + integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==, + } cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + "@rollup/rollup-linux-x64-musl@4.18.0": + resolution: + { + integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==, + } cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + "@rollup/rollup-win32-arm64-msvc@4.18.0": + resolution: + { + integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==, + } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + "@rollup/rollup-win32-ia32-msvc@4.18.0": + resolution: + { + integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==, + } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + "@rollup/rollup-win32-x64-msvc@4.18.0": + resolution: + { + integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==, + } cpu: [x64] os: [win32] - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - - '@types/bootstrap@5.2.10': - resolution: {integrity: sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==} - - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - - '@types/d3-axis@3.0.6': - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} - - '@types/d3-brush@3.0.6': - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} - - '@types/d3-chord@3.0.6': - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-contour@3.0.6': - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} - - '@types/d3-delaunay@6.0.4': - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - - '@types/d3-dispatch@3.0.6': - resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} - - '@types/d3-drag@3.0.7': - resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} - - '@types/d3-dsv@3.0.7': - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-fetch@3.0.7': - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} - - '@types/d3-force@3.0.10': - resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} - - '@types/d3-format@3.0.4': - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - - '@types/d3-hierarchy@3.1.7': - resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.0': - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - - '@types/d3-polygon@3.0.2': - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - - '@types/d3-quadtree@3.0.6': - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - - '@types/d3-random@3.0.3': - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-selection@3.0.11': - resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} - - '@types/d3-shape@3.1.6': - resolution: {integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==} - - '@types/d3-time-format@4.0.3': - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - - '@types/d3-transition@3.0.9': - resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} - - '@types/d3-zoom@3.0.8': - resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} - - '@types/d3@7.4.3': - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/dompurify@3.0.5': - resolution: {integrity: sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/express-serve-static-core@4.19.3': - resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/fs-extra@11.0.4': - resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} - - '@types/geojson@7946.0.14': - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - - '@types/hash-sum@1.0.2': - resolution: {integrity: sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==} - - '@types/html-minifier-terser@6.1.0': - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/http-proxy@1.17.14': - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} - - '@types/jquery@3.5.30': - resolution: {integrity: sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/jsonfile@6.1.4': - resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - - '@types/linkify-it@3.0.5': - resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} - - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/markdown-it-emoji@2.0.5': - resolution: {integrity: sha512-iJLsmCNpSWKtV6Ia3mLSjcXJPEt7ubGG342z+hGvYx++TpM19oTUrJcI7XjbOqRQ+W2UQ323E7B0eCLwlgT/9g==} - - '@types/markdown-it@13.0.8': - resolution: {integrity: sha512-V+KmpgiipS+zoypeUSS9ojesWtY/0k4XfqcK2fnVrX/qInJhX7rsCxZ/rygiPH2zxlPPrhfuW0I6ddMcWTKLsg==} - - '@types/markdown-it@14.1.1': - resolution: {integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==} - - '@types/mdurl@1.0.5': - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - - '@types/node@22.10.1': - resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} - - '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - - '@types/sax@1.2.7': - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} - - '@types/sizzle@2.3.8': - resolution: {integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==} - - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - - '@types/webpack-env@1.18.5': - resolution: {integrity: sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==} - - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - - '@vitejs/plugin-vue@5.0.5': - resolution: {integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==} - engines: {node: ^18.0.0 || >=20.0.0} + "@sindresorhus/merge-streams@2.3.0": + resolution: + { + integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==, + } + engines: { node: ">=18" } + + "@types/body-parser@1.19.5": + resolution: + { + integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, + } + + "@types/bonjour@3.5.13": + resolution: + { + integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==, + } + + "@types/bootstrap@5.2.10": + resolution: + { + integrity: sha512-F2X+cd6551tep0MvVZ6nM8v7XgGN/twpdNDjqS1TUM7YFNEtQYWk+dKAnH+T1gr6QgCoGMPl487xw/9hXooa2g==, + } + + "@types/connect-history-api-fallback@1.5.4": + resolution: + { + integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==, + } + + "@types/connect@3.4.38": + resolution: + { + integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + } + + "@types/d3-array@3.2.1": + resolution: + { + integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==, + } + + "@types/d3-axis@3.0.6": + resolution: + { + integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==, + } + + "@types/d3-brush@3.0.6": + resolution: + { + integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==, + } + + "@types/d3-chord@3.0.6": + resolution: + { + integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==, + } + + "@types/d3-color@3.1.3": + resolution: + { + integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==, + } + + "@types/d3-contour@3.0.6": + resolution: + { + integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==, + } + + "@types/d3-delaunay@6.0.4": + resolution: + { + integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==, + } + + "@types/d3-dispatch@3.0.6": + resolution: + { + integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==, + } + + "@types/d3-drag@3.0.7": + resolution: + { + integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==, + } + + "@types/d3-dsv@3.0.7": + resolution: + { + integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==, + } + + "@types/d3-ease@3.0.2": + resolution: + { + integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==, + } + + "@types/d3-fetch@3.0.7": + resolution: + { + integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==, + } + + "@types/d3-force@3.0.10": + resolution: + { + integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==, + } + + "@types/d3-format@3.0.4": + resolution: + { + integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==, + } + + "@types/d3-geo@3.1.0": + resolution: + { + integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==, + } + + "@types/d3-hierarchy@3.1.7": + resolution: + { + integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==, + } + + "@types/d3-interpolate@3.0.4": + resolution: + { + integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==, + } + + "@types/d3-path@3.1.0": + resolution: + { + integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==, + } + + "@types/d3-polygon@3.0.2": + resolution: + { + integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==, + } + + "@types/d3-quadtree@3.0.6": + resolution: + { + integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==, + } + + "@types/d3-random@3.0.3": + resolution: + { + integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==, + } + + "@types/d3-scale-chromatic@3.0.3": + resolution: + { + integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==, + } + + "@types/d3-scale@4.0.8": + resolution: + { + integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==, + } + + "@types/d3-selection@3.0.11": + resolution: + { + integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==, + } + + "@types/d3-shape@3.1.6": + resolution: + { + integrity: sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==, + } + + "@types/d3-time-format@4.0.3": + resolution: + { + integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==, + } + + "@types/d3-time@3.0.3": + resolution: + { + integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==, + } + + "@types/d3-timer@3.0.2": + resolution: + { + integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==, + } + + "@types/d3-transition@3.0.9": + resolution: + { + integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==, + } + + "@types/d3-zoom@3.0.8": + resolution: + { + integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==, + } + + "@types/d3@7.4.3": + resolution: + { + integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==, + } + + "@types/debug@4.1.12": + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + + "@types/dompurify@3.0.5": + resolution: + { + integrity: sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==, + } + + "@types/eslint-scope@3.7.7": + resolution: + { + integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, + } + + "@types/eslint@8.56.10": + resolution: + { + integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==, + } + + "@types/estree@1.0.5": + resolution: + { + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + } + + "@types/express-serve-static-core@4.19.3": + resolution: + { + integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==, + } + + "@types/express@4.17.21": + resolution: + { + integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, + } + + "@types/fs-extra@11.0.4": + resolution: + { + integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==, + } + + "@types/geojson@7946.0.14": + resolution: + { + integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==, + } + + "@types/hash-sum@1.0.2": + resolution: + { + integrity: sha512-UP28RddqY8xcU0SCEp9YKutQICXpaAq9N8U2klqF5hegGha7KzTOL8EdhIIV3bOSGBzjEpN9bU/d+nNZBdJYVw==, + } + + "@types/html-minifier-terser@6.1.0": + resolution: + { + integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==, + } + + "@types/http-errors@2.0.4": + resolution: + { + integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, + } + + "@types/http-proxy@1.17.14": + resolution: + { + integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==, + } + + "@types/jquery@3.5.30": + resolution: + { + integrity: sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==, + } + + "@types/json-schema@7.0.15": + resolution: + { + integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + } + + "@types/jsonfile@6.1.4": + resolution: + { + integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==, + } + + "@types/linkify-it@3.0.5": + resolution: + { + integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==, + } + + "@types/linkify-it@5.0.0": + resolution: + { + integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==, + } + + "@types/markdown-it-emoji@2.0.5": + resolution: + { + integrity: sha512-iJLsmCNpSWKtV6Ia3mLSjcXJPEt7ubGG342z+hGvYx++TpM19oTUrJcI7XjbOqRQ+W2UQ323E7B0eCLwlgT/9g==, + } + + "@types/markdown-it@13.0.8": + resolution: + { + integrity: sha512-V+KmpgiipS+zoypeUSS9ojesWtY/0k4XfqcK2fnVrX/qInJhX7rsCxZ/rygiPH2zxlPPrhfuW0I6ddMcWTKLsg==, + } + + "@types/markdown-it@14.1.1": + resolution: + { + integrity: sha512-4NpsnpYl2Gt1ljyBGrKMxFYAYvpqbnnkgP/i/g+NLpjEUa3obn1XJCur9YbEXKDAkaXqsR1LbDnGEJ0MmKFxfg==, + } + + "@types/mdurl@1.0.5": + resolution: + { + integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==, + } + + "@types/mdurl@2.0.0": + resolution: + { + integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==, + } + + "@types/mime@1.3.5": + resolution: + { + integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + } + + "@types/ms@0.7.34": + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + + "@types/node-forge@1.3.11": + resolution: + { + integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, + } + + "@types/node@17.0.45": + resolution: + { + integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==, + } + + "@types/node@22.10.1": + resolution: + { + integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==, + } + + "@types/qs@6.9.15": + resolution: + { + integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==, + } + + "@types/range-parser@1.2.7": + resolution: + { + integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + } + + "@types/retry@0.12.0": + resolution: + { + integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, + } + + "@types/sax@1.2.7": + resolution: + { + integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==, + } + + "@types/send@0.17.4": + resolution: + { + integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, + } + + "@types/serve-index@1.9.4": + resolution: + { + integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==, + } + + "@types/serve-static@1.15.7": + resolution: + { + integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, + } + + "@types/sizzle@2.3.8": + resolution: + { + integrity: sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==, + } + + "@types/sockjs@0.3.36": + resolution: + { + integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==, + } + + "@types/trusted-types@2.0.7": + resolution: + { + integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==, + } + + "@types/web-bluetooth@0.0.20": + resolution: + { + integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, + } + + "@types/webpack-env@1.18.5": + resolution: + { + integrity: sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==, + } + + "@types/ws@8.5.10": + resolution: + { + integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, + } + + "@vitejs/plugin-vue@5.0.5": + resolution: + { + integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==, + } + engines: { node: ^18.0.0 || >=20.0.0 } peerDependencies: vite: ^5.0.0 vue: ^3.2.25 - '@vue/compiler-core@3.3.13': - resolution: {integrity: sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==} + "@vue/compiler-core@3.3.13": + resolution: + { + integrity: sha512-bwi9HShGu7uaZLOErZgsH2+ojsEdsjerbf2cMXPwmvcgZfVPZ2BVZzCVnwZBxTAYd6Mzbmf6izcUNDkWnBBQ6A==, + } - '@vue/compiler-core@3.4.27': - resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} + "@vue/compiler-core@3.4.27": + resolution: + { + integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==, + } - '@vue/compiler-dom@3.3.13': - resolution: {integrity: sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==} + "@vue/compiler-dom@3.3.13": + resolution: + { + integrity: sha512-EYRDpbLadGtNL0Gph+HoKiYqXLqZ0xSSpR5Dvnu/Ep7ggaCbjRDIus1MMxTS2Qm0koXED4xSlvTZaTnI8cYAsw==, + } - '@vue/compiler-dom@3.4.27': - resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} + "@vue/compiler-dom@3.4.27": + resolution: + { + integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==, + } - '@vue/compiler-sfc@3.3.13': - resolution: {integrity: sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==} + "@vue/compiler-sfc@3.3.13": + resolution: + { + integrity: sha512-DQVmHEy/EKIgggvnGRLx21hSqnr1smUS9Aq8tfxiiot8UR0/pXKHN9k78/qQ7etyQTFj5em5nruODON7dBeumw==, + } - '@vue/compiler-sfc@3.4.27': - resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} + "@vue/compiler-sfc@3.4.27": + resolution: + { + integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==, + } - '@vue/compiler-ssr@3.3.13': - resolution: {integrity: sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==} + "@vue/compiler-ssr@3.3.13": + resolution: + { + integrity: sha512-d/P3bCeUGmkJNS1QUZSAvoCIW4fkOKK3l2deE7zrp0ypJEy+En2AcypIkqvcFQOcw3F0zt2VfMvNsA9JmExTaw==, + } - '@vue/compiler-ssr@3.4.27': - resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} + "@vue/compiler-ssr@3.4.27": + resolution: + { + integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==, + } - '@vue/devtools-api@6.6.2': - resolution: {integrity: sha512-134clD8u7cBBXdmBbXI282gHGF7T/eAbD/G7mAK2llQF62IbI4ny28IVamZVMoJSvfImC2Xxnj732hXkJvUj6g==} + "@vue/devtools-api@6.6.2": + resolution: + { + integrity: sha512-134clD8u7cBBXdmBbXI282gHGF7T/eAbD/G7mAK2llQF62IbI4ny28IVamZVMoJSvfImC2Xxnj732hXkJvUj6g==, + } - '@vue/reactivity-transform@3.3.13': - resolution: {integrity: sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==} + "@vue/reactivity-transform@3.3.13": + resolution: + { + integrity: sha512-oWnydGH0bBauhXvh5KXUy61xr9gKaMbtsMHk40IK9M4gMuKPJ342tKFarY0eQ6jef8906m35q37wwA8DMZOm5Q==, + } - '@vue/reactivity@3.3.13': - resolution: {integrity: sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==} + "@vue/reactivity@3.3.13": + resolution: + { + integrity: sha512-fjzCxceMahHhi4AxUBzQqqVhuA21RJ0COaWTbIBl1PruGW1CeY97louZzLi4smpYx+CHfFPPU/CS8NybbGvPKQ==, + } - '@vue/reactivity@3.4.27': - resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} + "@vue/reactivity@3.4.27": + resolution: + { + integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==, + } - '@vue/runtime-core@3.3.13': - resolution: {integrity: sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==} + "@vue/runtime-core@3.3.13": + resolution: + { + integrity: sha512-1TzA5TvGuh2zUwMJgdfvrBABWZ7y8kBwBhm7BXk8rvdx2SsgcGfz2ruv2GzuGZNvL1aKnK8CQMV/jFOrxNQUMA==, + } - '@vue/runtime-core@3.4.27': - resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} + "@vue/runtime-core@3.4.27": + resolution: + { + integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==, + } - '@vue/runtime-dom@3.3.13': - resolution: {integrity: sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==} + "@vue/runtime-dom@3.3.13": + resolution: + { + integrity: sha512-JJkpE8R/hJKXqVTgUoODwS5wqKtOsmJPEqmp90PDVGygtJ4C0PtOkcEYXwhiVEmef6xeXcIlrT3Yo5aQ4qkHhQ==, + } - '@vue/runtime-dom@3.4.27': - resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} + "@vue/runtime-dom@3.4.27": + resolution: + { + integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==, + } - '@vue/server-renderer@3.3.13': - resolution: {integrity: sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==} + "@vue/server-renderer@3.3.13": + resolution: + { + integrity: sha512-vSnN+nuf6iSqTL3Qgx/9A+BT+0Zf/VJOgF5uMZrKjYPs38GMYyAU1coDyBNHauehXDaP+zl73VhwWv0vBRBHcg==, + } peerDependencies: vue: 3.3.13 - '@vue/server-renderer@3.4.27': - resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} + "@vue/server-renderer@3.4.27": + resolution: + { + integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==, + } peerDependencies: vue: 3.4.27 - '@vue/shared@3.3.13': - resolution: {integrity: sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==} + "@vue/shared@3.3.13": + resolution: + { + integrity: sha512-/zYUwiHD8j7gKx2argXEMCUXVST6q/21DFU0sTfNX0URJroCe3b1UF6vLJ3lQDfLNIiiRl2ONp7Nh5UVWS6QnA==, + } - '@vue/shared@3.4.27': - resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} + "@vue/shared@3.4.27": + resolution: + { + integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==, + } - '@vuepress/bundler-vite@2.0.0-rc.2': - resolution: {integrity: sha512-bjkn0krtucciUkGGdckCkGGg+wlv3Pj7s1lO/ChACLQncDwc3GgMTuMm0JyaCDKzTXE8sufjHHGWMftRL8qFOg==} + "@vuepress/bundler-vite@2.0.0-rc.2": + resolution: + { + integrity: sha512-bjkn0krtucciUkGGdckCkGGg+wlv3Pj7s1lO/ChACLQncDwc3GgMTuMm0JyaCDKzTXE8sufjHHGWMftRL8qFOg==, + } - '@vuepress/bundler-webpack@2.0.0-rc.2': - resolution: {integrity: sha512-ukYXFFTI5vOQ24zv+oIGRjYwBjgeIuTe6S8pKBZj5dJuQIafVFYTEd6YSJbuBtqTJBtxbwcF4oW/pMynKkMYBQ==} + "@vuepress/bundler-webpack@2.0.0-rc.2": + resolution: + { + integrity: sha512-ukYXFFTI5vOQ24zv+oIGRjYwBjgeIuTe6S8pKBZj5dJuQIafVFYTEd6YSJbuBtqTJBtxbwcF4oW/pMynKkMYBQ==, + } - '@vuepress/cli@2.0.0-rc.2': - resolution: {integrity: sha512-a5qAtd6gNndNcqENBNkMn9xRDbb1B2kJ62dWUaE5KjhkM/Fed4CTvBTDd0qfYmwiwsSFPL08VWavo1FcdMNXsA==} + "@vuepress/cli@2.0.0-rc.2": + resolution: + { + integrity: sha512-a5qAtd6gNndNcqENBNkMn9xRDbb1B2kJ62dWUaE5KjhkM/Fed4CTvBTDd0qfYmwiwsSFPL08VWavo1FcdMNXsA==, + } hasBin: true - '@vuepress/client@2.0.0-rc.2': - resolution: {integrity: sha512-gQ4CfBhzWYOCW4OcAUd6S8Jr9m/8UkZZuN/70t12GltbX/cdm6zrGnf89GiVjgvoK8+OYoc7luoBuWbyc/X5sg==} + "@vuepress/client@2.0.0-rc.2": + resolution: + { + integrity: sha512-gQ4CfBhzWYOCW4OcAUd6S8Jr9m/8UkZZuN/70t12GltbX/cdm6zrGnf89GiVjgvoK8+OYoc7luoBuWbyc/X5sg==, + } - '@vuepress/core@2.0.0-rc.2': - resolution: {integrity: sha512-C/bHG0y+v5oeCrfaesy2yFa0dyCah05g1w7vArZk8ABsVECjZKAC5/ev39UFQm2dCdNzsj2E3KgLIxYWqpcKeg==} + "@vuepress/core@2.0.0-rc.2": + resolution: + { + integrity: sha512-C/bHG0y+v5oeCrfaesy2yFa0dyCah05g1w7vArZk8ABsVECjZKAC5/ev39UFQm2dCdNzsj2E3KgLIxYWqpcKeg==, + } - '@vuepress/helper@2.0.0-rc.3': - resolution: {integrity: sha512-Z6LuiFjIupgf6KecDqiO4o4M8GHhx0ShTrZvv/a5y2o2iofE5j5E74Q6Ww7ECQojwhRMvpzJ/Bq9YaIg25T2Yw==} - engines: {node: '>=18.16.0', npm: '>=8', pnpm: '>=7', yarn: '>=2'} + "@vuepress/helper@2.0.0-rc.3": + resolution: + { + integrity: sha512-Z6LuiFjIupgf6KecDqiO4o4M8GHhx0ShTrZvv/a5y2o2iofE5j5E74Q6Ww7ECQojwhRMvpzJ/Bq9YaIg25T2Yw==, + } + engines: { node: ">=18.16.0", npm: ">=8", pnpm: ">=7", yarn: ">=2" } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/helper@2.0.0-rc.33': - resolution: {integrity: sha512-buL7+SgZ+Yz/nD2sA9mi+o5kXAjE+aSOmM77Tx4d2cPeMFy3pFEQ/eYWQmh4SuANBKBpgGEh48kC7dNwtJgUTw==} + "@vuepress/helper@2.0.0-rc.33": + resolution: + { + integrity: sha512-buL7+SgZ+Yz/nD2sA9mi+o5kXAjE+aSOmM77Tx4d2cPeMFy3pFEQ/eYWQmh4SuANBKBpgGEh48kC7dNwtJgUTw==, + } peerDependencies: vuepress: 2.0.0-rc.12 - '@vuepress/markdown@2.0.0-rc.2': - resolution: {integrity: sha512-5/RmJnap+MGKxDhSO+Mv6zB8PoPHhhBujnNKKO3PnyfPrj0LyL0AuTm8m3Ea271wMp9956WINjw8jlpn+Z1sBg==} + "@vuepress/markdown@2.0.0-rc.2": + resolution: + { + integrity: sha512-5/RmJnap+MGKxDhSO+Mv6zB8PoPHhhBujnNKKO3PnyfPrj0LyL0AuTm8m3Ea271wMp9956WINjw8jlpn+Z1sBg==, + } - '@vuepress/plugin-active-header-links@2.0.0-rc.3': - resolution: {integrity: sha512-ddr8VIrYA/kpWGWx80GeWclSvQoYR9QjXvkx//AMbl5mQqX70GTZrgv5Rbnp6MC8mBxVg6Izy/9eqaJELE+A3g==} + "@vuepress/plugin-active-header-links@2.0.0-rc.3": + resolution: + { + integrity: sha512-ddr8VIrYA/kpWGWx80GeWclSvQoYR9QjXvkx//AMbl5mQqX70GTZrgv5Rbnp6MC8mBxVg6Izy/9eqaJELE+A3g==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-back-to-top@2.0.0-rc.3': - resolution: {integrity: sha512-VkzRWMLBHcJ+MVCMl+Yd5Z6Uc1LAaSQkoHrwap1xBU3a3Zjgcqf73+fDTgenTF1usANlztDE9F/Jg8YjREJ6yg==} + "@vuepress/plugin-back-to-top@2.0.0-rc.3": + resolution: + { + integrity: sha512-VkzRWMLBHcJ+MVCMl+Yd5Z6Uc1LAaSQkoHrwap1xBU3a3Zjgcqf73+fDTgenTF1usANlztDE9F/Jg8YjREJ6yg==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-back-to-top@2.0.0-rc.33': - resolution: {integrity: sha512-bhblAYtqcpAd6KKNZkXbRPpF8T9wGeexBpJRsdYraaxiEpDrhI+u51XKj9c3v3BCbCrXsRVvm3f62FvjMnXbYg==} + "@vuepress/plugin-back-to-top@2.0.0-rc.33": + resolution: + { + integrity: sha512-bhblAYtqcpAd6KKNZkXbRPpF8T9wGeexBpJRsdYraaxiEpDrhI+u51XKj9c3v3BCbCrXsRVvm3f62FvjMnXbYg==, + } peerDependencies: vuepress: 2.0.0-rc.12 - '@vuepress/plugin-container@2.0.0-rc.3': - resolution: {integrity: sha512-wwwtQQYiA21JKKYM4TCjDWxS2p91RPiv62NoWp+Q6BG+E+qnwaA1sOrd36CsEOS2IbIcJdBeHY/zskL0aWKEoQ==} + "@vuepress/plugin-container@2.0.0-rc.3": + resolution: + { + integrity: sha512-wwwtQQYiA21JKKYM4TCjDWxS2p91RPiv62NoWp+Q6BG+E+qnwaA1sOrd36CsEOS2IbIcJdBeHY/zskL0aWKEoQ==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-external-link-icon@2.0.0-rc.3': - resolution: {integrity: sha512-DX4Dn2uj2rAEausB2tz5fe/Ra3oR/B9uR67+yG2lQzZqcZZDW5txsXpZaM0FkXHijzNoS4NKP7k/7qNVe5WvcQ==} + "@vuepress/plugin-external-link-icon@2.0.0-rc.3": + resolution: + { + integrity: sha512-DX4Dn2uj2rAEausB2tz5fe/Ra3oR/B9uR67+yG2lQzZqcZZDW5txsXpZaM0FkXHijzNoS4NKP7k/7qNVe5WvcQ==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-git@2.0.0-rc.3': - resolution: {integrity: sha512-BQoDWmksC+aSc5V933OuNeU7mfrP4hryhckIFadAhKLVRl6CSXDb96SGVTBxcO1gIgKzItdE67UzMw4T9JJN6A==} + "@vuepress/plugin-git@2.0.0-rc.3": + resolution: + { + integrity: sha512-BQoDWmksC+aSc5V933OuNeU7mfrP4hryhckIFadAhKLVRl6CSXDb96SGVTBxcO1gIgKzItdE67UzMw4T9JJN6A==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-google-analytics@2.0.0-rc.3': - resolution: {integrity: sha512-Hp8MxdPX7SwLhoBOQ6D34/5d5DOBGMp2W9bMUlYD2zzUhKOamSleqI4E3KYyq+WkkQmU4naSHxlwJlsjhNwjig==} + "@vuepress/plugin-google-analytics@2.0.0-rc.3": + resolution: + { + integrity: sha512-Hp8MxdPX7SwLhoBOQ6D34/5d5DOBGMp2W9bMUlYD2zzUhKOamSleqI4E3KYyq+WkkQmU4naSHxlwJlsjhNwjig==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-medium-zoom@2.0.0-rc.3': - resolution: {integrity: sha512-qRdUt914tQGfmxcqOwnoC6paZLsAJf2S7kllvf59dDKIDg2JlYsAuOq13wps4/hfuUySe9RDlitl6KcqWfvKfw==} + "@vuepress/plugin-medium-zoom@2.0.0-rc.3": + resolution: + { + integrity: sha512-qRdUt914tQGfmxcqOwnoC6paZLsAJf2S7kllvf59dDKIDg2JlYsAuOq13wps4/hfuUySe9RDlitl6KcqWfvKfw==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-nprogress@2.0.0-rc.3': - resolution: {integrity: sha512-UkbMLvkRps56KF2fsIXtJ0ylRacuPRW9qA1PYwq7XkDqNr4FE5aZsnRHuYIMPUxuhU5t3hRx/zeKOwbctzd2Yw==} + "@vuepress/plugin-nprogress@2.0.0-rc.3": + resolution: + { + integrity: sha512-UkbMLvkRps56KF2fsIXtJ0ylRacuPRW9qA1PYwq7XkDqNr4FE5aZsnRHuYIMPUxuhU5t3hRx/zeKOwbctzd2Yw==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-palette@2.0.0-rc.3': - resolution: {integrity: sha512-BCP2SMEPmaqg4/oHsfA7lpp79iQDZvgeGQCYyWRP2aB5LZ2IiFdyRfZMFOUVzbetsqX7ciOFX3ELG9U59lCOjw==} + "@vuepress/plugin-palette@2.0.0-rc.3": + resolution: + { + integrity: sha512-BCP2SMEPmaqg4/oHsfA7lpp79iQDZvgeGQCYyWRP2aB5LZ2IiFdyRfZMFOUVzbetsqX7ciOFX3ELG9U59lCOjw==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-prismjs@2.0.0-rc.3': - resolution: {integrity: sha512-tbyGKXDR/AbhwiUQIU49Le2VaUYGBnjFqdhGlrC47kRl4Iy+XtxyKgRJcFGcWU0AHRdTtC9MAmPIfz2nJkNhSQ==} + "@vuepress/plugin-prismjs@2.0.0-rc.3": + resolution: + { + integrity: sha512-tbyGKXDR/AbhwiUQIU49Le2VaUYGBnjFqdhGlrC47kRl4Iy+XtxyKgRJcFGcWU0AHRdTtC9MAmPIfz2nJkNhSQ==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-register-components@2.0.0-rc.3': - resolution: {integrity: sha512-l7tLwcgjV54T8ObF1cpgg9qWtKuaF9Dru14aHFeXxM2f7I1AjmAGFXHbBEMOb781HMRi32LYCwodsTahAn3uqg==} + "@vuepress/plugin-register-components@2.0.0-rc.3": + resolution: + { + integrity: sha512-l7tLwcgjV54T8ObF1cpgg9qWtKuaF9Dru14aHFeXxM2f7I1AjmAGFXHbBEMOb781HMRi32LYCwodsTahAn3uqg==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-search@2.0.0-rc.3': - resolution: {integrity: sha512-dTxOYKPNziWX2vx+RO0PLwj/auABlCCAZT42wQt65R5y5RBA7eptFlqF/jmRXKG+CPvSMUOrIo1FrCTvB3yFig==} + "@vuepress/plugin-search@2.0.0-rc.3": + resolution: + { + integrity: sha512-dTxOYKPNziWX2vx+RO0PLwj/auABlCCAZT42wQt65R5y5RBA7eptFlqF/jmRXKG+CPvSMUOrIo1FrCTvB3yFig==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-seo@2.0.0-rc.3': - resolution: {integrity: sha512-0E8l09tRzdvu/rTxX5J+zzDHMIFBhnNzaLSgTG5RWnmqFoHZSZnjHjk8Haecu4Nb6Os+TPYucXj34eX9rt+lWw==} + "@vuepress/plugin-seo@2.0.0-rc.3": + resolution: + { + integrity: sha512-0E8l09tRzdvu/rTxX5J+zzDHMIFBhnNzaLSgTG5RWnmqFoHZSZnjHjk8Haecu4Nb6Os+TPYucXj34eX9rt+lWw==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-shiki@2.0.0-rc.3': - resolution: {integrity: sha512-q6God6sEWr1InLizZHBLXIboEkCVXSOXNeJSoH+buofGrrHXCjA937UVMSUTLP4RZ9b21QXHLsyrRQvoEpa4yQ==} + "@vuepress/plugin-shiki@2.0.0-rc.3": + resolution: + { + integrity: sha512-q6God6sEWr1InLizZHBLXIboEkCVXSOXNeJSoH+buofGrrHXCjA937UVMSUTLP4RZ9b21QXHLsyrRQvoEpa4yQ==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-sitemap@2.0.0-rc.3': - resolution: {integrity: sha512-iWVYmmTjqqRejAq+fh6DduElVki9U379F+A79/SDl5AWf3fe5DNysYTGqyRUwXj8vBzkBWndrBscMHW8TtU4UA==} + "@vuepress/plugin-sitemap@2.0.0-rc.3": + resolution: + { + integrity: sha512-iWVYmmTjqqRejAq+fh6DduElVki9U379F+A79/SDl5AWf3fe5DNysYTGqyRUwXj8vBzkBWndrBscMHW8TtU4UA==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/plugin-theme-data@2.0.0-rc.3': - resolution: {integrity: sha512-Uiso+0b2sIaHtPVftjpCEIT+/T4/E9ZpTCL0fnUEa8APnrP7SiIBqph7+KZENvXGg+0B5+MtZROOfFksFfMyFw==} + "@vuepress/plugin-theme-data@2.0.0-rc.3": + resolution: + { + integrity: sha512-Uiso+0b2sIaHtPVftjpCEIT+/T4/E9ZpTCL0fnUEa8APnrP7SiIBqph7+KZENvXGg+0B5+MtZROOfFksFfMyFw==, + } peerDependencies: vuepress: 2.0.0-rc.2 - '@vuepress/shared@2.0.0-rc.2': - resolution: {integrity: sha512-2kmm0rw+WalRWrSC5pW0TXRz8Wyuh57XmOZEUOhPOflw4o8Dno+PcaWbdOZ/TLkTgTt3X1n7r1/c1ALtaLta8g==} + "@vuepress/shared@2.0.0-rc.2": + resolution: + { + integrity: sha512-2kmm0rw+WalRWrSC5pW0TXRz8Wyuh57XmOZEUOhPOflw4o8Dno+PcaWbdOZ/TLkTgTt3X1n7r1/c1ALtaLta8g==, + } - '@vuepress/theme-default@2.0.0-rc.3': - resolution: {integrity: sha512-IOgAkAgYFyq3O/404KLTXFeJGVF6UyNx5fa8ywO89mpUlJZycUpgIvBS7vQN/hnew43VMEfVEGYwqoCmHVioPw==} + "@vuepress/theme-default@2.0.0-rc.3": + resolution: + { + integrity: sha512-IOgAkAgYFyq3O/404KLTXFeJGVF6UyNx5fa8ywO89mpUlJZycUpgIvBS7vQN/hnew43VMEfVEGYwqoCmHVioPw==, + } peerDependencies: sass-loader: ^14.0.0 vuepress: 2.0.0-rc.2 @@ -1012,95 +1685,179 @@ packages: sass-loader: optional: true - '@vuepress/utils@2.0.0-rc.2': - resolution: {integrity: sha512-g93yFJKtztpdXm4XyOIQ9QcUrKuvuWizvH3qWDQ5/WKlxa6VqE7nVNPlkudgGUIc7Bl4AGrlHcmgvkwaNoMcfA==} + "@vuepress/utils@2.0.0-rc.2": + resolution: + { + integrity: sha512-g93yFJKtztpdXm4XyOIQ9QcUrKuvuWizvH3qWDQ5/WKlxa6VqE7nVNPlkudgGUIc7Bl4AGrlHcmgvkwaNoMcfA==, + } - '@vueuse/core@10.11.0': - resolution: {integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==} + "@vueuse/core@10.11.0": + resolution: + { + integrity: sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==, + } - '@vueuse/core@11.2.0': - resolution: {integrity: sha512-JIUwRcOqOWzcdu1dGlfW04kaJhW3EXnnjJJfLTtddJanymTL7lF1C0+dVVZ/siLfc73mWn+cGP1PE1PKPruRSA==} + "@vueuse/core@11.2.0": + resolution: + { + integrity: sha512-JIUwRcOqOWzcdu1dGlfW04kaJhW3EXnnjJJfLTtddJanymTL7lF1C0+dVVZ/siLfc73mWn+cGP1PE1PKPruRSA==, + } - '@vueuse/metadata@10.11.0': - resolution: {integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==} + "@vueuse/metadata@10.11.0": + resolution: + { + integrity: sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==, + } - '@vueuse/metadata@11.2.0': - resolution: {integrity: sha512-L0ZmtRmNx+ZW95DmrgD6vn484gSpVeRbgpWevFKXwqqQxW9hnSi2Ppuh2BzMjnbv4aJRiIw8tQatXT9uOB23dQ==} + "@vueuse/metadata@11.2.0": + resolution: + { + integrity: sha512-L0ZmtRmNx+ZW95DmrgD6vn484gSpVeRbgpWevFKXwqqQxW9hnSi2Ppuh2BzMjnbv4aJRiIw8tQatXT9uOB23dQ==, + } - '@vueuse/shared@10.11.0': - resolution: {integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==} + "@vueuse/shared@10.11.0": + resolution: + { + integrity: sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==, + } - '@vueuse/shared@11.2.0': - resolution: {integrity: sha512-VxFjie0EanOudYSgMErxXfq6fo8vhr5ICI+BuE3I9FnX7ePllEsVrRQ7O6Q1TLgApeLuPKcHQxAXpP+KnlrJsg==} + "@vueuse/shared@11.2.0": + resolution: + { + integrity: sha512-VxFjie0EanOudYSgMErxXfq6fo8vhr5ICI+BuE3I9FnX7ePllEsVrRQ7O6Q1TLgApeLuPKcHQxAXpP+KnlrJsg==, + } - '@webassemblyjs/ast@1.12.1': - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + "@webassemblyjs/ast@1.12.1": + resolution: + { + integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==, + } - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + "@webassemblyjs/floating-point-hex-parser@1.11.6": + resolution: + { + integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, + } - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + "@webassemblyjs/helper-api-error@1.11.6": + resolution: + { + integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, + } - '@webassemblyjs/helper-buffer@1.12.1': - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + "@webassemblyjs/helper-buffer@1.12.1": + resolution: + { + integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==, + } - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + "@webassemblyjs/helper-numbers@1.11.6": + resolution: + { + integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, + } - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + "@webassemblyjs/helper-wasm-bytecode@1.11.6": + resolution: + { + integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, + } - '@webassemblyjs/helper-wasm-section@1.12.1': - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + "@webassemblyjs/helper-wasm-section@1.12.1": + resolution: + { + integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==, + } - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + "@webassemblyjs/ieee754@1.11.6": + resolution: + { + integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, + } - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + "@webassemblyjs/leb128@1.11.6": + resolution: + { + integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, + } - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + "@webassemblyjs/utf8@1.11.6": + resolution: + { + integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, + } - '@webassemblyjs/wasm-edit@1.12.1': - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + "@webassemblyjs/wasm-edit@1.12.1": + resolution: + { + integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==, + } - '@webassemblyjs/wasm-gen@1.12.1': - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + "@webassemblyjs/wasm-gen@1.12.1": + resolution: + { + integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==, + } - '@webassemblyjs/wasm-opt@1.12.1': - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + "@webassemblyjs/wasm-opt@1.12.1": + resolution: + { + integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==, + } - '@webassemblyjs/wasm-parser@1.12.1': - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + "@webassemblyjs/wasm-parser@1.12.1": + resolution: + { + integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==, + } - '@webassemblyjs/wast-printer@1.12.1': - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + "@webassemblyjs/wast-printer@1.12.1": + resolution: + { + integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==, + } - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + "@xtuc/ieee754@1.2.0": + resolution: + { + integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + } - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + "@xtuc/long@4.2.2": + resolution: + { + integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + } accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + } + engines: { node: ">= 0.6" } acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + resolution: + { + integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, + } deprecated: package has been renamed to acorn-import-attributes peerDependencies: acorn: ^8 acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: ">=0.4.0" } hasBin: true ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + resolution: + { + integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -1108,1630 +1865,2890 @@ packages: optional: true ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + resolution: + { + integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + } peerDependencies: ajv: ^6.9.1 ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + resolution: + { + integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==, + } peerDependencies: ajv: ^8.8.2 ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { + integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + } ajv@8.14.0: - resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + resolution: + { + integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==, + } ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} + resolution: + { + integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==, + } + engines: { "0": node >= 0.8.0 } hasBin: true ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } anywhere@1.6.0: - resolution: {integrity: sha512-X+MpvNGoZNAFsQkyvgBcCdAoz8yHULnW5gfmNrjkGXr6VrtWxsCSlT3bAbbmAE2/umhU9TMF2ffRBL/H2hHvzA==} + resolution: + { + integrity: sha512-X+MpvNGoZNAFsQkyvgBcCdAoz8yHULnW5gfmNrjkGXr6VrtWxsCSlT3bAbbmAE2/umhU9TMF2ffRBL/H2hHvzA==, + } hasBin: true arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==, + } + engines: { node: ">=0.10.0" } arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==, + } + engines: { node: ">=0.10.0" } arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==, + } + engines: { node: ">=0.10.0" } array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + { + integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + } array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==, + } + engines: { node: ">=0.10.0" } assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==, + } + engines: { node: ">=0.10.0" } atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} + resolution: + { + integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, + } + engines: { node: ">= 4.5.0" } hasBin: true autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==, + } + engines: { node: ^10 || ^12 || >=14 } hasBin: true peerDependencies: postcss: ^8.1.0 balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==, + } + engines: { node: ">=0.10.0" } batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + resolution: + { + integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==, + } big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + resolution: + { + integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==, + } binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: ">=8" } body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } bonjour-service@1.2.1: - resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + resolution: + { + integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==, + } boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + { + integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + } bootstrap@5.3.3: - resolution: {integrity: sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==} + resolution: + { + integrity: sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==, + } peerDependencies: - '@popperjs/core': ^2.11.8 + "@popperjs/core": ^2.11.8 brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + } braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==, + } + engines: { node: ">=0.10.0" } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, + } + engines: { node: ">=8" } browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { + integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { + integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + } bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==, + } + engines: { node: ">= 0.8" } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + } + engines: { node: ">= 0.8" } cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==, + } + engines: { node: ">=8" } cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==, + } + engines: { node: ">=0.10.0" } call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + } + engines: { node: ">= 0.4" } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, + } + engines: { node: ">=6" } camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + resolution: + { + integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, + } caniuse-lite@1.0.30001625: - resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} + resolution: + { + integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==, + } chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + } + engines: { node: ">=10" } chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + resolution: + { + integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==, + } cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==, + } + engines: { node: ">= 6" } chevrotain-allstar@0.3.1: - resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + resolution: + { + integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==, + } peerDependencies: chevrotain: ^11.0.0 chevrotain@11.0.3: - resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + resolution: + { + integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==, + } chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==, + } + engines: { node: ">=6.0" } class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==, + } + engines: { node: ">=0.10.0" } clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} + resolution: + { + integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==, + } + engines: { node: ">= 10.0" } cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: ">=6" } clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, + } + engines: { node: ">=6" } collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==, + } + engines: { node: ">=0.10.0" } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + resolution: + { + integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { + integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + } commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + } + engines: { node: ">= 10" } commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + resolution: + { + integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, + } + engines: { node: ">= 12" } component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + resolution: + { + integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==, + } compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, + } + engines: { node: ">= 0.6" } compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==, + } + engines: { node: ">= 0.8.0" } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { + integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + } confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + resolution: + { + integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==, + } connect-history-api-fallback@1.6.0: - resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==, + } + engines: { node: ">=0.8" } connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} + resolution: + { + integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==, + } + engines: { node: ">=0.8" } connect@3.7.0: - resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==, + } + engines: { node: ">= 0.10.0" } content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + } + engines: { node: ">= 0.6" } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + } + engines: { node: ">= 0.6" } cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + resolution: + { + integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + } cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + } + engines: { node: ">= 0.6" } copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==, + } + engines: { node: ">=0.10.0" } copy-webpack-plugin@12.0.2: - resolution: {integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==, + } + engines: { node: ">= 18.12.0" } peerDependencies: webpack: ^5.1.0 core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + } cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + resolution: + { + integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==, + } cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + resolution: + { + integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==, + } cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, + } + engines: { node: ">=14" } peerDependencies: - typescript: '>=4.9.5' + typescript: ">=4.9.5" peerDependenciesMeta: typescript: optional: true cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==, + } + engines: { node: ">= 12.13.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x webpack: ^5.0.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + resolution: + { + integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, + } css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + resolution: + { + integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==, + } css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + resolution: + { + integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + } + engines: { node: ">= 6" } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } hasBin: true csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + resolution: + { + integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==, + } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + resolution: + { + integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==, + } peerDependencies: cytoscape: ^3.2.0 cytoscape-fcose@2.2.0: - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} + resolution: + { + integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==, + } peerDependencies: cytoscape: ^3.2.0 cytoscape@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==, + } + engines: { node: ">=0.10" } d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + resolution: + { + integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==, + } d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==, + } + engines: { node: ">=12" } d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==, + } + engines: { node: ">=12" } d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==, + } + engines: { node: ">=12" } d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==, + } + engines: { node: ">=12" } d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==, + } + engines: { node: ">=12" } d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==, + } + engines: { node: ">=12" } d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==, + } + engines: { node: ">=12" } d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==, + } + engines: { node: ">=12" } d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==, + } + engines: { node: ">=12" } d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==, + } + engines: { node: ">=12" } hasBin: true d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==, + } + engines: { node: ">=12" } d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==, + } + engines: { node: ">=12" } d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==, + } + engines: { node: ">=12" } d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==, + } + engines: { node: ">=12" } d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==, + } + engines: { node: ">=12" } d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==, + } + engines: { node: ">=12" } d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==, + } + engines: { node: ">=12" } d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + resolution: + { + integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==, + } d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==, + } + engines: { node: ">=12" } d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==, + } + engines: { node: ">=12" } d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==, + } + engines: { node: ">=12" } d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==, + } + engines: { node: ">=12" } d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + resolution: + { + integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==, + } d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==, + } + engines: { node: ">=12" } d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==, + } + engines: { node: ">=12" } d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==, + } + engines: { node: ">=12" } d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + resolution: + { + integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==, + } d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==, + } + engines: { node: ">=12" } d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==, + } + engines: { node: ">=12" } d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==, + } + engines: { node: ">=12" } d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==, + } + engines: { node: ">=12" } d3-transition@3.0.1: - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==, + } + engines: { node: ">=12" } peerDependencies: d3-selection: 2 - 3 d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==, + } + engines: { node: ">=12" } d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==, + } + engines: { node: ">=12" } dagre-d3-es@7.0.11: - resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + resolution: + { + integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==, + } dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + resolution: + { + integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==, + } debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + resolution: + { + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==, + } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==, + } + engines: { node: ">=0.10" } deepmerge@1.5.2: - resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==, + } + engines: { node: ">=0.10.0" } default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, + } + engines: { node: ">= 10" } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + } + engines: { node: ">= 0.4" } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + } + engines: { node: ">=8" } define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==, + } + engines: { node: ">=0.10.0" } define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==, + } + engines: { node: ">=0.10.0" } define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==, + } + engines: { node: ">=0.10.0" } delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + resolution: + { + integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==, + } depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, + } + engines: { node: ">= 0.6" } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + } + engines: { node: ">= 0.8" } destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + } + engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + resolution: + { + integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, + } dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==, + } + engines: { node: ">=6" } dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + resolution: + { + integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==, + } dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + resolution: + { + integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, + } dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + resolution: + { + integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, + } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + { + integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + } domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, + } + engines: { node: ">= 4" } domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, + } + engines: { node: ">= 4" } dompurify@3.1.5: - resolution: {integrity: sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==} + resolution: + { + integrity: sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==, + } domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + resolution: + { + integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, + } domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + resolution: + { + integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==, + } dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + resolution: + { + integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, + } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { + integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + } electron-to-chromium@1.4.788: - resolution: {integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==} + resolution: + { + integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==, + } emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + resolution: + { + integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, + } emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==, + } + engines: { node: ">= 4" } encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + } + engines: { node: ">= 0.8" } enhanced-resolve@5.16.1: - resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==, + } + engines: { node: ">=10.13.0" } entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + resolution: + { + integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, + } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, + } + engines: { node: ">=6" } envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==, + } + engines: { node: ">=4" } hasBin: true error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { + integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==, + } es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + } + engines: { node: ">= 0.4" } es-module-lexer@1.5.3: - resolution: {integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==} + resolution: + { + integrity: sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==, + } esbuild-loader@4.0.3: - resolution: {integrity: sha512-YpaSRisj7TSg6maKKKG9OJGGm0BZ7EXeov8J8cXEYdugjlAJ0wL7aj2JactoQvPJ113v2Ar204pdJWrZsAQc8Q==} + resolution: + { + integrity: sha512-YpaSRisj7TSg6maKKKG9OJGGm0BZ7EXeov8J8cXEYdugjlAJ0wL7aj2JactoQvPJ113v2Ar204pdJWrZsAQc8Q==, + } peerDependencies: webpack: ^4.40.0 || ^5.0.0 esbuild@0.19.12: - resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==, + } + engines: { node: ">=12" } hasBin: true esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==, + } + engines: { node: ">=18" } hasBin: true escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + } + engines: { node: ">=6" } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { + integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + } + engines: { node: ">=8.0.0" } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } hasBin: true esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + } + engines: { node: ">=4.0" } estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + } + engines: { node: ">=4.0" } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + } + engines: { node: ">=4.0" } estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + } + engines: { node: ">= 0.6" } eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolution: + { + integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { + integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + } + engines: { node: ">=0.8.x" } execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + } + engines: { node: ">=10" } execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==, + } + engines: { node: ">=0.10.0" } express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} + resolution: + { + integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==, + } + engines: { node: ">= 0.10.0" } extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, + } + engines: { node: ">=0.10.0" } extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==, + } + engines: { node: ">=0.10.0" } extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==, + } + engines: { node: ">=0.10.0" } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { + integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + } fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + } faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, + } + engines: { node: ">=0.8.0" } fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + resolution: + { + integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==, + } fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==, + } + engines: { node: ">=0.10.0" } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, + } + engines: { node: ">=8" } finalhandler@1.1.2: - resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==, + } + engines: { node: ">= 0.8" } finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, + } + engines: { node: ">= 0.8" } flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { + integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + } hasBin: true follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} + resolution: + { + integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, + } + engines: { node: ">=4.0" } peerDependencies: - debug: '*' + debug: "*" peerDependenciesMeta: debug: optional: true for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==, + } + engines: { node: ">=0.10.0" } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + } + engines: { node: ">= 0.6" } fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + resolution: + { + integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, + } fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==, + } + engines: { node: ">=0.10.0" } fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + } + engines: { node: ">= 0.6" } fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + resolution: + { + integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, + } + engines: { node: ">=14.14" } fs-monkey@1.0.6: - resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} + resolution: + { + integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==, + } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { + integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { + integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + } get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, + } + engines: { node: ">=18" } get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + } + engines: { node: ">= 0.4" } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + } + engines: { node: ">=10" } get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + resolution: + { + integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==, + } get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==, + } + engines: { node: ">=0.10.0" } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + resolution: + { + integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + } glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { + integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + } deprecated: Glob versions prior to v9 are no longer supported globby@14.0.1: - resolution: {integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==, + } + engines: { node: ">=18" } gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + resolution: + { + integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + resolution: + { + integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==, + } + engines: { node: ">=6.0" } hachure-fill@0.5.2: - resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + resolution: + { + integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==, + } handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + resolution: + { + integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==, + } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + } + engines: { node: ">=8" } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { + integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + } has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, + } + engines: { node: ">= 0.4" } has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + } + engines: { node: ">= 0.4" } has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==, + } + engines: { node: ">=0.10.0" } has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==, + } + engines: { node: ">=0.10.0" } has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==, + } + engines: { node: ">=0.10.0" } has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==, + } + engines: { node: ">=0.10.0" } hash-sum@2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} + resolution: + { + integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==, + } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + resolution: + { + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, + } hasBin: true hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + resolution: + { + integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==, + } html-entities@2.5.2: - resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + resolution: + { + integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==, + } html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, + } + engines: { node: ">=12" } hasBin: true html-webpack-plugin@5.6.0: - resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==, + } + engines: { node: ">=10.13.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x webpack: ^5.20.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + resolution: + { + integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==, + } htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + resolution: + { + integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==, + } http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + resolution: + { + integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==, + } http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==, + } + engines: { node: ">= 0.6" } http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, + } + engines: { node: ">= 0.8" } http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} + resolution: + { + integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, + } http-proxy-middleware@0.19.2: - resolution: {integrity: sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==} - engines: {node: '>=4.0.0'} + resolution: + { + integrity: sha512-aYk1rTKqLTus23X3L96LGNCGNgWpG4cG0XoZIT1GUPhhulEHX/QalnO6Vbo+WmKWi4AL2IidjuC0wZtbpg0yhQ==, + } + engines: { node: ">=4.0.0" } http-proxy-middleware@2.0.6: - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} + resolution: + { + integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==, + } + engines: { node: ">=12.0.0" } peerDependencies: - '@types/express': ^4.17.13 + "@types/express": ^4.17.13 peerDependenciesMeta: - '@types/express': + "@types/express": optional: true http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} + resolution: + { + integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, + } + engines: { node: ">=8.0.0" } human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { + integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, + } + engines: { node: ">=10.17.0" } human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, + } + engines: { node: ">=0.10.0" } iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, + } + engines: { node: ">=0.10.0" } icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==, + } + engines: { node: ">= 4" } immutable@4.3.6: - resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} + resolution: + { + integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==, + } import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==, + } + engines: { node: ">=6" } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { + integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, + } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + resolution: + { + integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, + } inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, + } internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + resolution: + { + integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==, + } internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==, + } + engines: { node: ">=12" } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, + } + engines: { node: ">= 0.10" } ipaddr.js@2.2.0: - resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} - engines: {node: '>= 10'} + resolution: + { + integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==, + } + engines: { node: ">= 10" } is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==, + } + engines: { node: ">= 0.10" } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { + integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, + } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + resolution: + { + integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==, + } is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==, + } + engines: { node: ">= 0.4" } is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==, + } + engines: { node: ">= 0.4" } is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==, + } + engines: { node: ">= 0.4" } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, + } + engines: { node: ">=8" } hasBin: true is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, + } + engines: { node: ">=0.10.0" } is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==, + } + engines: { node: ">=0.10.0" } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==, + } + engines: { node: ">=12" } is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==, + } + engines: { node: ">=0.10.0" } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==, + } + engines: { node: ">=10" } is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, + } + engines: { node: ">=0.10.0" } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, + } + engines: { node: ">=8" } is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, + } + engines: { node: ">=12" } is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==, + } + engines: { node: ">=18" } is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==, + } + engines: { node: ">=0.10.0" } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, + } + engines: { node: ">=8" } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, + } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==, + } + engines: { node: ">=0.10.0" } isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, + } + engines: { node: ">=0.10.0" } javascript-stringify@2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + resolution: + { + integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==, + } jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, + } + engines: { node: ">= 10.13.0" } jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + resolution: + { + integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, + } hasBin: true jquery@3.7.1: - resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} + resolution: + { + integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==, + } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } hasBin: true js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } hasBin: true json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { + integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, + } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { + integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, + } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { + integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, + } json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, + } + engines: { node: ">=6" } hasBin: true jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} + resolution: + { + integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==, + } hasBin: true khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + resolution: + { + integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==, + } kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==, + } + engines: { node: ">=0.10.0" } kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==, + } + engines: { node: ">=0.10.0" } kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: ">=0.10.0" } kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + resolution: + { + integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==, + } langium@3.0.0: - resolution: {integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==} - engines: {node: '>=16.0.0'} + resolution: + { + integrity: sha512-+Ez9EoiByeoTu/2BXmEaZ06iPNXM6thWJp02KfBO/raSMyCJ4jw7AkWWa+zBCTm0+Tw1Fj9FOxdqSskyN5nAwg==, + } + engines: { node: ">=16.0.0" } launch-editor@2.6.1: - resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} + resolution: + { + integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==, + } layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + resolution: + { + integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==, + } layout-base@2.0.1: - resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + resolution: + { + integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==, + } lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==, + } + engines: { node: ">=14" } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + resolution: + { + integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==, + } loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + resolution: + { + integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, + } + engines: { node: ">=6.11.5" } loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} + resolution: + { + integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==, + } + engines: { node: ">=8.9.0" } local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==, + } + engines: { node: ">=14" } lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + resolution: + { + integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==, + } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { + integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, + } log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==, + } + engines: { node: ">=18" } lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + resolution: + { + integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, + } magic-string@0.30.10: - resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + resolution: + { + integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, + } map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==, + } + engines: { node: ">=0.10.0" } map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==, + } + engines: { node: ">=0.10.0" } markdown-it-anchor@8.6.7: - resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} + resolution: + { + integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==, + } peerDependencies: - '@types/markdown-it': '*' - markdown-it: '*' + "@types/markdown-it": "*" + markdown-it: "*" markdown-it-container@4.0.0: - resolution: {integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==} + resolution: + { + integrity: sha512-HaNccxUH0l7BNGYbFbjmGpf5aLHAMTinqRZQAEQbMr2cdD3z91Q6kIo1oUn1CQndkT03jat6ckrdRYuwwqLlQw==, + } markdown-it-emoji@3.0.0: - resolution: {integrity: sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==} + resolution: + { + integrity: sha512-+rUD93bXHubA4arpEZO3q80so0qgoFJEKRkRbjKX8RTdca89v2kfyF+xR3i2sQTwql9tpPZPOQN5B+PunspXRg==, + } markdown-it-footnote@4.0.0: - resolution: {integrity: sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==} + resolution: + { + integrity: sha512-WYJ7urf+khJYl3DqofQpYfEYkZKbmXmwxQV8c8mO/hGIhgZ1wOe7R4HLFNwqx7TjILbnC98fuyeSsin19JdFcQ==, + } markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + resolution: + { + integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==, + } hasBin: true marked@13.0.3: - resolution: {integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==, + } + engines: { node: ">= 18" } hasBin: true mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + resolution: + { + integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==, + } mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + resolution: + { + integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==, + } media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, + } + engines: { node: ">= 0.6" } medium-zoom@1.1.0: - resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} + resolution: + { + integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==, + } memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + resolution: + { + integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, + } + engines: { node: ">= 4.0.0" } merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + resolution: + { + integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, + } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } mermaid@11.4.0: - resolution: {integrity: sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA==} + resolution: + { + integrity: sha512-mxCfEYvADJqOiHfGpJXLs4/fAjHz448rH0pfY5fAoxiz70rQiDSzUUy4dNET2T08i46IVpjohPd6WWbzmRHiPA==, + } methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, + } + engines: { node: ">= 0.6" } micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==, + } + engines: { node: ">=0.10.0" } micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==, + } + engines: { node: ">=8.6" } mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, + } + engines: { node: ">= 0.6" } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, + } + engines: { node: ">= 0.6" } mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, + } + engines: { node: ">=4" } hasBin: true mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } mini-css-extract-plugin@2.9.0: - resolution: {integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==, + } + engines: { node: ">= 12.13.0" } peerDependencies: webpack: ^5.0.0 minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + resolution: + { + integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, + } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { + integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, + } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { + integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, + } mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==, + } + engines: { node: ">=0.10.0" } mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + resolution: + { + integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==, + } ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { + integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, + } ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, + } multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + resolution: + { + integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==, + } hasBin: true nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, + } + engines: { node: ">=0.10.0" } negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, + } + engines: { node: ">= 0.6" } neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { + integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, + } no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + resolution: + { + integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, + } node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + resolution: + { + integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, + } + engines: { node: ">= 6.13.0" } node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: ">=0.10.0" } npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, + } + engines: { node: ">=8" } npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + resolution: + { + integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, + } object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==, + } + engines: { node: ">=0.10.0" } object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + resolution: + { + integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, + } object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==, + } + engines: { node: ">=0.10.0" } object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==, + } + engines: { node: ">=0.10.0" } obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + resolution: + { + integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==, + } on-finished@2.3.0: - resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, + } + engines: { node: ">= 0.8" } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, + } + engines: { node: ">= 0.8" } on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, + } + engines: { node: ">= 0.8" } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { + integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, + } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, + } + engines: { node: ">=12" } ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==, + } + engines: { node: ">=18" } p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, + } + engines: { node: ">=8" } package-manager-detector@0.2.0: - resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + resolution: + { + integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==, + } param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + resolution: + { + integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, + } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, + } + engines: { node: ">=6" } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, + } + engines: { node: ">=8" } parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + resolution: + { + integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==, + } parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + resolution: + { + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, + } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, + } + engines: { node: ">= 0.8" } pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + resolution: + { + integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, + } pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==, + } + engines: { node: ">=0.10.0" } path-data-parser@0.1.0: - resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + resolution: + { + integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==, + } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, + } + engines: { node: ">=0.10.0" } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + resolution: + { + integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, + } path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==, + } + engines: { node: ">=12" } pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + resolution: + { + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, + } picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + resolution: + { + integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==, + } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } pkg-types@1.2.0: - resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + resolution: + { + integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==, + } points-on-curve@0.2.0: - resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} + resolution: + { + integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==, + } points-on-path@0.2.1: - resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + resolution: + { + integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==, + } posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==, + } + engines: { node: ">=0.10.0" } postcss-csso@6.0.1: - resolution: {integrity: sha512-ZV4yEziMrx6CEiqabGLrDva0pMD7Fbw7yP+LzJvaynM4OJgTssGN6dHiMsJMJdpmNaLJltXVLsrb/5sxbFa8sA==} - engines: {node: ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + resolution: + { + integrity: sha512-ZV4yEziMrx6CEiqabGLrDva0pMD7Fbw7yP+LzJvaynM4OJgTssGN6dHiMsJMJdpmNaLJltXVLsrb/5sxbFa8sA==, + } + engines: { node: ^12.20.0 || ^14.13.0 || >=15.0.0, npm: ">=7.0.0" } peerDependencies: postcss: ^8.0.0 postcss-load-config@5.1.0: - resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} - engines: {node: '>= 18'} + resolution: + { + integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==, + } + engines: { node: ">= 18" } peerDependencies: - jiti: '>=1.21.0' - postcss: '>=8.0.9' + jiti: ">=1.21.0" + postcss: ">=8.0.9" tsx: ^4.8.1 peerDependenciesMeta: jiti: @@ -2742,207 +4759,351 @@ packages: optional: true postcss-loader@8.1.1: - resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==, + } + engines: { node: ">= 18.12.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true webpack: optional: true postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-local-by-default@4.0.5: - resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-scope@3.2.0: - resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} + resolution: + { + integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, + } + engines: { node: ^10 || ^12 || >= 14 } peerDependencies: postcss: ^8.1.0 postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==, + } + engines: { node: ">=4" } postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, + } + engines: { node: ^10 || ^12 || >=14 } prettier@3.4.1: - resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==, + } + engines: { node: ">=14" } hasBin: true pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + resolution: + { + integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==, + } prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, + } + engines: { node: ">=6" } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, + } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, + } + engines: { node: ">= 0.10" } punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==, + } + engines: { node: ">=6" } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, + } + engines: { node: ">=6" } qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, + } + engines: { node: ">=0.6" } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { + integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, + } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, + } + engines: { node: ">= 0.6" } raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, + } + engines: { node: ">= 0.8" } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, + } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { + integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, + } + engines: { node: ">= 6" } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==, + } + engines: { node: ">=0.10.0" } relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} + resolution: + { + integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, + } + engines: { node: ">= 0.10" } renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + resolution: + { + integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==, + } repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==, + } + engines: { node: ">=0.10.0" } repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==, + } + engines: { node: ">=0.10" } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + } + engines: { node: ">=0.10.0" } requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolution: + { + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, + } + engines: { node: ">=4" } resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { + integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, + } resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + resolution: + { + integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==, + } deprecated: https://github.com/lydell/resolve-url#deprecated restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { + integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} + resolution: + { + integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==, + } + engines: { node: ">=0.12" } retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} + resolution: + { + integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + } + engines: { node: ">= 4" } reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + { + integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + } deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + resolution: + { + integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==, + } rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { + integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true roughjs@4.6.6: - resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} + resolution: + { + integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==, + } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + resolution: + { + integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==, + } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { + integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + } safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + resolution: + { + integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==, + } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: + { + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + } sass-loader@14.2.1: - resolution: {integrity: sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==} - engines: {node: '>= 18.12.0'} + resolution: + { + integrity: sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==, + } + engines: { node: ">= 18.12.0" } peerDependencies: - '@rspack/core': 0.x || 1.x + "@rspack/core": 0.x || 1.x node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 sass: ^1.3.0 - sass-embedded: '*' + sass-embedded: "*" webpack: ^5.0.0 peerDependenciesMeta: - '@rspack/core': + "@rspack/core": optional: true node-sass: optional: true @@ -2954,248 +5115,434 @@ packages: optional: true sass@1.77.4: - resolution: {integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==, + } + engines: { node: ">=14.0.0" } hasBin: true sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + resolution: + { + integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==, + } schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, + } + engines: { node: ">= 10.13.0" } schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==, + } + engines: { node: ">= 12.13.0" } section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==, + } + engines: { node: ">=4" } select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + resolution: + { + integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==, + } selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + } + engines: { node: ">=10" } semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==, + } + engines: { node: ">=10" } hasBin: true send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, + } + engines: { node: ">= 0.8.0" } serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + resolution: + { + integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, + } serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==, + } + engines: { node: ">= 0.8.0" } serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + resolution: + { + integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, + } + engines: { node: ">= 0.8.0" } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + } + engines: { node: ">= 0.4" } set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==, + } + engines: { node: ">=0.10.0" } setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + resolution: + { + integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==, + } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + } shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, + } + engines: { node: ">=8" } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + } + engines: { node: ">=8" } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + } + engines: { node: ">=8" } shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + resolution: + { + integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, + } shikiji-core@0.10.2: - resolution: {integrity: sha512-9Of8HMlF96usXJHmCL3Gd0Fcf0EcyJUF9m8EoAKKd98mHXi0La2AZl1h6PegSFGtiYcBDK/fLuKbDa1l16r1fA==} + resolution: + { + integrity: sha512-9Of8HMlF96usXJHmCL3Gd0Fcf0EcyJUF9m8EoAKKd98mHXi0La2AZl1h6PegSFGtiYcBDK/fLuKbDa1l16r1fA==, + } deprecated: Deprecated, use @shikijs/core instead shikiji@0.10.2: - resolution: {integrity: sha512-wtZg3T0vtYV2PnqusWQs3mDaJBdCPWxFDrBM/SE5LfrX92gjUvfEMlc+vJnoKY6Z/S44OWaCRzNIsdBRWcTAiw==} + resolution: + { + integrity: sha512-wtZg3T0vtYV2PnqusWQs3mDaJBdCPWxFDrBM/SE5LfrX92gjUvfEMlc+vJnoKY6Z/S44OWaCRzNIsdBRWcTAiw==, + } deprecated: Deprecated, use shiki instead side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + resolution: + { + integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + } + engines: { node: ">= 0.4" } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } sitemap@7.1.2: - resolution: {integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} + resolution: + { + integrity: sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==, + } + engines: { node: ">=12.0.0", npm: ">=5.6.0" } hasBin: true slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} + resolution: + { + integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==, + } + engines: { node: ">=14.16" } snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==, + } + engines: { node: ">=0.10.0" } snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==, + } + engines: { node: ">=0.10.0" } snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==, + } + engines: { node: ">=0.10.0" } sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + resolution: + { + integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==, + } source-list-map@2.0.1: - resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + resolution: + { + integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==, + } source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, + } + engines: { node: ">=0.10.0" } source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + resolution: + { + integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==, + } deprecated: See https://github.com/lydell/source-map-resolve#deprecated source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { + integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + } source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + resolution: + { + integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==, + } deprecated: See https://github.com/lydell/source-map-url#deprecated source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, + } + engines: { node: ">=0.10.0" } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + } + engines: { node: ">=0.10.0" } spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + resolution: + { + integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==, + } spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} + resolution: + { + integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==, + } + engines: { node: ">=6.0.0" } split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==, + } + engines: { node: ">=0.10.0" } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==, + } + engines: { node: ">=0.10.0" } statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, + } + engines: { node: ">= 0.6" } statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + } + engines: { node: ">= 0.8" } stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==, + } + engines: { node: ">=18" } string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==, + } + engines: { node: ">=18" } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + } + engines: { node: ">=8" } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==, + } + engines: { node: ">=0.10.0" } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + } + engines: { node: ">=6" } strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } striptags@3.2.0: - resolution: {integrity: sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==} + resolution: + { + integrity: sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==, + } style-loader@3.3.4: - resolution: {integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==, + } + engines: { node: ">= 12.13.0" } peerDependencies: webpack: ^5.0.0 stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + resolution: + { + integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==, + } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + } + engines: { node: ">=8" } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + } + engines: { node: ">=10" } tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: ">=6" } terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} + resolution: + { + integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==, + } + engines: { node: ">= 10.13.0" } peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' + "@swc/core": "*" + esbuild: "*" + uglify-js: "*" webpack: ^5.1.0 peerDependenciesMeta: - '@swc/core': + "@swc/core": optional: true esbuild: optional: true @@ -3203,145 +5550,247 @@ packages: optional: true terser@5.31.0: - resolution: {integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==, + } + engines: { node: ">=10" } hasBin: true thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + resolution: + { + integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==, + } tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + resolution: + { + integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==, + } to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==, + } + engines: { node: ">=0.10.0" } to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==, + } + engines: { node: ">=0.10.0" } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==, + } + engines: { node: ">=0.10.0" } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + } + engines: { node: ">=0.6" } ts-debounce@4.0.0: - resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==} + resolution: + { + integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==, + } ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} + resolution: + { + integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==, + } + engines: { node: ">=6.10" } tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + } + engines: { node: ">= 0.6" } typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==, + } + engines: { node: ">=14.17" } hasBin: true uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + resolution: + { + integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==, + } ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + resolution: + { + integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==, + } undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + resolution: + { + integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, + } unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + resolution: + { + integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==, + } + engines: { node: ">=18" } union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==, + } + engines: { node: ">=0.10.0" } universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: ">= 10.0.0" } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + } + engines: { node: ">= 0.8" } unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==, + } + engines: { node: ">=0.10.0" } upath@2.0.1: - resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, + } + engines: { node: ">=4" } update-browserslist-db@1.0.16: - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + resolution: + { + integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==, + } hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { + integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + } urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + resolution: + { + integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==, + } deprecated: Please see https://github.com/lydell/urix#deprecated use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==, + } + engines: { node: ">=0.10.0" } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + resolution: + { + integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==, + } utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + { + integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + } + engines: { node: ">= 0.4.0" } uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + resolution: + { + integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + } hasBin: true uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + resolution: + { + integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==, + } hasBin: true vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} + resolution: + { + integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + } + engines: { node: ">= 0.8" } vite@5.0.13: - resolution: {integrity: sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==} - engines: {node: ^18.0.0 || >=20.0.0} + resolution: + { + integrity: sha512-/9ovhv2M2dGTuA+dY93B9trfyWMDRQw2jdVBhHNP6wr0oF34wG2i/N55801iZIpgUpnHDm4F/FabGQLyc+eOgg==, + } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' + sass: "*" + stylus: "*" + sugarss: "*" terser: ^5.4.0 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true less: optional: true @@ -3357,131 +5806,194 @@ packages: optional: true vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} + resolution: + { + integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==, + } + engines: { node: ">=14.0.0" } vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + resolution: + { + integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==, + } vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + resolution: + { + integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==, + } vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + resolution: + { + integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==, + } hasBin: true vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } vue-class-component@7.2.6: - resolution: {integrity: sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==} + resolution: + { + integrity: sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==, + } peerDependencies: vue: ^2.0.0 vue-demi@0.14.10: - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} + resolution: + { + integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==, + } + engines: { node: ">=12" } hasBin: true peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 + "@vue/composition-api": ^1.0.0-rc.1 vue: ^3.0.0-0 || ^2.6.0 peerDependenciesMeta: - '@vue/composition-api': + "@vue/composition-api": optional: true vue-loader@17.4.2: - resolution: {integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==} + resolution: + { + integrity: sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w==, + } peerDependencies: - '@vue/compiler-sfc': '*' - vue: '*' + "@vue/compiler-sfc": "*" + vue: "*" webpack: ^4.1.0 || ^5.0.0-0 peerDependenciesMeta: - '@vue/compiler-sfc': + "@vue/compiler-sfc": optional: true vue: optional: true vue-property-decorator@9.1.2: - resolution: {integrity: sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==} + resolution: + { + integrity: sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==, + } peerDependencies: - vue: '*' - vue-class-component: '*' + vue: "*" + vue-class-component: "*" vue-router@4.3.2: - resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==} + resolution: + { + integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==, + } peerDependencies: vue: ^3.2.0 vue@3.3.13: - resolution: {integrity: sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==} + resolution: + { + integrity: sha512-LDnUpQvDgsfc0u/YgtAgTMXJlJQqjkxW1PVcOnJA5cshPleULDjHi7U45pl2VJYazSSvLH8UKcid/kzH8I0a0Q==, + } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true vue@3.4.27: - resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} + resolution: + { + integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==, + } peerDependencies: - typescript: '*' + typescript: "*" peerDependenciesMeta: typescript: optional: true vuepress-plugin-i18n@https://codeload.github.com/XTLS/vuepress-plugin-i18n/tar.gz/5ae5b2d: - resolution: {tarball: https://codeload.github.com/XTLS/vuepress-plugin-i18n/tar.gz/5ae5b2d} + resolution: + { + tarball: https://codeload.github.com/XTLS/vuepress-plugin-i18n/tar.gz/5ae5b2d, + } version: 0.8.4 peerDependencies: vuepress: 2.0.0-rc.2 vuepress-shared@2.0.0-rc.15: - resolution: {integrity: sha512-PzuXgAlzTrD6b6pCaeSb65CD5ponpD86IF+xaCxWrQDAQWk4zSY2brPk6seS10i2teZFNqVeyY8ERoC27HOzcg==} - engines: {node: '>=18.16.0', npm: '>=8', pnpm: '>=7', yarn: '>=2'} + resolution: + { + integrity: sha512-PzuXgAlzTrD6b6pCaeSb65CD5ponpD86IF+xaCxWrQDAQWk4zSY2brPk6seS10i2teZFNqVeyY8ERoC27HOzcg==, + } + engines: { node: ">=18.16.0", npm: ">=8", pnpm: ">=7", yarn: ">=2" } peerDependencies: vuepress: 2.0.0-rc.2 vuepress@2.0.0-rc.2: - resolution: {integrity: sha512-OEHfXx4Q3IzkXqcY9bKZqHXYAnSR82AGrmWYX5R1I3+ntzjaAbUhUKbG/jjMzLg40XqAHS++pM/zzMBNrcY3rg==} - engines: {node: '>=18.16.0'} + resolution: + { + integrity: sha512-OEHfXx4Q3IzkXqcY9bKZqHXYAnSR82AGrmWYX5R1I3+ntzjaAbUhUKbG/jjMzLg40XqAHS++pM/zzMBNrcY3rg==, + } + engines: { node: ">=18.16.0" } hasBin: true peerDependencies: - '@vuepress/bundler-vite': 2.0.0-rc.2 - '@vuepress/bundler-webpack': 2.0.0-rc.2 + "@vuepress/bundler-vite": 2.0.0-rc.2 + "@vuepress/bundler-webpack": 2.0.0-rc.2 vue: ^3.4.0 peerDependenciesMeta: - '@vuepress/bundler-vite': + "@vuepress/bundler-vite": optional: true - '@vuepress/bundler-webpack': + "@vuepress/bundler-webpack": optional: true watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==, + } + engines: { node: ">=10.13.0" } wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + resolution: + { + integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==, + } webpack-chain@6.5.1: - resolution: {integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==, + } + engines: { node: ">=8" } deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. webpack-dev-middleware@5.3.4: - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==, + } + engines: { node: ">= 12.13.0" } peerDependencies: webpack: ^4.0.0 || ^5.0.0 webpack-dev-server@4.15.2: - resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} - engines: {node: '>= 12.13.0'} + resolution: + { + integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==, + } + engines: { node: ">= 12.13.0" } hasBin: true peerDependencies: webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' + webpack-cli: "*" peerDependenciesMeta: webpack: optional: true @@ -3489,51 +6001,81 @@ packages: optional: true webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==, + } + engines: { node: ">=10.0.0" } webpack-sources@1.4.3: - resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + resolution: + { + integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==, + } webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, + } + engines: { node: ">=10.13.0" } webpack@5.91.0: - resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==, + } + engines: { node: ">=10.13.0" } hasBin: true peerDependencies: - webpack-cli: '*' + webpack-cli: "*" peerDependenciesMeta: webpack-cli: optional: true websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, + } + engines: { node: ">=0.8.0" } websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} + resolution: + { + integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, + } + engines: { node: ">=0.8.0" } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } hasBin: true wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + resolution: + { + integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==, + } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { + integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, + } ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==, + } + engines: { node: ">=10.0.0" } peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true @@ -3541,212 +6083,214 @@ packages: optional: true yaml@2.4.2: - resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} - engines: {node: '>= 14'} + resolution: + { + integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==, + } + engines: { node: ">= 14" } hasBin: true snapshots: - - '@antfu/install-pkg@0.4.1': + "@antfu/install-pkg@0.4.1": dependencies: package-manager-detector: 0.2.0 tinyexec: 0.3.0 - '@antfu/utils@0.7.10': {} + "@antfu/utils@0.7.10": {} - '@babel/code-frame@7.24.6': + "@babel/code-frame@7.24.6": dependencies: - '@babel/highlight': 7.24.6 + "@babel/highlight": 7.24.6 picocolors: 1.0.1 - '@babel/helper-string-parser@7.24.6': {} + "@babel/helper-string-parser@7.24.6": {} - '@babel/helper-validator-identifier@7.24.6': {} + "@babel/helper-validator-identifier@7.24.6": {} - '@babel/highlight@7.24.6': + "@babel/highlight@7.24.6": dependencies: - '@babel/helper-validator-identifier': 7.24.6 + "@babel/helper-validator-identifier": 7.24.6 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 - '@babel/parser@7.24.6': + "@babel/parser@7.24.6": dependencies: - '@babel/types': 7.24.6 + "@babel/types": 7.24.6 - '@babel/types@7.24.6': + "@babel/types@7.24.6": dependencies: - '@babel/helper-string-parser': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + "@babel/helper-string-parser": 7.24.6 + "@babel/helper-validator-identifier": 7.24.6 to-fast-properties: 2.0.0 - '@braintree/sanitize-url@7.1.0': {} + "@braintree/sanitize-url@7.1.0": {} - '@chevrotain/cst-dts-gen@11.0.3': + "@chevrotain/cst-dts-gen@11.0.3": dependencies: - '@chevrotain/gast': 11.0.3 - '@chevrotain/types': 11.0.3 + "@chevrotain/gast": 11.0.3 + "@chevrotain/types": 11.0.3 lodash-es: 4.17.21 - '@chevrotain/gast@11.0.3': + "@chevrotain/gast@11.0.3": dependencies: - '@chevrotain/types': 11.0.3 + "@chevrotain/types": 11.0.3 lodash-es: 4.17.21 - '@chevrotain/regexp-to-ast@11.0.3': {} + "@chevrotain/regexp-to-ast@11.0.3": {} - '@chevrotain/types@11.0.3': {} + "@chevrotain/types@11.0.3": {} - '@chevrotain/utils@11.0.3': {} + "@chevrotain/utils@11.0.3": {} - '@esbuild/aix-ppc64@0.19.12': + "@esbuild/aix-ppc64@0.19.12": optional: true - '@esbuild/aix-ppc64@0.24.0': + "@esbuild/aix-ppc64@0.24.0": optional: true - '@esbuild/android-arm64@0.19.12': + "@esbuild/android-arm64@0.19.12": optional: true - '@esbuild/android-arm64@0.24.0': + "@esbuild/android-arm64@0.24.0": optional: true - '@esbuild/android-arm@0.19.12': + "@esbuild/android-arm@0.19.12": optional: true - '@esbuild/android-arm@0.24.0': + "@esbuild/android-arm@0.24.0": optional: true - '@esbuild/android-x64@0.19.12': + "@esbuild/android-x64@0.19.12": optional: true - '@esbuild/android-x64@0.24.0': + "@esbuild/android-x64@0.24.0": optional: true - '@esbuild/darwin-arm64@0.19.12': + "@esbuild/darwin-arm64@0.19.12": optional: true - '@esbuild/darwin-arm64@0.24.0': + "@esbuild/darwin-arm64@0.24.0": optional: true - '@esbuild/darwin-x64@0.19.12': + "@esbuild/darwin-x64@0.19.12": optional: true - '@esbuild/darwin-x64@0.24.0': + "@esbuild/darwin-x64@0.24.0": optional: true - '@esbuild/freebsd-arm64@0.19.12': + "@esbuild/freebsd-arm64@0.19.12": optional: true - '@esbuild/freebsd-arm64@0.24.0': + "@esbuild/freebsd-arm64@0.24.0": optional: true - '@esbuild/freebsd-x64@0.19.12': + "@esbuild/freebsd-x64@0.19.12": optional: true - '@esbuild/freebsd-x64@0.24.0': + "@esbuild/freebsd-x64@0.24.0": optional: true - '@esbuild/linux-arm64@0.19.12': + "@esbuild/linux-arm64@0.19.12": optional: true - '@esbuild/linux-arm64@0.24.0': + "@esbuild/linux-arm64@0.24.0": optional: true - '@esbuild/linux-arm@0.19.12': + "@esbuild/linux-arm@0.19.12": optional: true - '@esbuild/linux-arm@0.24.0': + "@esbuild/linux-arm@0.24.0": optional: true - '@esbuild/linux-ia32@0.19.12': + "@esbuild/linux-ia32@0.19.12": optional: true - '@esbuild/linux-ia32@0.24.0': + "@esbuild/linux-ia32@0.24.0": optional: true - '@esbuild/linux-loong64@0.19.12': + "@esbuild/linux-loong64@0.19.12": optional: true - '@esbuild/linux-loong64@0.24.0': + "@esbuild/linux-loong64@0.24.0": optional: true - '@esbuild/linux-mips64el@0.19.12': + "@esbuild/linux-mips64el@0.19.12": optional: true - '@esbuild/linux-mips64el@0.24.0': + "@esbuild/linux-mips64el@0.24.0": optional: true - '@esbuild/linux-ppc64@0.19.12': + "@esbuild/linux-ppc64@0.19.12": optional: true - '@esbuild/linux-ppc64@0.24.0': + "@esbuild/linux-ppc64@0.24.0": optional: true - '@esbuild/linux-riscv64@0.19.12': + "@esbuild/linux-riscv64@0.19.12": optional: true - '@esbuild/linux-riscv64@0.24.0': + "@esbuild/linux-riscv64@0.24.0": optional: true - '@esbuild/linux-s390x@0.19.12': + "@esbuild/linux-s390x@0.19.12": optional: true - '@esbuild/linux-s390x@0.24.0': + "@esbuild/linux-s390x@0.24.0": optional: true - '@esbuild/linux-x64@0.19.12': + "@esbuild/linux-x64@0.19.12": optional: true - '@esbuild/linux-x64@0.24.0': + "@esbuild/linux-x64@0.24.0": optional: true - '@esbuild/netbsd-x64@0.19.12': + "@esbuild/netbsd-x64@0.19.12": optional: true - '@esbuild/netbsd-x64@0.24.0': + "@esbuild/netbsd-x64@0.24.0": optional: true - '@esbuild/openbsd-arm64@0.24.0': + "@esbuild/openbsd-arm64@0.24.0": optional: true - '@esbuild/openbsd-x64@0.19.12': + "@esbuild/openbsd-x64@0.19.12": optional: true - '@esbuild/openbsd-x64@0.24.0': + "@esbuild/openbsd-x64@0.24.0": optional: true - '@esbuild/sunos-x64@0.19.12': + "@esbuild/sunos-x64@0.19.12": optional: true - '@esbuild/sunos-x64@0.24.0': + "@esbuild/sunos-x64@0.24.0": optional: true - '@esbuild/win32-arm64@0.19.12': + "@esbuild/win32-arm64@0.19.12": optional: true - '@esbuild/win32-arm64@0.24.0': + "@esbuild/win32-arm64@0.24.0": optional: true - '@esbuild/win32-ia32@0.19.12': + "@esbuild/win32-ia32@0.19.12": optional: true - '@esbuild/win32-ia32@0.24.0': + "@esbuild/win32-ia32@0.24.0": optional: true - '@esbuild/win32-x64@0.19.12': + "@esbuild/win32-x64@0.19.12": optional: true - '@esbuild/win32-x64@0.24.0': + "@esbuild/win32-x64@0.24.0": optional: true - '@iconify/types@2.0.0': {} + "@iconify/types@2.0.0": {} - '@iconify/utils@2.1.33': + "@iconify/utils@2.1.33": dependencies: - '@antfu/install-pkg': 0.4.1 - '@antfu/utils': 0.7.10 - '@iconify/types': 2.0.0 + "@antfu/install-pkg": 0.4.1 + "@antfu/utils": 0.7.10 + "@iconify/types": 2.0.0 debug: 4.3.7 kolorist: 1.8.0 local-pkg: 0.5.0 @@ -3754,550 +6298,550 @@ snapshots: transitivePeerDependencies: - supports-color - '@jridgewell/gen-mapping@0.3.5': + "@jridgewell/gen-mapping@0.3.5": dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.25 - '@jridgewell/resolve-uri@3.1.2': {} + "@jridgewell/resolve-uri@3.1.2": {} - '@jridgewell/set-array@1.2.1': {} + "@jridgewell/set-array@1.2.1": {} - '@jridgewell/source-map@0.3.6': + "@jridgewell/source-map@0.3.6": dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 - '@jridgewell/sourcemap-codec@1.4.15': {} + "@jridgewell/sourcemap-codec@1.4.15": {} - '@jridgewell/trace-mapping@0.3.25': + "@jridgewell/trace-mapping@0.3.25": dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 - '@leichtgewicht/ip-codec@2.0.5': {} + "@leichtgewicht/ip-codec@2.0.5": {} - '@mdit-vue/plugin-component@2.1.3': + "@mdit-vue/plugin-component@2.1.3": dependencies: - '@types/markdown-it': 14.1.1 + "@types/markdown-it": 14.1.1 markdown-it: 14.1.0 - '@mdit-vue/plugin-frontmatter@2.1.3': + "@mdit-vue/plugin-frontmatter@2.1.3": dependencies: - '@mdit-vue/types': 2.1.0 - '@types/markdown-it': 14.1.1 + "@mdit-vue/types": 2.1.0 + "@types/markdown-it": 14.1.1 gray-matter: 4.0.3 markdown-it: 14.1.0 - '@mdit-vue/plugin-headers@2.1.3': + "@mdit-vue/plugin-headers@2.1.3": dependencies: - '@mdit-vue/shared': 2.1.3 - '@mdit-vue/types': 2.1.0 - '@types/markdown-it': 14.1.1 + "@mdit-vue/shared": 2.1.3 + "@mdit-vue/types": 2.1.0 + "@types/markdown-it": 14.1.1 markdown-it: 14.1.0 - '@mdit-vue/plugin-sfc@2.1.3': + "@mdit-vue/plugin-sfc@2.1.3": dependencies: - '@mdit-vue/types': 2.1.0 - '@types/markdown-it': 14.1.1 + "@mdit-vue/types": 2.1.0 + "@types/markdown-it": 14.1.1 markdown-it: 14.1.0 - '@mdit-vue/plugin-title@2.1.3': + "@mdit-vue/plugin-title@2.1.3": dependencies: - '@mdit-vue/shared': 2.1.3 - '@mdit-vue/types': 2.1.0 - '@types/markdown-it': 14.1.1 + "@mdit-vue/shared": 2.1.3 + "@mdit-vue/types": 2.1.0 + "@types/markdown-it": 14.1.1 markdown-it: 14.1.0 - '@mdit-vue/plugin-toc@2.1.3': + "@mdit-vue/plugin-toc@2.1.3": dependencies: - '@mdit-vue/shared': 2.1.3 - '@mdit-vue/types': 2.1.0 - '@types/markdown-it': 14.1.1 + "@mdit-vue/shared": 2.1.3 + "@mdit-vue/types": 2.1.0 + "@types/markdown-it": 14.1.1 markdown-it: 14.1.0 - '@mdit-vue/shared@2.1.3': + "@mdit-vue/shared@2.1.3": dependencies: - '@mdit-vue/types': 2.1.0 - '@types/markdown-it': 14.1.1 + "@mdit-vue/types": 2.1.0 + "@types/markdown-it": 14.1.1 markdown-it: 14.1.0 - '@mdit-vue/types@2.1.0': {} + "@mdit-vue/types@2.1.0": {} - '@mermaid-js/parser@0.3.0': + "@mermaid-js/parser@0.3.0": dependencies: langium: 3.0.0 - '@nodelib/fs.scandir@2.1.5': + "@nodelib/fs.scandir@2.1.5": dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + "@nodelib/fs.stat@2.0.5": {} - '@nodelib/fs.walk@1.2.8': + "@nodelib/fs.walk@1.2.8": dependencies: - '@nodelib/fs.scandir': 2.1.5 + "@nodelib/fs.scandir": 2.1.5 fastq: 1.17.1 - '@popperjs/core@2.11.8': {} + "@popperjs/core@2.11.8": {} - '@rollup/rollup-android-arm-eabi@4.18.0': + "@rollup/rollup-android-arm-eabi@4.18.0": optional: true - '@rollup/rollup-android-arm64@4.18.0': + "@rollup/rollup-android-arm64@4.18.0": optional: true - '@rollup/rollup-darwin-arm64@4.18.0': + "@rollup/rollup-darwin-arm64@4.18.0": optional: true - '@rollup/rollup-darwin-x64@4.18.0': + "@rollup/rollup-darwin-x64@4.18.0": optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + "@rollup/rollup-linux-arm-gnueabihf@4.18.0": optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': + "@rollup/rollup-linux-arm-musleabihf@4.18.0": optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': + "@rollup/rollup-linux-arm64-gnu@4.18.0": optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': + "@rollup/rollup-linux-arm64-musl@4.18.0": optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': + "@rollup/rollup-linux-riscv64-gnu@4.18.0": optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': + "@rollup/rollup-linux-s390x-gnu@4.18.0": optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': + "@rollup/rollup-linux-x64-gnu@4.18.0": optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': + "@rollup/rollup-linux-x64-musl@4.18.0": optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': + "@rollup/rollup-win32-arm64-msvc@4.18.0": optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': + "@rollup/rollup-win32-ia32-msvc@4.18.0": optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': + "@rollup/rollup-win32-x64-msvc@4.18.0": optional: true - '@sindresorhus/merge-streams@2.3.0': {} + "@sindresorhus/merge-streams@2.3.0": {} - '@types/body-parser@1.19.5': + "@types/body-parser@1.19.5": dependencies: - '@types/connect': 3.4.38 - '@types/node': 22.10.1 + "@types/connect": 3.4.38 + "@types/node": 22.10.1 - '@types/bonjour@3.5.13': + "@types/bonjour@3.5.13": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@types/bootstrap@5.2.10': + "@types/bootstrap@5.2.10": dependencies: - '@popperjs/core': 2.11.8 + "@popperjs/core": 2.11.8 - '@types/connect-history-api-fallback@1.5.4': + "@types/connect-history-api-fallback@1.5.4": dependencies: - '@types/express-serve-static-core': 4.19.3 - '@types/node': 22.10.1 + "@types/express-serve-static-core": 4.19.3 + "@types/node": 22.10.1 - '@types/connect@3.4.38': + "@types/connect@3.4.38": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@types/d3-array@3.2.1': {} + "@types/d3-array@3.2.1": {} - '@types/d3-axis@3.0.6': + "@types/d3-axis@3.0.6": dependencies: - '@types/d3-selection': 3.0.11 + "@types/d3-selection": 3.0.11 - '@types/d3-brush@3.0.6': + "@types/d3-brush@3.0.6": dependencies: - '@types/d3-selection': 3.0.11 + "@types/d3-selection": 3.0.11 - '@types/d3-chord@3.0.6': {} + "@types/d3-chord@3.0.6": {} - '@types/d3-color@3.1.3': {} + "@types/d3-color@3.1.3": {} - '@types/d3-contour@3.0.6': + "@types/d3-contour@3.0.6": dependencies: - '@types/d3-array': 3.2.1 - '@types/geojson': 7946.0.14 + "@types/d3-array": 3.2.1 + "@types/geojson": 7946.0.14 - '@types/d3-delaunay@6.0.4': {} + "@types/d3-delaunay@6.0.4": {} - '@types/d3-dispatch@3.0.6': {} + "@types/d3-dispatch@3.0.6": {} - '@types/d3-drag@3.0.7': + "@types/d3-drag@3.0.7": dependencies: - '@types/d3-selection': 3.0.11 + "@types/d3-selection": 3.0.11 - '@types/d3-dsv@3.0.7': {} + "@types/d3-dsv@3.0.7": {} - '@types/d3-ease@3.0.2': {} + "@types/d3-ease@3.0.2": {} - '@types/d3-fetch@3.0.7': + "@types/d3-fetch@3.0.7": dependencies: - '@types/d3-dsv': 3.0.7 + "@types/d3-dsv": 3.0.7 - '@types/d3-force@3.0.10': {} + "@types/d3-force@3.0.10": {} - '@types/d3-format@3.0.4': {} + "@types/d3-format@3.0.4": {} - '@types/d3-geo@3.1.0': + "@types/d3-geo@3.1.0": dependencies: - '@types/geojson': 7946.0.14 + "@types/geojson": 7946.0.14 - '@types/d3-hierarchy@3.1.7': {} + "@types/d3-hierarchy@3.1.7": {} - '@types/d3-interpolate@3.0.4': + "@types/d3-interpolate@3.0.4": dependencies: - '@types/d3-color': 3.1.3 + "@types/d3-color": 3.1.3 - '@types/d3-path@3.1.0': {} + "@types/d3-path@3.1.0": {} - '@types/d3-polygon@3.0.2': {} + "@types/d3-polygon@3.0.2": {} - '@types/d3-quadtree@3.0.6': {} + "@types/d3-quadtree@3.0.6": {} - '@types/d3-random@3.0.3': {} + "@types/d3-random@3.0.3": {} - '@types/d3-scale-chromatic@3.0.3': {} + "@types/d3-scale-chromatic@3.0.3": {} - '@types/d3-scale@4.0.8': + "@types/d3-scale@4.0.8": dependencies: - '@types/d3-time': 3.0.3 + "@types/d3-time": 3.0.3 - '@types/d3-selection@3.0.11': {} + "@types/d3-selection@3.0.11": {} - '@types/d3-shape@3.1.6': + "@types/d3-shape@3.1.6": dependencies: - '@types/d3-path': 3.1.0 + "@types/d3-path": 3.1.0 - '@types/d3-time-format@4.0.3': {} + "@types/d3-time-format@4.0.3": {} - '@types/d3-time@3.0.3': {} + "@types/d3-time@3.0.3": {} - '@types/d3-timer@3.0.2': {} + "@types/d3-timer@3.0.2": {} - '@types/d3-transition@3.0.9': + "@types/d3-transition@3.0.9": dependencies: - '@types/d3-selection': 3.0.11 + "@types/d3-selection": 3.0.11 - '@types/d3-zoom@3.0.8': + "@types/d3-zoom@3.0.8": dependencies: - '@types/d3-interpolate': 3.0.4 - '@types/d3-selection': 3.0.11 + "@types/d3-interpolate": 3.0.4 + "@types/d3-selection": 3.0.11 - '@types/d3@7.4.3': + "@types/d3@7.4.3": dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-axis': 3.0.6 - '@types/d3-brush': 3.0.6 - '@types/d3-chord': 3.0.6 - '@types/d3-color': 3.1.3 - '@types/d3-contour': 3.0.6 - '@types/d3-delaunay': 6.0.4 - '@types/d3-dispatch': 3.0.6 - '@types/d3-drag': 3.0.7 - '@types/d3-dsv': 3.0.7 - '@types/d3-ease': 3.0.2 - '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.10 - '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.7 - '@types/d3-interpolate': 3.0.4 - '@types/d3-path': 3.1.0 - '@types/d3-polygon': 3.0.2 - '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - '@types/d3-selection': 3.0.11 - '@types/d3-shape': 3.1.6 - '@types/d3-time': 3.0.3 - '@types/d3-time-format': 4.0.3 - '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.9 - '@types/d3-zoom': 3.0.8 + "@types/d3-array": 3.2.1 + "@types/d3-axis": 3.0.6 + "@types/d3-brush": 3.0.6 + "@types/d3-chord": 3.0.6 + "@types/d3-color": 3.1.3 + "@types/d3-contour": 3.0.6 + "@types/d3-delaunay": 6.0.4 + "@types/d3-dispatch": 3.0.6 + "@types/d3-drag": 3.0.7 + "@types/d3-dsv": 3.0.7 + "@types/d3-ease": 3.0.2 + "@types/d3-fetch": 3.0.7 + "@types/d3-force": 3.0.10 + "@types/d3-format": 3.0.4 + "@types/d3-geo": 3.1.0 + "@types/d3-hierarchy": 3.1.7 + "@types/d3-interpolate": 3.0.4 + "@types/d3-path": 3.1.0 + "@types/d3-polygon": 3.0.2 + "@types/d3-quadtree": 3.0.6 + "@types/d3-random": 3.0.3 + "@types/d3-scale": 4.0.8 + "@types/d3-scale-chromatic": 3.0.3 + "@types/d3-selection": 3.0.11 + "@types/d3-shape": 3.1.6 + "@types/d3-time": 3.0.3 + "@types/d3-time-format": 4.0.3 + "@types/d3-timer": 3.0.2 + "@types/d3-transition": 3.0.9 + "@types/d3-zoom": 3.0.8 - '@types/debug@4.1.12': + "@types/debug@4.1.12": dependencies: - '@types/ms': 0.7.34 + "@types/ms": 0.7.34 - '@types/dompurify@3.0.5': + "@types/dompurify@3.0.5": dependencies: - '@types/trusted-types': 2.0.7 + "@types/trusted-types": 2.0.7 - '@types/eslint-scope@3.7.7': + "@types/eslint-scope@3.7.7": dependencies: - '@types/eslint': 8.56.10 - '@types/estree': 1.0.5 + "@types/eslint": 8.56.10 + "@types/estree": 1.0.5 - '@types/eslint@8.56.10': + "@types/eslint@8.56.10": dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 + "@types/estree": 1.0.5 + "@types/json-schema": 7.0.15 - '@types/estree@1.0.5': {} + "@types/estree@1.0.5": {} - '@types/express-serve-static-core@4.19.3': + "@types/express-serve-static-core@4.19.3": dependencies: - '@types/node': 22.10.1 - '@types/qs': 6.9.15 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + "@types/node": 22.10.1 + "@types/qs": 6.9.15 + "@types/range-parser": 1.2.7 + "@types/send": 0.17.4 - '@types/express@4.17.21': + "@types/express@4.17.21": dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.3 - '@types/qs': 6.9.15 - '@types/serve-static': 1.15.7 + "@types/body-parser": 1.19.5 + "@types/express-serve-static-core": 4.19.3 + "@types/qs": 6.9.15 + "@types/serve-static": 1.15.7 - '@types/fs-extra@11.0.4': + "@types/fs-extra@11.0.4": dependencies: - '@types/jsonfile': 6.1.4 - '@types/node': 22.10.1 + "@types/jsonfile": 6.1.4 + "@types/node": 22.10.1 - '@types/geojson@7946.0.14': {} + "@types/geojson@7946.0.14": {} - '@types/hash-sum@1.0.2': {} + "@types/hash-sum@1.0.2": {} - '@types/html-minifier-terser@6.1.0': {} + "@types/html-minifier-terser@6.1.0": {} - '@types/http-errors@2.0.4': {} + "@types/http-errors@2.0.4": {} - '@types/http-proxy@1.17.14': + "@types/http-proxy@1.17.14": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@types/jquery@3.5.30': + "@types/jquery@3.5.30": dependencies: - '@types/sizzle': 2.3.8 + "@types/sizzle": 2.3.8 - '@types/json-schema@7.0.15': {} + "@types/json-schema@7.0.15": {} - '@types/jsonfile@6.1.4': + "@types/jsonfile@6.1.4": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@types/linkify-it@3.0.5': {} + "@types/linkify-it@3.0.5": {} - '@types/linkify-it@5.0.0': {} + "@types/linkify-it@5.0.0": {} - '@types/markdown-it-emoji@2.0.5': + "@types/markdown-it-emoji@2.0.5": dependencies: - '@types/markdown-it': 13.0.8 + "@types/markdown-it": 13.0.8 - '@types/markdown-it@13.0.8': + "@types/markdown-it@13.0.8": dependencies: - '@types/linkify-it': 3.0.5 - '@types/mdurl': 1.0.5 + "@types/linkify-it": 3.0.5 + "@types/mdurl": 1.0.5 - '@types/markdown-it@14.1.1': + "@types/markdown-it@14.1.1": dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 + "@types/linkify-it": 5.0.0 + "@types/mdurl": 2.0.0 - '@types/mdurl@1.0.5': {} + "@types/mdurl@1.0.5": {} - '@types/mdurl@2.0.0': {} + "@types/mdurl@2.0.0": {} - '@types/mime@1.3.5': {} + "@types/mime@1.3.5": {} - '@types/ms@0.7.34': {} + "@types/ms@0.7.34": {} - '@types/node-forge@1.3.11': + "@types/node-forge@1.3.11": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@types/node@17.0.45': {} + "@types/node@17.0.45": {} - '@types/node@22.10.1': + "@types/node@22.10.1": dependencies: undici-types: 6.20.0 - '@types/qs@6.9.15': {} + "@types/qs@6.9.15": {} - '@types/range-parser@1.2.7': {} + "@types/range-parser@1.2.7": {} - '@types/retry@0.12.0': {} + "@types/retry@0.12.0": {} - '@types/sax@1.2.7': + "@types/sax@1.2.7": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@types/send@0.17.4': + "@types/send@0.17.4": dependencies: - '@types/mime': 1.3.5 - '@types/node': 22.10.1 + "@types/mime": 1.3.5 + "@types/node": 22.10.1 - '@types/serve-index@1.9.4': + "@types/serve-index@1.9.4": dependencies: - '@types/express': 4.17.21 + "@types/express": 4.17.21 - '@types/serve-static@1.15.7': + "@types/serve-static@1.15.7": dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.10.1 - '@types/send': 0.17.4 + "@types/http-errors": 2.0.4 + "@types/node": 22.10.1 + "@types/send": 0.17.4 - '@types/sizzle@2.3.8': {} + "@types/sizzle@2.3.8": {} - '@types/sockjs@0.3.36': + "@types/sockjs@0.3.36": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@types/trusted-types@2.0.7': {} + "@types/trusted-types@2.0.7": {} - '@types/web-bluetooth@0.0.20': {} + "@types/web-bluetooth@0.0.20": {} - '@types/webpack-env@1.18.5': {} + "@types/webpack-env@1.18.5": {} - '@types/ws@8.5.10': + "@types/ws@8.5.10": dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 - '@vitejs/plugin-vue@5.0.5(vite@5.0.13(@types/node@22.10.1)(sass@1.77.4)(terser@5.31.0))(vue@3.4.27(typescript@5.8.2))': + "@vitejs/plugin-vue@5.0.5(vite@5.0.13(@types/node@22.10.1)(sass@1.77.4)(terser@5.31.0))(vue@3.4.27(typescript@5.8.2))": dependencies: vite: 5.0.13(@types/node@22.10.1)(sass@1.77.4)(terser@5.31.0) vue: 3.4.27(typescript@5.8.2) - '@vue/compiler-core@3.3.13': + "@vue/compiler-core@3.3.13": dependencies: - '@babel/parser': 7.24.6 - '@vue/shared': 3.3.13 + "@babel/parser": 7.24.6 + "@vue/shared": 3.3.13 estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-core@3.4.27': + "@vue/compiler-core@3.4.27": dependencies: - '@babel/parser': 7.24.6 - '@vue/shared': 3.4.27 + "@babel/parser": 7.24.6 + "@vue/shared": 3.4.27 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.0 - '@vue/compiler-dom@3.3.13': + "@vue/compiler-dom@3.3.13": dependencies: - '@vue/compiler-core': 3.3.13 - '@vue/shared': 3.3.13 + "@vue/compiler-core": 3.3.13 + "@vue/shared": 3.3.13 - '@vue/compiler-dom@3.4.27': + "@vue/compiler-dom@3.4.27": dependencies: - '@vue/compiler-core': 3.4.27 - '@vue/shared': 3.4.27 + "@vue/compiler-core": 3.4.27 + "@vue/shared": 3.4.27 - '@vue/compiler-sfc@3.3.13': + "@vue/compiler-sfc@3.3.13": dependencies: - '@babel/parser': 7.24.6 - '@vue/compiler-core': 3.3.13 - '@vue/compiler-dom': 3.3.13 - '@vue/compiler-ssr': 3.3.13 - '@vue/reactivity-transform': 3.3.13 - '@vue/shared': 3.3.13 + "@babel/parser": 7.24.6 + "@vue/compiler-core": 3.3.13 + "@vue/compiler-dom": 3.3.13 + "@vue/compiler-ssr": 3.3.13 + "@vue/reactivity-transform": 3.3.13 + "@vue/shared": 3.3.13 estree-walker: 2.0.2 magic-string: 0.30.10 postcss: 8.4.38 source-map-js: 1.2.0 - '@vue/compiler-sfc@3.4.27': + "@vue/compiler-sfc@3.4.27": dependencies: - '@babel/parser': 7.24.6 - '@vue/compiler-core': 3.4.27 - '@vue/compiler-dom': 3.4.27 - '@vue/compiler-ssr': 3.4.27 - '@vue/shared': 3.4.27 + "@babel/parser": 7.24.6 + "@vue/compiler-core": 3.4.27 + "@vue/compiler-dom": 3.4.27 + "@vue/compiler-ssr": 3.4.27 + "@vue/shared": 3.4.27 estree-walker: 2.0.2 magic-string: 0.30.10 postcss: 8.4.38 source-map-js: 1.2.0 - '@vue/compiler-ssr@3.3.13': + "@vue/compiler-ssr@3.3.13": dependencies: - '@vue/compiler-dom': 3.3.13 - '@vue/shared': 3.3.13 + "@vue/compiler-dom": 3.3.13 + "@vue/shared": 3.3.13 - '@vue/compiler-ssr@3.4.27': + "@vue/compiler-ssr@3.4.27": dependencies: - '@vue/compiler-dom': 3.4.27 - '@vue/shared': 3.4.27 + "@vue/compiler-dom": 3.4.27 + "@vue/shared": 3.4.27 - '@vue/devtools-api@6.6.2': {} + "@vue/devtools-api@6.6.2": {} - '@vue/reactivity-transform@3.3.13': + "@vue/reactivity-transform@3.3.13": dependencies: - '@babel/parser': 7.24.6 - '@vue/compiler-core': 3.3.13 - '@vue/shared': 3.3.13 + "@babel/parser": 7.24.6 + "@vue/compiler-core": 3.3.13 + "@vue/shared": 3.3.13 estree-walker: 2.0.2 magic-string: 0.30.10 - '@vue/reactivity@3.3.13': + "@vue/reactivity@3.3.13": dependencies: - '@vue/shared': 3.3.13 + "@vue/shared": 3.3.13 - '@vue/reactivity@3.4.27': + "@vue/reactivity@3.4.27": dependencies: - '@vue/shared': 3.4.27 + "@vue/shared": 3.4.27 - '@vue/runtime-core@3.3.13': + "@vue/runtime-core@3.3.13": dependencies: - '@vue/reactivity': 3.3.13 - '@vue/shared': 3.3.13 + "@vue/reactivity": 3.3.13 + "@vue/shared": 3.3.13 - '@vue/runtime-core@3.4.27': + "@vue/runtime-core@3.4.27": dependencies: - '@vue/reactivity': 3.4.27 - '@vue/shared': 3.4.27 + "@vue/reactivity": 3.4.27 + "@vue/shared": 3.4.27 - '@vue/runtime-dom@3.3.13': + "@vue/runtime-dom@3.3.13": dependencies: - '@vue/runtime-core': 3.3.13 - '@vue/shared': 3.3.13 + "@vue/runtime-core": 3.3.13 + "@vue/shared": 3.3.13 csstype: 3.1.3 - '@vue/runtime-dom@3.4.27': + "@vue/runtime-dom@3.4.27": dependencies: - '@vue/runtime-core': 3.4.27 - '@vue/shared': 3.4.27 + "@vue/runtime-core": 3.4.27 + "@vue/shared": 3.4.27 csstype: 3.1.3 - '@vue/server-renderer@3.3.13(vue@3.3.13(typescript@5.8.2))': + "@vue/server-renderer@3.3.13(vue@3.3.13(typescript@5.8.2))": dependencies: - '@vue/compiler-ssr': 3.3.13 - '@vue/shared': 3.3.13 + "@vue/compiler-ssr": 3.3.13 + "@vue/shared": 3.3.13 vue: 3.3.13(typescript@5.8.2) - '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.8.2))': + "@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.8.2))": dependencies: - '@vue/compiler-ssr': 3.4.27 - '@vue/shared': 3.4.27 + "@vue/compiler-ssr": 3.4.27 + "@vue/shared": 3.4.27 vue: 3.4.27(typescript@5.8.2) - '@vue/shared@3.3.13': {} + "@vue/shared@3.3.13": {} - '@vue/shared@3.4.27': {} + "@vue/shared@3.4.27": {} - '@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2)': + "@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2)": dependencies: - '@vitejs/plugin-vue': 5.0.5(vite@5.0.13(@types/node@22.10.1)(sass@1.77.4)(terser@5.31.0))(vue@3.4.27(typescript@5.8.2)) - '@vuepress/client': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/core': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/shared': 2.0.0-rc.2 - '@vuepress/utils': 2.0.0-rc.2 + "@vitejs/plugin-vue": 5.0.5(vite@5.0.13(@types/node@22.10.1)(sass@1.77.4)(terser@5.31.0))(vue@3.4.27(typescript@5.8.2)) + "@vuepress/client": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/core": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/shared": 2.0.0-rc.2 + "@vuepress/utils": 2.0.0-rc.2 autoprefixer: 10.4.19(postcss@8.4.38) connect-history-api-fallback: 2.0.0 postcss: 8.4.38 @@ -4307,8 +6851,8 @@ snapshots: vue: 3.4.27(typescript@5.8.2) vue-router: 4.3.2(vue@3.4.27(typescript@5.8.2)) transitivePeerDependencies: - - '@types/node' - - '@vue/composition-api' + - "@types/node" + - "@vue/composition-api" - jiti - less - lightningcss @@ -4320,14 +6864,14 @@ snapshots: - tsx - typescript - '@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2)': + "@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2)": dependencies: - '@types/express': 4.17.21 - '@types/webpack-env': 1.18.5 - '@vuepress/client': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/core': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/shared': 2.0.0-rc.2 - '@vuepress/utils': 2.0.0-rc.2 + "@types/express": 4.17.21 + "@types/webpack-env": 1.18.5 + "@vuepress/client": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/core": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/shared": 2.0.0-rc.2 + "@vuepress/utils": 2.0.0-rc.2 autoprefixer: 10.4.19(postcss@8.4.38) chokidar: 3.6.0 copy-webpack-plugin: 12.0.2(webpack@5.91.0(esbuild@0.24.0)) @@ -4348,10 +6892,10 @@ snapshots: webpack-dev-server: 4.15.2(webpack@5.91.0(esbuild@0.24.0)) webpack-merge: 5.10.0 transitivePeerDependencies: - - '@rspack/core' - - '@swc/core' - - '@vue/compiler-sfc' - - '@vue/composition-api' + - "@rspack/core" + - "@swc/core" + - "@vue/compiler-sfc" + - "@vue/composition-api" - bufferutil - debug - esbuild @@ -4361,46 +6905,46 @@ snapshots: - utf-8-validate - webpack-cli - '@vuepress/cli@2.0.0-rc.2(typescript@5.8.2)': + "@vuepress/cli@2.0.0-rc.2(typescript@5.8.2)": dependencies: - '@vuepress/core': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/shared': 2.0.0-rc.2 - '@vuepress/utils': 2.0.0-rc.2 + "@vuepress/core": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/shared": 2.0.0-rc.2 + "@vuepress/utils": 2.0.0-rc.2 cac: 6.7.14 chokidar: 3.6.0 envinfo: 7.13.0 esbuild: 0.19.12 transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - supports-color - typescript - '@vuepress/client@2.0.0-rc.2(typescript@5.8.2)': + "@vuepress/client@2.0.0-rc.2(typescript@5.8.2)": dependencies: - '@vue/devtools-api': 6.6.2 - '@vuepress/shared': 2.0.0-rc.2 - '@vueuse/core': 10.11.0(vue@3.4.27(typescript@5.8.2)) + "@vue/devtools-api": 6.6.2 + "@vuepress/shared": 2.0.0-rc.2 + "@vueuse/core": 10.11.0(vue@3.4.27(typescript@5.8.2)) vue: 3.4.27(typescript@5.8.2) vue-router: 4.3.2(vue@3.4.27(typescript@5.8.2)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - typescript - '@vuepress/core@2.0.0-rc.2(typescript@5.8.2)': + "@vuepress/core@2.0.0-rc.2(typescript@5.8.2)": dependencies: - '@vuepress/client': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/markdown': 2.0.0-rc.2 - '@vuepress/shared': 2.0.0-rc.2 - '@vuepress/utils': 2.0.0-rc.2 + "@vuepress/client": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/markdown": 2.0.0-rc.2 + "@vuepress/shared": 2.0.0-rc.2 + "@vuepress/utils": 2.0.0-rc.2 vue: 3.4.27(typescript@5.8.2) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - supports-color - typescript - '@vuepress/helper@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/helper@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@vue/shared': 3.4.27 + "@vue/shared": 3.4.27 cheerio: 1.0.0-rc.12 fflate: 0.8.2 gray-matter: 4.0.3 @@ -4409,9 +6953,9 @@ snapshots: transitivePeerDependencies: - typescript - '@vuepress/helper@2.0.0-rc.33(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/helper@2.0.0-rc.33(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@vue/shared': 3.4.27 + "@vue/shared": 3.4.27 cheerio: 1.0.0-rc.12 fflate: 0.8.2 gray-matter: 4.0.3 @@ -4420,20 +6964,20 @@ snapshots: transitivePeerDependencies: - typescript - '@vuepress/markdown@2.0.0-rc.2': + "@vuepress/markdown@2.0.0-rc.2": dependencies: - '@mdit-vue/plugin-component': 2.1.3 - '@mdit-vue/plugin-frontmatter': 2.1.3 - '@mdit-vue/plugin-headers': 2.1.3 - '@mdit-vue/plugin-sfc': 2.1.3 - '@mdit-vue/plugin-title': 2.1.3 - '@mdit-vue/plugin-toc': 2.1.3 - '@mdit-vue/shared': 2.1.3 - '@mdit-vue/types': 2.1.0 - '@types/markdown-it': 13.0.8 - '@types/markdown-it-emoji': 2.0.5 - '@vuepress/shared': 2.0.0-rc.2 - '@vuepress/utils': 2.0.0-rc.2 + "@mdit-vue/plugin-component": 2.1.3 + "@mdit-vue/plugin-frontmatter": 2.1.3 + "@mdit-vue/plugin-headers": 2.1.3 + "@mdit-vue/plugin-sfc": 2.1.3 + "@mdit-vue/plugin-title": 2.1.3 + "@mdit-vue/plugin-toc": 2.1.3 + "@mdit-vue/shared": 2.1.3 + "@mdit-vue/types": 2.1.0 + "@types/markdown-it": 13.0.8 + "@types/markdown-it-emoji": 2.0.5 + "@vuepress/shared": 2.0.0-rc.2 + "@vuepress/utils": 2.0.0-rc.2 markdown-it: 14.1.0 markdown-it-anchor: 8.6.7(@types/markdown-it@13.0.8)(markdown-it@14.1.0) markdown-it-emoji: 3.0.0 @@ -4441,7 +6985,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vuepress/plugin-active-header-links@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-active-header-links@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: ts-debounce: 4.0.0 vue: 3.4.27(typescript@5.8.2) @@ -4450,7 +6994,7 @@ snapshots: transitivePeerDependencies: - typescript - '@vuepress/plugin-back-to-top@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-back-to-top@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: ts-debounce: 4.0.0 vue: 3.4.27(typescript@5.8.2) @@ -4458,40 +7002,40 @@ snapshots: transitivePeerDependencies: - typescript - '@vuepress/plugin-back-to-top@2.0.0-rc.33(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-back-to-top@2.0.0-rc.33(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@vuepress/helper': 2.0.0-rc.33(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vueuse/core': 10.11.0(vue@3.4.27(typescript@5.8.2)) + "@vuepress/helper": 2.0.0-rc.33(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vueuse/core": 10.11.0(vue@3.4.27(typescript@5.8.2)) vue: 3.4.27(typescript@5.8.2) vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - typescript - '@vuepress/plugin-container@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-container@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@types/markdown-it': 13.0.8 + "@types/markdown-it": 13.0.8 markdown-it: 14.1.0 markdown-it-container: 4.0.0 vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) - '@vuepress/plugin-external-link-icon@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-external-link-icon@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: vue: 3.4.27(typescript@5.8.2) vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - typescript - '@vuepress/plugin-git@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-git@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: execa: 8.0.1 vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) - '@vuepress/plugin-google-analytics@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-google-analytics@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) - '@vuepress/plugin-medium-zoom@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-medium-zoom@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: medium-zoom: 1.1.0 vue: 3.4.27(typescript@5.8.2) @@ -4499,7 +7043,7 @@ snapshots: transitivePeerDependencies: - typescript - '@vuepress/plugin-nprogress@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-nprogress@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: vue: 3.4.27(typescript@5.8.2) vue-router: 4.3.2(vue@3.4.27(typescript@5.8.2)) @@ -4507,22 +7051,22 @@ snapshots: transitivePeerDependencies: - typescript - '@vuepress/plugin-palette@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-palette@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: chokidar: 3.6.0 vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) - '@vuepress/plugin-prismjs@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-prismjs@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: prismjs: 1.29.0 vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) - '@vuepress/plugin-register-components@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-register-components@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: chokidar: 3.6.0 vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) - '@vuepress/plugin-search@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-search@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: chokidar: 3.6.0 vue: 3.4.27(typescript@5.8.2) @@ -4531,53 +7075,53 @@ snapshots: transitivePeerDependencies: - typescript - '@vuepress/plugin-seo@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-seo@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@vuepress/helper': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/helper": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - typescript - '@vuepress/plugin-shiki@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-shiki@2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: shikiji: 0.10.2 vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) - '@vuepress/plugin-sitemap@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-sitemap@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@vuepress/helper': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/helper": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) sitemap: 7.1.2 vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - typescript - '@vuepress/plugin-theme-data@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/plugin-theme-data@2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@vue/devtools-api': 6.6.2 + "@vue/devtools-api": 6.6.2 vue: 3.4.27(typescript@5.8.2) vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - typescript - '@vuepress/shared@2.0.0-rc.2': + "@vuepress/shared@2.0.0-rc.2": dependencies: - '@mdit-vue/types': 2.1.0 + "@mdit-vue/types": 2.1.0 - '@vuepress/theme-default@2.0.0-rc.3(sass-loader@14.2.1(sass@1.77.4)(webpack@5.91.0(esbuild@0.24.0)))(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))': + "@vuepress/theme-default@2.0.0-rc.3(sass-loader@14.2.1(sass@1.77.4)(webpack@5.91.0(esbuild@0.24.0)))(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)))": dependencies: - '@vuepress/plugin-active-header-links': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-back-to-top': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-container': 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-external-link-icon': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-git': 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-medium-zoom': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-nprogress': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-palette': 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-prismjs': 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-seo': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-sitemap': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vuepress/plugin-theme-data': 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) - '@vueuse/core': 10.11.0(vue@3.4.27(typescript@5.8.2)) + "@vuepress/plugin-active-header-links": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-back-to-top": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-container": 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-external-link-icon": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-git": 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-medium-zoom": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-nprogress": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-palette": 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-prismjs": 2.0.0-rc.3(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-seo": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-sitemap": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vuepress/plugin-theme-data": 2.0.0-rc.3(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) + "@vueuse/core": 10.11.0(vue@3.4.27(typescript@5.8.2)) sass: 1.77.4 vue: 3.4.27(typescript@5.8.2) vue-router: 4.3.2(vue@3.4.27(typescript@5.8.2)) @@ -4585,15 +7129,15 @@ snapshots: optionalDependencies: sass-loader: 14.2.1(sass@1.77.4)(webpack@5.91.0(esbuild@0.24.0)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - typescript - '@vuepress/utils@2.0.0-rc.2': + "@vuepress/utils@2.0.0-rc.2": dependencies: - '@types/debug': 4.1.12 - '@types/fs-extra': 11.0.4 - '@types/hash-sum': 1.0.2 - '@vuepress/shared': 2.0.0-rc.2 + "@types/debug": 4.1.12 + "@types/fs-extra": 11.0.4 + "@types/hash-sum": 1.0.2 + "@vuepress/shared": 2.0.0-rc.2 debug: 4.3.5 fs-extra: 11.2.0 globby: 14.0.1 @@ -4604,123 +7148,123 @@ snapshots: transitivePeerDependencies: - supports-color - '@vueuse/core@10.11.0(vue@3.4.27(typescript@5.8.2))': + "@vueuse/core@10.11.0(vue@3.4.27(typescript@5.8.2))": dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 10.11.0 - '@vueuse/shared': 10.11.0(vue@3.4.27(typescript@5.8.2)) + "@types/web-bluetooth": 0.0.20 + "@vueuse/metadata": 10.11.0 + "@vueuse/shared": 10.11.0(vue@3.4.27(typescript@5.8.2)) vue-demi: 0.14.10(vue@3.4.27(typescript@5.8.2)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - vue - '@vueuse/core@11.2.0(vue@3.3.13(typescript@5.8.2))': + "@vueuse/core@11.2.0(vue@3.3.13(typescript@5.8.2))": dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 11.2.0 - '@vueuse/shared': 11.2.0(vue@3.3.13(typescript@5.8.2)) + "@types/web-bluetooth": 0.0.20 + "@vueuse/metadata": 11.2.0 + "@vueuse/shared": 11.2.0(vue@3.3.13(typescript@5.8.2)) vue-demi: 0.14.10(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - vue - '@vueuse/metadata@10.11.0': {} + "@vueuse/metadata@10.11.0": {} - '@vueuse/metadata@11.2.0': {} + "@vueuse/metadata@11.2.0": {} - '@vueuse/shared@10.11.0(vue@3.4.27(typescript@5.8.2))': + "@vueuse/shared@10.11.0(vue@3.4.27(typescript@5.8.2))": dependencies: vue-demi: 0.14.10(vue@3.4.27(typescript@5.8.2)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - vue - '@vueuse/shared@11.2.0(vue@3.3.13(typescript@5.8.2))': + "@vueuse/shared@11.2.0(vue@3.3.13(typescript@5.8.2))": dependencies: vue-demi: 0.14.10(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - vue - '@webassemblyjs/ast@1.12.1': + "@webassemblyjs/ast@1.12.1": dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + "@webassemblyjs/helper-numbers": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + "@webassemblyjs/floating-point-hex-parser@1.11.6": {} - '@webassemblyjs/helper-api-error@1.11.6': {} + "@webassemblyjs/helper-api-error@1.11.6": {} - '@webassemblyjs/helper-buffer@1.12.1': {} + "@webassemblyjs/helper-buffer@1.12.1": {} - '@webassemblyjs/helper-numbers@1.11.6': + "@webassemblyjs/helper-numbers@1.11.6": dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 + "@webassemblyjs/floating-point-hex-parser": 1.11.6 + "@webassemblyjs/helper-api-error": 1.11.6 + "@xtuc/long": 4.2.2 - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + "@webassemblyjs/helper-wasm-bytecode@1.11.6": {} - '@webassemblyjs/helper-wasm-section@1.12.1': + "@webassemblyjs/helper-wasm-section@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/wasm-gen": 1.12.1 - '@webassemblyjs/ieee754@1.11.6': + "@webassemblyjs/ieee754@1.11.6": dependencies: - '@xtuc/ieee754': 1.2.0 + "@xtuc/ieee754": 1.2.0 - '@webassemblyjs/leb128@1.11.6': + "@webassemblyjs/leb128@1.11.6": dependencies: - '@xtuc/long': 4.2.2 + "@xtuc/long": 4.2.2 - '@webassemblyjs/utf8@1.11.6': {} + "@webassemblyjs/utf8@1.11.6": {} - '@webassemblyjs/wasm-edit@1.12.1': + "@webassemblyjs/wasm-edit@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/helper-wasm-section": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-opt": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 + "@webassemblyjs/wast-printer": 1.12.1 - '@webassemblyjs/wasm-gen@1.12.1': + "@webassemblyjs/wasm-gen@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 - '@webassemblyjs/wasm-opt@1.12.1': + "@webassemblyjs/wasm-opt@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-buffer": 1.12.1 + "@webassemblyjs/wasm-gen": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 - '@webassemblyjs/wasm-parser@1.12.1': + "@webassemblyjs/wasm-parser@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/helper-api-error": 1.11.6 + "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@webassemblyjs/ieee754": 1.11.6 + "@webassemblyjs/leb128": 1.11.6 + "@webassemblyjs/utf8": 1.11.6 - '@webassemblyjs/wast-printer@1.12.1': + "@webassemblyjs/wast-printer@1.12.1": dependencies: - '@webassemblyjs/ast': 1.12.1 - '@xtuc/long': 4.2.2 + "@webassemblyjs/ast": 1.12.1 + "@xtuc/long": 4.2.2 - '@xtuc/ieee754@1.2.0': {} + "@xtuc/ieee754@1.2.0": {} - '@xtuc/long@4.2.2': {} + "@xtuc/long@4.2.2": {} accepts@1.3.8: dependencies: @@ -4867,7 +7411,7 @@ snapshots: bootstrap@5.3.3(@popperjs/core@2.11.8): dependencies: - '@popperjs/core': 2.11.8 + "@popperjs/core": 2.11.8 brace-expansion@1.1.11: dependencies: @@ -4976,11 +7520,11 @@ snapshots: chevrotain@11.0.3: dependencies: - '@chevrotain/cst-dts-gen': 11.0.3 - '@chevrotain/gast': 11.0.3 - '@chevrotain/regexp-to-ast': 11.0.3 - '@chevrotain/types': 11.0.3 - '@chevrotain/utils': 11.0.3 + "@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.6.0: @@ -5412,7 +7956,7 @@ snapshots: dns-packet@5.6.1: dependencies: - '@leichtgewicht/ip-codec': 2.0.5 + "@leichtgewicht/ip-codec": 2.0.5 dom-converter@0.2.0: dependencies: @@ -5504,56 +8048,56 @@ snapshots: esbuild@0.19.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.19.12 - '@esbuild/android-arm': 0.19.12 - '@esbuild/android-arm64': 0.19.12 - '@esbuild/android-x64': 0.19.12 - '@esbuild/darwin-arm64': 0.19.12 - '@esbuild/darwin-x64': 0.19.12 - '@esbuild/freebsd-arm64': 0.19.12 - '@esbuild/freebsd-x64': 0.19.12 - '@esbuild/linux-arm': 0.19.12 - '@esbuild/linux-arm64': 0.19.12 - '@esbuild/linux-ia32': 0.19.12 - '@esbuild/linux-loong64': 0.19.12 - '@esbuild/linux-mips64el': 0.19.12 - '@esbuild/linux-ppc64': 0.19.12 - '@esbuild/linux-riscv64': 0.19.12 - '@esbuild/linux-s390x': 0.19.12 - '@esbuild/linux-x64': 0.19.12 - '@esbuild/netbsd-x64': 0.19.12 - '@esbuild/openbsd-x64': 0.19.12 - '@esbuild/sunos-x64': 0.19.12 - '@esbuild/win32-arm64': 0.19.12 - '@esbuild/win32-ia32': 0.19.12 - '@esbuild/win32-x64': 0.19.12 + "@esbuild/aix-ppc64": 0.19.12 + "@esbuild/android-arm": 0.19.12 + "@esbuild/android-arm64": 0.19.12 + "@esbuild/android-x64": 0.19.12 + "@esbuild/darwin-arm64": 0.19.12 + "@esbuild/darwin-x64": 0.19.12 + "@esbuild/freebsd-arm64": 0.19.12 + "@esbuild/freebsd-x64": 0.19.12 + "@esbuild/linux-arm": 0.19.12 + "@esbuild/linux-arm64": 0.19.12 + "@esbuild/linux-ia32": 0.19.12 + "@esbuild/linux-loong64": 0.19.12 + "@esbuild/linux-mips64el": 0.19.12 + "@esbuild/linux-ppc64": 0.19.12 + "@esbuild/linux-riscv64": 0.19.12 + "@esbuild/linux-s390x": 0.19.12 + "@esbuild/linux-x64": 0.19.12 + "@esbuild/netbsd-x64": 0.19.12 + "@esbuild/openbsd-x64": 0.19.12 + "@esbuild/sunos-x64": 0.19.12 + "@esbuild/win32-arm64": 0.19.12 + "@esbuild/win32-ia32": 0.19.12 + "@esbuild/win32-x64": 0.19.12 esbuild@0.24.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 + "@esbuild/aix-ppc64": 0.24.0 + "@esbuild/android-arm": 0.24.0 + "@esbuild/android-arm64": 0.24.0 + "@esbuild/android-x64": 0.24.0 + "@esbuild/darwin-arm64": 0.24.0 + "@esbuild/darwin-x64": 0.24.0 + "@esbuild/freebsd-arm64": 0.24.0 + "@esbuild/freebsd-x64": 0.24.0 + "@esbuild/linux-arm": 0.24.0 + "@esbuild/linux-arm64": 0.24.0 + "@esbuild/linux-ia32": 0.24.0 + "@esbuild/linux-loong64": 0.24.0 + "@esbuild/linux-mips64el": 0.24.0 + "@esbuild/linux-ppc64": 0.24.0 + "@esbuild/linux-riscv64": 0.24.0 + "@esbuild/linux-s390x": 0.24.0 + "@esbuild/linux-x64": 0.24.0 + "@esbuild/netbsd-x64": 0.24.0 + "@esbuild/openbsd-arm64": 0.24.0 + "@esbuild/openbsd-x64": 0.24.0 + "@esbuild/sunos-x64": 0.24.0 + "@esbuild/win32-arm64": 0.24.0 + "@esbuild/win32-ia32": 0.24.0 + "@esbuild/win32-x64": 0.24.0 escalade@3.1.2: {} @@ -5682,8 +8226,8 @@ snapshots: fast-glob@3.3.2: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.7 @@ -5809,7 +8353,7 @@ snapshots: globby@14.0.1: dependencies: - '@sindresorhus/merge-streams': 2.3.0 + "@sindresorhus/merge-streams": 2.3.0 fast-glob: 3.3.2 ignore: 5.3.1 path-type: 5.0.0 @@ -5893,7 +8437,7 @@ snapshots: html-webpack-plugin@5.6.0(webpack@5.91.0(esbuild@0.24.0)): dependencies: - '@types/html-minifier-terser': 6.1.0 + "@types/html-minifier-terser": 6.1.0 html-minifier-terser: 6.1.0 lodash: 4.17.21 pretty-error: 4.0.0 @@ -5946,13 +8490,13 @@ snapshots: http-proxy-middleware@2.0.6(@types/express@4.17.21): dependencies: - '@types/http-proxy': 1.17.14 + "@types/http-proxy": 1.17.14 http-proxy: 1.18.1(debug@2.6.9) is-glob: 4.0.3 is-plain-obj: 3.0.0 micromatch: 4.0.7 optionalDependencies: - '@types/express': 4.17.21 + "@types/express": 4.17.21 transitivePeerDependencies: - debug @@ -6088,7 +8632,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -6192,7 +8736,7 @@ snapshots: magic-string@0.30.10: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + "@jridgewell/sourcemap-codec": 1.4.15 map-cache@0.2.2: {} @@ -6202,7 +8746,7 @@ snapshots: markdown-it-anchor@8.6.7(@types/markdown-it@13.0.8)(markdown-it@14.1.0): dependencies: - '@types/markdown-it': 13.0.8 + "@types/markdown-it": 13.0.8 markdown-it: 14.1.0 markdown-it-container@4.0.0: {} @@ -6242,11 +8786,11 @@ snapshots: mermaid@11.4.0: dependencies: - '@braintree/sanitize-url': 7.1.0 - '@iconify/utils': 2.1.33 - '@mermaid-js/parser': 0.3.0 - '@types/d3': 7.4.3 - '@types/dompurify': 3.0.5 + "@braintree/sanitize-url": 7.1.0 + "@iconify/utils": 2.1.33 + "@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(cytoscape@3.29.2) cytoscape-fcose: 2.2.0(cytoscape@3.29.2) @@ -6447,7 +8991,7 @@ snapshots: p-retry@4.6.2: dependencies: - '@types/retry': 0.12.0 + "@types/retry": 0.12.0 retry: 0.13.1 package-manager-detector@0.2.0: {} @@ -6463,7 +9007,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.6 + "@babel/code-frame": 7.24.6 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -6684,24 +9228,24 @@ snapshots: rollup@4.18.0: dependencies: - '@types/estree': 1.0.5 + "@types/estree": 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + "@rollup/rollup-android-arm-eabi": 4.18.0 + "@rollup/rollup-android-arm64": 4.18.0 + "@rollup/rollup-darwin-arm64": 4.18.0 + "@rollup/rollup-darwin-x64": 4.18.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.18.0 + "@rollup/rollup-linux-arm-musleabihf": 4.18.0 + "@rollup/rollup-linux-arm64-gnu": 4.18.0 + "@rollup/rollup-linux-arm64-musl": 4.18.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.18.0 + "@rollup/rollup-linux-riscv64-gnu": 4.18.0 + "@rollup/rollup-linux-s390x-gnu": 4.18.0 + "@rollup/rollup-linux-x64-gnu": 4.18.0 + "@rollup/rollup-linux-x64-musl": 4.18.0 + "@rollup/rollup-win32-arm64-msvc": 4.18.0 + "@rollup/rollup-win32-ia32-msvc": 4.18.0 + "@rollup/rollup-win32-x64-msvc": 4.18.0 fsevents: 2.3.3 roughjs@4.6.6: @@ -6744,13 +9288,13 @@ snapshots: schema-utils@3.3.0: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) schema-utils@4.2.0: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 8.14.0 ajv-formats: 2.1.1(ajv@8.14.0) ajv-keywords: 5.1.0(ajv@8.14.0) @@ -6764,7 +9308,7 @@ snapshots: selfsigned@2.4.1: dependencies: - '@types/node-forge': 1.3.11 + "@types/node-forge": 1.3.11 node-forge: 1.3.1 semver@7.6.2: {} @@ -6863,8 +9407,8 @@ snapshots: sitemap@7.1.2: dependencies: - '@types/node': 17.0.45 - '@types/sax': 1.2.7 + "@types/node": 17.0.45 + "@types/sax": 1.2.7 arg: 5.0.2 sax: 1.4.1 @@ -7012,7 +9556,7 @@ snapshots: terser-webpack-plugin@5.3.10(esbuild@0.24.0)(webpack@5.91.0(esbuild@0.24.0)): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/trace-mapping": 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 @@ -7023,7 +9567,7 @@ snapshots: terser@5.31.0: dependencies: - '@jridgewell/source-map': 0.3.6 + "@jridgewell/source-map": 0.3.6 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -7127,7 +9671,7 @@ snapshots: postcss: 8.4.38 rollup: 4.18.0 optionalDependencies: - '@types/node': 22.10.1 + "@types/node": 22.10.1 fsevents: 2.3.3 sass: 1.77.4 terser: 5.31.0 @@ -7177,46 +9721,46 @@ snapshots: vue-router@4.3.2(vue@3.4.27(typescript@5.8.2)): dependencies: - '@vue/devtools-api': 6.6.2 + "@vue/devtools-api": 6.6.2 vue: 3.4.27(typescript@5.8.2) vue@3.3.13(typescript@5.8.2): dependencies: - '@vue/compiler-dom': 3.3.13 - '@vue/compiler-sfc': 3.3.13 - '@vue/runtime-dom': 3.3.13 - '@vue/server-renderer': 3.3.13(vue@3.3.13(typescript@5.8.2)) - '@vue/shared': 3.3.13 + "@vue/compiler-dom": 3.3.13 + "@vue/compiler-sfc": 3.3.13 + "@vue/runtime-dom": 3.3.13 + "@vue/server-renderer": 3.3.13(vue@3.3.13(typescript@5.8.2)) + "@vue/shared": 3.3.13 optionalDependencies: typescript: 5.8.2 vue@3.4.27(typescript@5.8.2): dependencies: - '@vue/compiler-dom': 3.4.27 - '@vue/compiler-sfc': 3.4.27 - '@vue/runtime-dom': 3.4.27 - '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.8.2)) - '@vue/shared': 3.4.27 + "@vue/compiler-dom": 3.4.27 + "@vue/compiler-sfc": 3.4.27 + "@vue/runtime-dom": 3.4.27 + "@vue/server-renderer": 3.4.27(vue@3.4.27(typescript@5.8.2)) + "@vue/shared": 3.4.27 optionalDependencies: typescript: 5.8.2 vuepress-plugin-i18n@https://codeload.github.com/XTLS/vuepress-plugin-i18n/tar.gz/5ae5b2d(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))): dependencies: - '@vuepress/client': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/core': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/utils': 2.0.0-rc.2 + "@vuepress/client": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/core": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/utils": 2.0.0-rc.2 chokidar: 3.6.0 vue: 3.3.13(typescript@5.8.2) vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) vuepress-shared: 2.0.0-rc.15(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - supports-color - typescript vuepress-shared@2.0.0-rc.15(typescript@5.8.2)(vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2))): dependencies: - '@vueuse/core': 10.11.0(vue@3.4.27(typescript@5.8.2)) + "@vueuse/core": 10.11.0(vue@3.4.27(typescript@5.8.2)) cheerio: 1.0.0-rc.12 dayjs: 1.11.11 execa: 8.0.1 @@ -7228,23 +9772,23 @@ snapshots: vue-router: 4.3.2(vue@3.4.27(typescript@5.8.2)) vuepress: 2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - typescript vuepress@2.0.0-rc.2(@vuepress/bundler-vite@2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2))(@vuepress/bundler-webpack@2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2))(typescript@5.8.2)(vue@3.3.13(typescript@5.8.2)): dependencies: - '@vuepress/cli': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/client': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/core': 2.0.0-rc.2(typescript@5.8.2) - '@vuepress/markdown': 2.0.0-rc.2 - '@vuepress/shared': 2.0.0-rc.2 - '@vuepress/utils': 2.0.0-rc.2 + "@vuepress/cli": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/client": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/core": 2.0.0-rc.2(typescript@5.8.2) + "@vuepress/markdown": 2.0.0-rc.2 + "@vuepress/shared": 2.0.0-rc.2 + "@vuepress/utils": 2.0.0-rc.2 vue: 3.3.13(typescript@5.8.2) optionalDependencies: - '@vuepress/bundler-vite': 2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2) - '@vuepress/bundler-webpack': 2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2) + "@vuepress/bundler-vite": 2.0.0-rc.2(@types/node@22.10.1)(jiti@1.21.0)(sass@1.77.4)(terser@5.31.0)(typescript@5.8.2) + "@vuepress/bundler-webpack": 2.0.0-rc.2(esbuild@0.24.0)(typescript@5.8.2) transitivePeerDependencies: - - '@vue/composition-api' + - "@vue/composition-api" - supports-color - typescript @@ -7273,13 +9817,13 @@ snapshots: webpack-dev-server@4.15.2(webpack@5.91.0(esbuild@0.24.0)): dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.7 - '@types/sockjs': 0.3.36 - '@types/ws': 8.5.10 + "@types/bonjour": 3.5.13 + "@types/connect-history-api-fallback": 1.5.4 + "@types/express": 4.17.21 + "@types/serve-index": 1.9.4 + "@types/serve-static": 1.15.7 + "@types/sockjs": 0.3.36 + "@types/ws": 8.5.10 ansi-html-community: 0.0.8 bonjour-service: 1.2.1 chokidar: 3.6.0 @@ -7326,11 +9870,11 @@ snapshots: webpack@5.91.0(esbuild@0.24.0): dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + "@types/eslint-scope": 3.7.7 + "@types/estree": 1.0.5 + "@webassemblyjs/ast": 1.12.1 + "@webassemblyjs/wasm-edit": 1.12.1 + "@webassemblyjs/wasm-parser": 1.12.1 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 @@ -7351,7 +9895,7 @@ snapshots: watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - - '@swc/core' + - "@swc/core" - esbuild - uglify-js diff --git a/tsconfig.json b/tsconfig.json index 1e1f572..c3bcf10 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,19 +2,11 @@ "compilerOptions": { "module": "ESNext", "target": "ES2022", - "lib": [ - "DOM", - "ES2022" - ], + "lib": ["DOM", "ES2022"], "sourceMap": false, "strict": true, "moduleResolution": "Bundler", }, - "include": [ - "./docs/.vuepress/**/*.ts", - "./docs/.vuepress/**/*.vue" - ], - "exclude": [ - "node_modules" - ] -} \ No newline at end of file + "include": ["./docs/.vuepress/**/*.ts", "./docs/.vuepress/**/*.vue"], + "exclude": ["node_modules"], +} diff --git a/vite.config.js b/vite.config.js index 4054ab3..3c9df90 100755 --- a/vite.config.js +++ b/vite.config.js @@ -1,4 +1,4 @@ -import { splitVendorChunkPlugin } from 'vite' -export default defineConfig({ - plugins: [splitVendorChunkPlugin()], -}) \ No newline at end of file +import { splitVendorChunkPlugin } from "vite"; +export default defineConfig({ + plugins: [splitVendorChunkPlugin()], +});