commit 199bbf2628b37c460a3b3928a38327bcbad3cd8d Author: 王一之 Date: Tue Mar 19 01:05:51 2024 +0800 init commit diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..1383844 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,3 @@ +{ + "extends": ["plugin:@docusaurus/recommended"] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b2d6de3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Dependencies +/node_modules + +# Production +/build + +# Generated files +.docusaurus +.cache-loader + +# Misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 0000000..ab306db --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,5 @@ +{ + "MD025": false, + "MD033": false, + "MD045": false +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..29e3f86 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# BLOG + +好记性不如烂笔头,自从工作以后写得越来越少了,在大学时还时不时的写点,现在回顾起来,感觉不到工作后的任何积累,写作水平也比以前差了不少,实在惭愧。 + +自前段时间看了大佬们的博客,下定决心重新开写,重新整理了一下过往的文章,~~黑历史去掉~~,然后重新挑选了一个博客程序,你感兴趣的话可以看看[blog](https://github.com/codfrm/blog)仓库,这个仓库之前也有一些代码记录,已经移动到了[archive](./archive)目录下。 + +整理时,回头看之前的文章,能感受到自己的一些技术进步,也能看到之前的一些感悟和中二(~~黑历史~~),从当年的小白变成了现在的中白,等以后成为了老白,再回头看看,应该也会有不一样的感悟。 + +我将以前的一些我觉得有意义的文章搬到了这里,日期应该都是 **2024 年 03 月 17 日**,重新进行了分类:[`DEV`](./docs/dev/)编程语言、软件开发;[`OPS`](./docs/ops/)服务器运维、工具分享;[`随笔`](./docs/note/)日常生活、感悟。 + +写博客其实也不止是为了记录,更多的是为了学习、为了分享、为了交流,也是为了能够在互联网上留下一片足迹,希望能够坚持下去。 + +如果你对本博客程序有兴趣,可以看看我这篇文章:[我为什么换掉 Wordpress 而选择 Docusaurus?](./docs/note/为什么换掉Wordpress.md) +如果你有其它问题,欢迎在文章下面留言,或者在[GitHub](https://github.com/codfrm/blog)上提 issue,我会尽快回复。 + +--- + +```go title="main.go" +fmt.Println("Hello, World!") +``` + +```ts title="main.ts" +console.log("Hello, World!"); +``` + +```php title="main.php" +echo "Hello, World!"; +``` + +```python title="main.py" +print('Hello, World!') +``` + +```c title="main.c" +printf("Hello, World!"); +``` + +```cpp title="main.cpp" +std::cout << "Hello, World!"; +``` + +```bash title="main.sh" +echo "Hello, World!" +``` + +```docker title="Dockerfile" +RUN echo "Hello, World!" +``` diff --git a/archive/.gitignore b/archive/.gitignore new file mode 100644 index 0000000..5587435 --- /dev/null +++ b/archive/.gitignore @@ -0,0 +1,30 @@ +*.o +debug/* +debug +.vscode/ipch +# Created by https://www.gitignore.io/api/go +# Edit at https://www.gitignore.io/?templates=go +.idea + +### Go ### +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +### Go Patch ### +/vendor/ +/Godeps/ + +# End of https://www.gitignore.io/api/go \ No newline at end of file diff --git a/archive/.vscode/c_cpp_properties.json b/archive/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..4ed349e --- /dev/null +++ b/archive/.vscode/c_cpp_properties.json @@ -0,0 +1,17 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/usr/include/**" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/archive/.vscode/launch.json b/archive/.vscode/launch.json new file mode 100644 index 0000000..4356188 --- /dev/null +++ b/archive/.vscode/launch.json @@ -0,0 +1,59 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "go", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${fileDirname}", + "env": {}, + "args": [] + }, + { + "name": "Debug_win_x86", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}\\debug\\${fileBasenameNoExtension}.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": true, + "MIMode": "gdb", + "targetArchitecture": "x86", + "miDebuggerPath": "gdb.exe", + "preLaunchTask": "debug_win", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + }, + { + "name": "Debug_linux_x86", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}\\debug\\${fileBasenameNoExtension}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "preLaunchTask": "debug", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/archive/.vscode/settings.json b/archive/.vscode/settings.json new file mode 100644 index 0000000..48c262e --- /dev/null +++ b/archive/.vscode/settings.json @@ -0,0 +1,44 @@ +{ + "files.associations": { + "new": "cpp", + "iostream": "cpp", + "vector": "cpp", + "array": "cpp", + "atomic": "cpp", + "*.tcc": "cpp", + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "unordered_map": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "optional": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "initializer_list": "cpp", + "iosfwd": "cpp", + "istream": "cpp", + "limits": "cpp", + "ostream": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "streambuf": "cpp", + "typeinfo": "cpp", + "random": "c" + } +} \ No newline at end of file diff --git a/archive/.vscode/tasks.json b/archive/.vscode/tasks.json new file mode 100644 index 0000000..934d1b6 --- /dev/null +++ b/archive/.vscode/tasks.json @@ -0,0 +1,60 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "debug", + "type": "shell", + "command": "make", + "args": [ + "build", + "DEBUG=TRUE", + "NAME=${fileBasenameNoExtension}", + "FILE=\"${file}\"" + ], + "group": "build", + "problemMatcher": { + "owner": "cpp", + "fileLocation": [ + "relative", + "${workspaceRoot}" + ], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + },{ + "label": "debug_win", + "type": "shell", + "command": "mingw32-make", + "args": [ + "build", + "DEBUG=TRUE", + "NAME=${fileBasenameNoExtension}", + "FILE=\"${file}\"" + ], + "group": "build", + "problemMatcher": { + "owner": "cpp", + "fileLocation": [ + "relative", + "${workspaceRoot}" + ], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + } + ] +} \ No newline at end of file diff --git a/archive/Makefile b/archive/Makefile new file mode 100644 index 0000000..b809aea --- /dev/null +++ b/archive/Makefile @@ -0,0 +1,20 @@ +export DEBUG +# -fexec-charset=GBK +g=gcc +ifeq ($(DEBUG), TRUE) + g+= -g +endif + +build: + $(g) -g -fsanitize=address "$(FILE)" -o debug/$(NAME) -lm + +rebuild:clean build + +test:test.o + $(g) debug/test.o -o debug/test + +test.o: + $(g) -c test.c + +clean: + @rm debug/$(NAME).o debug/$(NAME) debug/$(NAME).h.gch debug/$(NAME).exe diff --git a/archive/algorithm/.gitignore b/archive/algorithm/.gitignore new file mode 100644 index 0000000..a1ad533 --- /dev/null +++ b/archive/algorithm/.gitignore @@ -0,0 +1,6 @@ +*.exe +*.o +debug/* +debug +.vscode/ipch +.idea \ No newline at end of file diff --git a/archive/algorithm/.vscode/launch.json b/archive/algorithm/.vscode/launch.json new file mode 100644 index 0000000..e82c2cc --- /dev/null +++ b/archive/algorithm/.vscode/launch.json @@ -0,0 +1,50 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Debug_win_x86", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}\\debug\\${fileBasenameNoExtension}.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": true, + "MIMode": "gdb", + "targetArchitecture": "x86", + "miDebuggerPath": "gdb.exe", + "preLaunchTask": "debug_win", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + }, + { + "name": "Debug_linux_x86", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}\\debug\\${fileBasenameNoExtension}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "preLaunchTask": "debug", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git a/archive/algorithm/.vscode/settings.json b/archive/algorithm/.vscode/settings.json new file mode 100644 index 0000000..406e922 --- /dev/null +++ b/archive/algorithm/.vscode/settings.json @@ -0,0 +1,13 @@ +{ + "files.associations": { + "stdio.h": "c", + "u_link_list.h": "c", + "math.h": "c", + "malloc.h": "c", + "string.h": "c", + "stdlib.h": "c", + "cmath": "c", + "limits": "c" + }, + "C_Cpp.errorSquiggles": "Disabled" +} \ No newline at end of file diff --git a/archive/algorithm/.vscode/tasks.json b/archive/algorithm/.vscode/tasks.json new file mode 100644 index 0000000..934d1b6 --- /dev/null +++ b/archive/algorithm/.vscode/tasks.json @@ -0,0 +1,60 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "debug", + "type": "shell", + "command": "make", + "args": [ + "build", + "DEBUG=TRUE", + "NAME=${fileBasenameNoExtension}", + "FILE=\"${file}\"" + ], + "group": "build", + "problemMatcher": { + "owner": "cpp", + "fileLocation": [ + "relative", + "${workspaceRoot}" + ], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + },{ + "label": "debug_win", + "type": "shell", + "command": "mingw32-make", + "args": [ + "build", + "DEBUG=TRUE", + "NAME=${fileBasenameNoExtension}", + "FILE=\"${file}\"" + ], + "group": "build", + "problemMatcher": { + "owner": "cpp", + "fileLocation": [ + "relative", + "${workspaceRoot}" + ], + "pattern": { + "regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$", + "file": 1, + "line": 2, + "column": 3, + "severity": 4, + "message": 5 + } + } + } + ] +} \ No newline at end of file diff --git a/archive/algorithm/README.md b/archive/algorithm/README.md new file mode 100644 index 0000000..860c939 --- /dev/null +++ b/archive/algorithm/README.md @@ -0,0 +1,49 @@ +# 数据结构和算法 +> 学习一些基本的数据结构和算法 + +# 环境 +* vscode +* Windows 10 +* MinGW +> 开始使用linux,配置改为 +* vscode +* Ubuntu 18.04 +* gcc 7.3 make 4.1 +> 开始使用golang,c缺少太多基本的数据结构了 +* vscode +* go 12 + +# 使用 +已经配置好,直接用vscode打开,打开一个.c文件,按下f5就可以调试了(调试的是当前的文件) + +golang 使用vscode插件`run code` +# 目录 + +## algorithm 排序算法 +``` +bubble 冒泡 +radix_sort.c 基数排序 +``` + +## problem 解决问题 +``` +calculator 后缀表达式 +``` + +## struct 数据结构 +``` +adt 抽象数据类型 +tree 树 +``` + +## leetcode + +# 其他目录 + +## tests 测试目录 +``` +sort 排序效率 +``` + +## debug 调试文件的存放目录 + diff --git a/archive/algorithm/algorithm/bit_add.c b/archive/algorithm/algorithm/bit_add.c new file mode 100644 index 0000000..edaa5b4 --- /dev/null +++ b/archive/algorithm/algorithm/bit_add.c @@ -0,0 +1,51 @@ +#include + +/** + * 位运算加法 + * 就和我们算十位加法差不多 + * 10+1=11 + * 11+1=100 + * 11+11=0 + * 画个式子 + * 010 0011 0011 + * +01 +001 +011 + * ---- --``- -``- + * 011 0100 0110 + * + * 位运算中,^(位异或)相当于加法,但是不会进位 + * &(位与)判断进位,然后<<(左移)动一位 + * 例如11+11可以解析成下面这样 + * 11^11=00 + * (11&11)<<1=110 + * 完整例子2:101+11 + * 101^11=110 + * (101&11)<<1=010 + * 重复 + * 110^010=100 + * (110&010)<<1=100 + * 重复 + * 100^100=0 + * 100&100<<1=1000 + * 重复 + * 0^1000=1000 + * 0&1000<<1=0 + * 结束,返回1000 + */ + +int bit_add(int num1, int num2) +{ + while (num2) + { + int tmp = num1 ^ num2; + num2 = (num1 & num2) << 1; + num1 = tmp; + } + return num1; +} + +int main() +{ + printf("%d\n", bit_add(32, 1)); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/algorithm/bit_division.c b/archive/algorithm/algorithm/bit_division.c new file mode 100644 index 0000000..73ce20d --- /dev/null +++ b/archive/algorithm/algorithm/bit_division.c @@ -0,0 +1,44 @@ +#include + +/** + * 位运算除法 + * 好像可以直接的用减法来算,到不能减了停止 + * 但是这个方法,需要算太多次,O(N) + * 那么我们每次将被除数扩大一倍(使用左移),从最大的开始 + */ + +int add(int num1, int num2) +{ + while (num2) + { + int tmp = num1 ^ num2; + num2 = (num1 & num2) << 1; + num1 = tmp; + } + return num1; +} +int sub(int num1, int num2) +{ + return add(num1, add(~num2, 1)); +} + +int bit_division(int num1, int num2) +{ + int result = 0; + for (int i = 31; i >= 0; i--) + { + if ((num1 >> i) >= num2) + { + result = add(result, 1 << i); + num1 = sub(num1, num2 << i); + } + } + return result; +} + +int main() +{ + printf("%d\n", bit_division(10, 3)); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/algorithm/bit_mul.c b/archive/algorithm/algorithm/bit_mul.c new file mode 100644 index 0000000..dd087ac --- /dev/null +++ b/archive/algorithm/algorithm/bit_mul.c @@ -0,0 +1,51 @@ +#include + +/** + * 位运算乘法(要不循环加法,滑稽) + * 按照算10位一样,列个式子 + * 0011 + * x010 + * ---- + * 00 + * 11 + * ---- + * 0110 + * + * + */ + +int add(int num1, int num2) +{ + while (num2) + { + int tmp = num1 ^ num2; + num2 = (num1 & num2) << 1; + num1 = tmp; + } + return num1; +} + +int bit_mul(int num1, int num2) +{ + int result = 0; + //只考虑了正数,负数的话,先右移31,看结果为1还是0,为1则是负数(补码) + //然后将数字转换为正数(负负得正,再转换成一次负数) + //最后算出结果的时候,如果是负再转换回去 + while (num2) + { + if (num2 & 1) + { + result = add(result, num1); + } + num1 = num1 << 1; + num2 = num2 >> 1; + } + return result; +} + +int main() +{ + printf("%d\n", bit_mul(8, 2)); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/algorithm/bit_sub.c b/archive/algorithm/algorithm/bit_sub.c new file mode 100644 index 0000000..969f2f2 --- /dev/null +++ b/archive/algorithm/algorithm/bit_sub.c @@ -0,0 +1,30 @@ +#include + +/** + * 位运算减法 + * 减法就是加法,只是后者换成了一个负数 + * 负数补码:求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1 + */ + +int add(int num1, int num2) +{ + while (num2) + { + int tmp = num1 ^ num2; + num2 = (num1 & num2) << 1; + num1 = tmp; + } + return num1; +} + +int bit_sub(int num1, int num2) +{ + return add(num1, add(~num2, 1)); +} + +int main() +{ + printf("%d\n", bit_sub(32, 1)); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/algorithm/bubble.c b/archive/algorithm/algorithm/bubble.c new file mode 100644 index 0000000..2b085a2 --- /dev/null +++ b/archive/algorithm/algorithm/bubble.c @@ -0,0 +1,26 @@ +#include +/** + * 冒泡排序,网上copy来的,只是想对比速度 + */ +void bubble_sort(int a[], int n) +{ + int i, j, temp; + for (j = 0; j < n - 1; j++) + for (i = 0; i < n - 1 - j; i++) + if (a[i] > a[i + 1]) + { + temp = a[i]; + a[i] = a[i + 1]; + a[i + 1] = temp; + } +} + +#ifndef MAIN_FUNC +int main() +{ + int number[] = {10, 56, 4894, 32, 894, 2354, 819, 15468, 1654, 89}; + bubble_sort(number, 10); + getchar(); + return 0; +} +#endif \ No newline at end of file diff --git a/archive/algorithm/algorithm/heap.c b/archive/algorithm/algorithm/heap.c new file mode 100644 index 0000000..d711c14 --- /dev/null +++ b/archive/algorithm/algorithm/heap.c @@ -0,0 +1,55 @@ +#include + +/** + * 优先队列--堆 堆排序 + * 堆是一个完全二叉树 + */ + +void swap(int *array, int pos, int pos2) +{ + int tmp = array[pos]; + array[pos] = array[pos2]; + array[pos2] = tmp; +} + +void heap_sort(int *heap, int len) +{ + /** + * 构造堆 + */ + for (int i = (len / 2 - 1); i >= 0; i--) + { + if (heap[i] > heap[(i + 1) * 2 - 1]) + { + swap(heap, i, (i + 1) * 2 - 1); + } + if (len > (i + 1) * 2 && heap[i] > heap[(i + 1) * 2]) + { + swap(heap, i, (i + 1) * 2); + } + } + /** + * 调整堆 + */ + if (len > 1) + { + heap_sort(&heap[1], len - 1); + } +} +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + int heap[] = {17, 489, 5, 23, 6746, 64, 49, 8, 41, 56, 46, 17, 15, + 461, 54, 61, 165, 89, 15, 64, 14, 664}; + heap_sort(heap, sizeof(heap) / sizeof(int)); + print_r(heap, sizeof(heap) / sizeof(int)); + return 0; +} diff --git a/archive/algorithm/algorithm/prim.c b/archive/algorithm/algorithm/prim.c new file mode 100644 index 0000000..b785677 --- /dev/null +++ b/archive/algorithm/algorithm/prim.c @@ -0,0 +1,6 @@ +#include + +int main(){ + + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/algorithm/qsort-1.c b/archive/algorithm/algorithm/qsort-1.c new file mode 100644 index 0000000..956190a --- /dev/null +++ b/archive/algorithm/algorithm/qsort-1.c @@ -0,0 +1,58 @@ +#include +#include +//练习快排+去重 +#define AMOUNT 1000 + +void my_qsort(int* num, int len) { + //选第一位为基数 + if (len <= 1) { + return; + } + int base = num[0]; //基数 + int n = len - 1, i = 1; + for (; i < len; i++) { + //从左往右扫描,遇到比base大的定住,然后右往左扫描,比len小的交换,然后继续 + // 4 2 3 5 7 2 1 4 2 3 1 7 2 5 4 2 3 1 2 7 5 + // 2 2 3 1 4 7 5 + if (num[i] > base) { + for (; n > i; n--) { + if (num[n] < base) { + //交换 + int tmp = num[i]; + num[i] = num[n]; + num[n] = tmp; + break; + } + } + } + if (i == n) { + //相遇了,结束,并交换基数 + int tmp = num[i - 1]; + num[i - 1] = num[0]; + num[0] = tmp; + break; + } + } + //对位置左右两边排序,分治的思路 + my_qsort(num, i); + my_qsort(&num[i], len - i); +} + +int main() { + int num[AMOUNT] = {0}; + srand(1); + for (int i = 0; i < AMOUNT; i++) { + num[i] = rand(); + printf("%d\t", num[i]); + } + printf("\n"); + my_qsort(num, AMOUNT); + printf("%d\t", num[0]); + for (int i = 1; i < AMOUNT; i++) { + //去重输出 + if (num[i] != num[i - 1]) { + printf("%d\t", num[i]); + } + } + getchar(); +} diff --git a/archive/algorithm/algorithm/qsort.c b/archive/algorithm/algorithm/qsort.c new file mode 100644 index 0000000..b765e5d --- /dev/null +++ b/archive/algorithm/algorithm/qsort.c @@ -0,0 +1,90 @@ +#include +#include +#include +/** + * 快速排序O(NlogN)和插入排序O(N^2) + * 根据《数据结构和算法》学习 + */ +void swap(int *array, int pos, int pos2); +int *insert_sort(int *array, int len) +{ + for (int p = 1; p < len; p++) + { + int tmp = array[p], i; + for (i = p; i > 0 && array[i - 1] > tmp; i--) //插入排序,将前一个一直往后面插入,直到遇到,比tmp小的情况 + { + array[i] = array[i - 1]; + } + array[i] = tmp; + } + return array; +} +/** + * 快速排序,递归,利用分治的方法 + * 首先确定一个基数,比其小的移向左,大的移向右 + * 然后递归调用 + */ +int *quick_sort(int *array, int len) +{ + if (len <= 20) //长度小于20的采用插入排序法 + { + return insert_sort(array, len); + } + //先取 左 中 右 三个数字 + int l = 0, m, r = len - 2, pos = r / 2; //-2是取倒数第二个 + //将三个数字排序,左最小,右最大 + if (array[l] > array[r]) + swap(array, l, r); + if (array[l] > array[pos]) + swap(array, l, pos); + if (array[pos] > array[r]) + swap(array, pos, r); + + swap(array, pos, len - 1); //交换中间的数字和最后一个 + + m = array[len - 1]; + while (1) + { + while (array[++l] < m) + ; //左边的一直向右移动,直到遇到大于m的 + while (array[--r] > m) + ; //右边的一直向左移动,直到遇到小于m的 + if (l >= r) + { + break; + } + swap(array, l, r); + } + //交换l和最后的 + swap(array, l, len - 1); + quick_sort(array, l); + quick_sort(&array[l + 1], len - l - 1); + return array; +} + +void swap(int *array, int pos, int pos2) +{ + int tmp = array[pos]; + array[pos] = array[pos2]; + array[pos2] = tmp; +} + +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +#ifndef MAIN_FUNC +int main() +{ + int a[] = {8, 1, 4, 7, 7, 6, 2, 1, 1, 6, 68, 1, 5, 5, 4, 54, 89, 42, 7, 0}; + quick_sort(a, sizeof(a) / sizeof(int)); + print_r(a, sizeof(a) / sizeof(int)); + getchar(); + return 0; +} +#endif \ No newline at end of file diff --git a/archive/algorithm/algorithm/radix_sort.c b/archive/algorithm/algorithm/radix_sort.c new file mode 100644 index 0000000..a396e4e --- /dev/null +++ b/archive/algorithm/algorithm/radix_sort.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include +#include "../struct/adt/u_link_list.h" +/** + * 基数排序 + */ +#define getN(number, N) (int)((float)(number / pow(10, N - 1))) % 10 +#define NODE_SIZE sizeof(struct node) + +/** + * 基数排序,LDS + * 参考地址:http://blog.csdn.net/lemon_tree12138/article/details/51695211 + */ +void radix_sort_lds(int *number, int len) +{ + int *buck = malloc(sizeof(int) * len); //桶子 + int buck_sub[10] = {0}; //每一个桶的结束下标 + int now_bit = 0, max_bit = 0; //现在的位数,最大的位数 + for (int i = 0; i < len; i++) //获取最大的数字 + { + if (number[i] > max_bit) + { + max_bit = number[i]; + } + } + int tmp = max_bit; + max_bit = 0; + do + { + max_bit++; + tmp /= 10; + } while (tmp > 0); //取出最大位数 + for (now_bit = 1; now_bit <= max_bit; now_bit++) + { + memset(buck_sub, 0, sizeof(buck_sub)); + // memset(buck, 0, sizeof(int) * len); + for (int i = 0; i < len; i++) //获取每个桶中有多少个数字 + { + buck_sub[getN(number[i], now_bit)] += 1; + } + for (int i = 1; i < 10; i++) //将数量转换为数组下标 + { + buck_sub[i] = buck_sub[i] + buck_sub[i - 1]; + } + for (int i = len - 1; i >= 0; i--) //将数组分配到桶中 + { + int bit = getN(number[i], now_bit); + buck[--buck_sub[bit]] = number[i]; + } + //将桶中的数据交换过去,直接拷贝内存 + memcpy(number, buck, sizeof(int) * len); + } + free(buck); +} + +#ifndef MAIN_FUNC +int main() +{ + int number[] = {1000, 999, 103}; + radix_sort_lds(number, sizeof(number) / 4); + for (int i = 0; i < sizeof(number) / 4; i++) + { + printf("%d\t", number[i]); + } + getchar(); + return 0; +} +#endif \ No newline at end of file diff --git a/archive/algorithm/algorithm/ssq.c b/archive/algorithm/algorithm/ssq.c new file mode 100644 index 0000000..94fa810 --- /dev/null +++ b/archive/algorithm/algorithm/ssq.c @@ -0,0 +1,13 @@ +#include + +int main(){ + for(int i=0;i<=3;i++){ + for(int n=0;n<=3;n++){ + if(8-i-n<=6){ + printf("red:%d;yellow:%d,green:%d\n",i,n,8-i-n); + } + } + } + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/geektime/c/06.c b/archive/algorithm/geektime/c/06.c new file mode 100644 index 0000000..3ec3486 --- /dev/null +++ b/archive/algorithm/geektime/c/06.c @@ -0,0 +1,139 @@ +#include +#include +#include + +struct node; +typedef struct node Node; + +struct node +{ + int val; + Node *next; +}; + +void insert(Node *header, int val, int pos) +{ + Node *tmp = header; + int tmpPos = 0; + if (pos == -1) + { + pos = __INT_MAX__; + } + + while (tmp->next != NULL && tmpPos < pos) + { + tmpPos++; + tmp = tmp->next; + } + Node *i = malloc(sizeof(Node)); + i->next = tmp->next; + i->val = val; + tmp->next = i; +} + +void delete (Node *header, int pos) +{ + Node *tmp = header; + int tmpPos = 0; + while (tmp->next != NULL && tmpPos < pos) + { + tmpPos++; + tmp = tmp->next; + } + Node *del = tmp->next; + if (del == NULL) + { + return; + } + tmp->next = tmp->next->next; +} + +Node *reverse(Node *header) +{ + Node *last = NULL; + Node *tmp = header; + while (tmp = tmp->next) + { + Node *now = malloc(sizeof(Node)); + memset(now, 0, sizeof(Node)); + now->val = tmp->val; + now->next = last; + last = now; + } + Node *newHeader = malloc(sizeof(Node)); + memset(newHeader, 0, sizeof(Node)); + newHeader->next = last; + return newHeader; +} + +int isRing(Node *header) +{ + if (header == NULL) + { + return 0; + } + Node *k = header, *m = header; + do + { + if (k->next == NULL) + { + return 0; + } + k = k->next; + if (k->next == NULL) + { + return 0; + } + k = k->next; + m = m->next; + } while (m != k); + return 1; +} + +int main() +{ + Node *header = malloc(sizeof(Node)); + header->val = -1; + header->next = NULL; + + insert(header, 1, -1); + insert(header, 2, -1); + insert(header, 3, -1); + insert(header, 4, 2); + insert(header, 5, 0); + insert(header, 6, 0); + + delete (header, 0); + Node *tmp = header; + while (tmp = tmp->next) + { + printf("%d\t", tmp->val); + } + + Node *header2 = malloc(sizeof(Node)); + header2->val = -1; + header2->next = NULL; + insert(header2, 10, -1); + insert(header2, 12, -1); + delete (header2, 0); + tmp = header2; + printf("\nheader2\n"); + while (tmp = tmp->next) + { + printf("%d\t", tmp->val); + } + + Node *r = reverse(header); + tmp = r; + printf("\reverse\n"); + while (tmp = tmp->next) + { + printf("%d\t", tmp->val); + } + + printf("\n%d\n", isRing(header)); + header->next->next->next->next->next = header->next->next; + printf("\n%d\n", isRing(header)); + + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/geektime/sort.go b/archive/algorithm/geektime/sort.go new file mode 100644 index 0000000..635261e --- /dev/null +++ b/archive/algorithm/geektime/sort.go @@ -0,0 +1,151 @@ +package geektime + +func bubble_1(arr []int) []int { + ret := make([]int, len(arr)) + copy(ret, arr) + for i := range ret { + for j := range ret[i:] { + j = i + j + if ret[i] > ret[j] { + ret[i], ret[j] = ret[j], ret[i] + } + } + } + return ret +} + +func bubble_2(arr []int) []int { + ret := make([]int, len(arr)) + copy(ret, arr) + for i := range ret { + flag := false + for j := range ret[i:] { + j = i + j + if ret[i] > ret[j] { + flag = true + ret[i], ret[j] = ret[j], ret[i] + } + } + if !flag { + break + } + } + return ret +} + +func insert(arr []int) []int { + ret := make([]int, len(arr)) + copy(ret, arr) + for i := 1; i < len(ret); i++ { + val := ret[i] + j := i - 1 + for ; j >= 0; j-- { + if ret[j] > val { + ret[j+1] = ret[j] + } else { + break + } + } + ret[j+1] = val + } + return ret +} + +func selection(arr []int) []int { + ret := make([]int, len(arr)) + copy(ret, arr) + for i := range ret { + min := i + for j := range ret[i:] { + j = i + j + if ret[min] > ret[j] { + min = j + } + } + ret[min], ret[i] = ret[i], ret[min] + } + return ret +} + +//归并排序 +func merge_sort(arr []int) []int { + ret := make([]int, len(arr)) + copy(ret, arr) + dichotomize(ret, 0, len(ret)-1) + return ret +} + +func dichotomize(arr []int, i, j int) (int, int) { + if i >= j { + return i, j + } + i1, j1 := dichotomize(arr, i, (j-i)/2+i) + i2, j2 := dichotomize(arr, (j-i)/2+i+1, j) + merge(arr, i1, j1, i2, j2) + return i, j +} + +func merge(arr []int, i1, j1, i2, j2 int) { + pos2 := i2 + tmp := make([]int, j2-i1+1) + tmppos := 0 + pos1 := i1 + for ; pos1 <= j1 && pos2 <= j2; tmppos++ { + if arr[pos1] > arr[pos2] { + tmp[tmppos] = arr[pos2] + pos2++ + } else { + tmp[tmppos] = arr[pos1] + pos1++ + } + } + //剩余 + if pos1 <= j1 { + for ; pos1 <= j1; pos1++ { + tmp[tmppos] = arr[pos1] + tmppos++ + } + } else { + for ; pos2 <= j2; pos2++ { + tmp[tmppos] = arr[pos2] + tmppos++ + } + } + //copy + tmppos = 0 + for i := i1; i <= j2; i++ { + arr[i] = tmp[tmppos] + tmppos++ + } +} + +func qsort(arr []int) []int { + ret := make([]int, len(arr)) + copy(ret, arr) + return qsort_c(ret) +} + +func qsort_c(arr []int) []int { + n := len(arr) + if n == 2 { + if arr[0] > arr[1] { + arr[0], arr[1] = arr[1], arr[0] + return arr + } + return arr + } else if n <= 1 { + return arr + } + val := arr[n/2] + arr[0], arr[n/2] = arr[n/2], arr[0] + j := 1 + for i := 1; i < n; i++ { + if arr[i] < val { + arr[i], arr[j] = arr[j], arr[i] + j++ + } + } + qsort_c(arr[:j]) + qsort_c(arr[j:]) + return arr +} diff --git a/archive/algorithm/geektime/sort_test.go b/archive/algorithm/geektime/sort_test.go new file mode 100644 index 0000000..f3ae5eb --- /dev/null +++ b/archive/algorithm/geektime/sort_test.go @@ -0,0 +1,159 @@ +package geektime + +import ( + "github.com/stretchr/testify/assert" + "math/rand" + "testing" +) + +var sortArr100, sortArr1000 []int + +func TestMain(m *testing.M) { + sortArr100 = randIntSlice(100) + sortArr1000 = randIntSlice(1000) + m.Run() +} + +func Test_bubble(t *testing.T) { + arr := []int{5, 3, 4, 1, 2} + ret := bubble_1(arr) + assert.Equal(t, []int{1, 2, 3, 4, 5}, ret) + ret = bubble_2(arr) + assert.Equal(t, []int{1, 2, 3, 4, 5}, ret) + arr = randIntSlice(10) + ret = bubble_1(arr) + ret2 := bubble_2(arr) + assert.Equal(t, ret2, ret) +} + +func randIntSlice(n int) []int { + ret := make([]int, n) + for i := 0; i < n; i++ { + ret[i] = rand.Int() + } + return ret +} + +func BenchmarkBubble1100(b *testing.B) { + arr := sortArr100 + for i := 0; i < b.N; i++ { + bubble_1(arr) + } +} + +func BenchmarkBubble11000(b *testing.B) { + arr := sortArr1000 + for i := 0; i < b.N; i++ { + bubble_1(arr) + } +} + +func BenchmarkBubble2100(b *testing.B) { + arr := sortArr100 + for i := 0; i < b.N; i++ { + bubble_2(arr) + } +} + +func BenchmarkBubble21000(b *testing.B) { + arr := sortArr1000 + for i := 0; i < b.N; i++ { + bubble_2(arr) + } +} + +func Test_insert(t *testing.T) { + arr := []int{5, 3, 4, 1, 2} + ret := insert(arr) + assert.Equal(t, []int{1, 2, 3, 4, 5}, ret) + arr = randIntSlice(10) + ret = bubble_1(arr) + ret2 := insert(arr) + assert.Equal(t, ret, ret2) +} + +func BenchmarkInsert100(b *testing.B) { + arr := sortArr100 + for i := 0; i < b.N; i++ { + insert(arr) + } +} + +func BenchmarkInsert1000(b *testing.B) { + arr := sortArr1000 + for i := 0; i < b.N; i++ { + insert(arr) + } +} + +func Test_selection(t *testing.T) { + arr := []int{5, 3, 4, 1, 2} + ret := selection(arr) + assert.Equal(t, []int{1, 2, 3, 4, 5}, ret) + arr = randIntSlice(10) + ret = bubble_1(arr) + ret2 := selection(arr) + assert.Equal(t, ret, ret2) +} + +func BenchmarkSelect100(b *testing.B) { + arr := sortArr100 + for i := 0; i < b.N; i++ { + selection(arr) + } +} + +func BenchmarkSelect1000(b *testing.B) { + arr := sortArr1000 + for i := 0; i < b.N; i++ { + selection(arr) + } +} + +func Test_merge_sort(t *testing.T) { + arr := []int{5, 3, 4, 1, 2, 6} + ret := merge_sort(arr) + assert.Equal(t, []int{1, 2, 3, 4, 5, 6}, ret) + arr = randIntSlice(10) + ret = bubble_1(arr) + ret2 := merge_sort(arr) + assert.Equal(t, ret, ret2) +} + +func BenchmarkMerge100(b *testing.B) { + arr := sortArr100 + for i := 0; i < b.N; i++ { + merge_sort(arr) + } +} + +func BenchmarkMerge1000(b *testing.B) { + arr := sortArr1000 + for i := 0; i < b.N; i++ { + merge_sort(arr) + } +} + +func Test_qsort(t *testing.T) { + arr := []int{5, 3, 4, 1, 2, 6} + ret := qsort(arr) + assert.Equal(t, []int{1, 2, 3, 4, 5, 6}, ret) + arr = randIntSlice(10) + ret = bubble_1(arr) + ret2 := qsort(arr) + assert.Equal(t, ret, ret2) +} + +func BenchmarkQuickSort100(b *testing.B) { + arr := sortArr100 + for i := 0; i < b.N; i++ { + qsort(arr) + } +} + +func BenchmarkQuickSort1000(b *testing.B) { + arr := sortArr1000 + for i := 0; i < b.N; i++ { + qsort(arr) + } +} diff --git a/archive/algorithm/leetcode/1.c b/archive/algorithm/leetcode/1.c new file mode 100644 index 0000000..8f5f12c --- /dev/null +++ b/archive/algorithm/leetcode/1.c @@ -0,0 +1,21 @@ +#include + +/** + * https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/22/ + * 买卖股票的最佳时机 II + */ +int main() +{ + int val[] = {2, 1, 2, 0, 1}; + + int max = 0; + for (int i = 1; i < sizeof(val) / 4; i++) + { + int d = val[i] - val[i - 1]; + if (d > 0) + { + max += d; + } + } + return max; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/11.go b/archive/algorithm/leetcode/11.go new file mode 100644 index 0000000..9243ad3 --- /dev/null +++ b/archive/algorithm/leetcode/11.go @@ -0,0 +1,23 @@ +package main + +func maxArea(height []int) int { + var left, right, max = 0, len(height) - 1, 0 + for left < right { + area := 0 + if height[left] > height[right] { + area = height[right] * (right - left) + right-- + } else { + area = height[left] * (right - left) + left++ + } + if area > max { + max = area + } + } + return max +} + +func main() { + println(maxArea([]int{1, 2, 54, 75, 3, 5, 7, 93, 3})) +} diff --git a/archive/algorithm/leetcode/12.go b/archive/algorithm/leetcode/12.go new file mode 100644 index 0000000..ac55713 --- /dev/null +++ b/archive/algorithm/leetcode/12.go @@ -0,0 +1,46 @@ +package main + +var mapping = [10][4]int{ + {0, 0, 0, 0}, {1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 0}, {1, 2, 0, 0}, {2, 0, 0, 0}, {2, 1, 0, 0}, {2, 1, 1, 0}, {2, 1, 1, 1}, {1, 3, 0, 0}, +} + +var roman = []string{ + "I", "V", "X", "L", "C", "D", "M", +} + +func intToRoman(num int) string { + var ret string + bit := 0 + for num > 0 { + t := num % 10 + num /= 10 + tmp := "" + for _, val := range mapping[t] { + if val == 0 { + break + } + tmp += roman[val+(bit*2)-1] + } + bit++ + ret = tmp + ret + } + return ret +} + +func main() { + println(intToRoman(1994)) +} + +//dalao +// func intToRoman(num int) string { +// var romanInt = []int{1000, 900, 500 ,400, 100, 90, 50, 40, 10, 9, 5, 4, 1} +// var romanStr = []string{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"} +// var res = "" +// for i, n := range romanInt { +// for num >= n { +// res += romanStr[i] +// num -= n +// } +// } +// return res +// } diff --git a/archive/algorithm/leetcode/120.c b/archive/algorithm/leetcode/120.c new file mode 100644 index 0000000..b6ca3b0 --- /dev/null +++ b/archive/algorithm/leetcode/120.c @@ -0,0 +1,60 @@ +#define MIN(a, b) (a > b ? b : a) +int minimumTotal(int **triangle, int triangleRowSize, int *triangleColSizes) { + int **dp = malloc(sizeof(int *) * triangleRowSize), ret = 0; + for (int i = 0; i < triangleRowSize; i++) { + dp[i] = malloc(sizeof(int) * triangleRowSize); + } + dp[0][0] = triangle[0][0]; + for (int i = 1; i < triangleRowSize; i++) { + for (int n = 0; n <= i; n++) { + if (n == 0) { + dp[i][n] = dp[i - 1][n]; + } else if (n == i) { + dp[i][n] = dp[i - 1][n - 1]; + } else { + dp[i][n] = MIN(dp[i - 1][n], dp[i - 1][n - 1]); + } + dp[i][n] += triangle[i][n]; + } + } + ret = dp[triangleRowSize - 1][0]; + for (int i = 1; i < triangleRowSize; i++) { + ret = MIN(ret, dp[triangleRowSize - 1][i]); + } + return ret; +} + +/* +int minimumSubTotal(int** triangle, int triangleRowSize, int *triangleColSizes, int level, int* minTotal) { + int i = 0; + int min = INT_MAX; + int res = 0; + int temp = 0; + if(level == triangleRowSize - 1){ + for(i = 0; i <= level; i++){ + minTotal[i] = triangle[level][i]; + min = minTotal[i] < min ? minTotal[i] : min; + } + return min; + } + minimumSubTotal(triangle, triangleRowSize, triangleColSizes, level + 1, minTotal); + + for(i = 0, temp = minTotal[0]; i <= level; i++){ + res = (temp > minTotal[i + 1] ? minTotal[i + 1] : temp) + triangle[level][i]; + temp = minTotal[i + 1]; + minTotal[i] = res; + min = minTotal[i] < min ? minTotal[i] : min; + } + + return min; +} + +int minimumTotal(int** triangle, int triangleRowSize, int *triangleColSizes) { + int ret = 0; + int* minTotal = (int*)malloc(sizeof(int) * triangleRowSize); + ret = minimumSubTotal(triangle, triangleRowSize, triangleColSizes, 0, minTotal); + free(minTotal); + + return ret; +} +*/ \ No newline at end of file diff --git a/archive/algorithm/leetcode/121.c b/archive/algorithm/leetcode/121.c new file mode 100644 index 0000000..2b035bb --- /dev/null +++ b/archive/algorithm/leetcode/121.c @@ -0,0 +1,35 @@ +#include +#include + +int maxProfit(int *prices, int pricesSize) { + if (pricesSize <= 1) { + return 0; + } + int max = 0, min_buy = prices[0], tmp = 0; + for (int i = 1; i < pricesSize; i++) { + if (min_buy > prices[i]) { + min_buy = prices[i]; + } + tmp = prices[i] - min_buy; + if (max < tmp) { + max = tmp; + } + } + return max; +} +/* +#define max(a,b) ((a) > (b) ? (a) : (b)) +#define min(a,b) ((a) > (b) ? (b) : (a)) +int maxProfit(int* prices, int pricesSize) { + int low = INT_MAX, profit = 0; + for(int i = 0 ; i< pricesSize; i++){ + low = min(low, prices[i]); + profit = max(profit, prices[i] - low); + } + return profit; +} +*/ +int main() { + getchar(); + return 0; +} diff --git a/archive/algorithm/leetcode/13.go b/archive/algorithm/leetcode/13.go new file mode 100644 index 0000000..3bd48e8 --- /dev/null +++ b/archive/algorithm/leetcode/13.go @@ -0,0 +1,30 @@ +package main + +var mapping = map[string]int{ + "I": 1, + "V": 5, + "X": 10, + "L": 50, + "C": 100, + "D": 500, + "M": 1000, +} + +func romanToInt(s string) int { + var ret, last int + for _, chr := range s { + val := mapping[string(chr)] + if last < val { + ret = val + ret - (last * 2) + } else { + ret += val + } + last = val + } + return ret +} + +func main() { + println(romanToInt("MCMXCIV")) //5 + println(romanToInt("IIIV")) //4 +} diff --git a/archive/algorithm/leetcode/14.c b/archive/algorithm/leetcode/14.c new file mode 100644 index 0000000..6656d73 --- /dev/null +++ b/archive/algorithm/leetcode/14.c @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +/** + * https://leetcode-cn.com/problems/longest-common-prefix/description/ + * 最长公共前缀 + */ +char *longestCommonPrefix(char strs[3][10], int strsSize) +{ + if (strsSize <= 0) + { + char *tmp = malloc(1); + tmp[0] = 0; + return tmp; + } + char *ret = strs[0]; + for (int i = 1; i < strsSize; i++) + { + char *tmp = &strs[i][0], *tmp1 = ret; + int len = 0; + while (*tmp1 == *tmp && *tmp!=0) + { + len++; + tmp1++; + tmp++; + } + ret[len]=0; + } + return ret; +} + +int main() +{ + char a[3][10] = {"aa", "aa", "aa"}; + longestCommonPrefix(a, 3); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/141.c b/archive/algorithm/leetcode/141.c new file mode 100644 index 0000000..7534421 --- /dev/null +++ b/archive/algorithm/leetcode/141.c @@ -0,0 +1,56 @@ +#include + +struct ListNode +{ + int val; + struct ListNode *next; +}; + +typedef int bool; +#define true 1; +#define false 0; + +bool hasCycle(struct ListNode *head) +{ + if (head == NULL) + { + return false; + } + struct ListNode *k = head->next, *m = head; + while (k != m) + { + if (m == NULL || k == NULL) + { + return false; + } + m = m->next; + k = k->next; + if (k == NULL) + { + return false; + } + k = k->next; + } + return true; +} + +int main() +{ + struct ListNode *head = malloc(sizeof(struct ListNode)), *next = malloc(sizeof(struct ListNode)), *tmp; + head->val = 3; + head->next = next; + tmp = next; + next->val = 2; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 0; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = -4; + next->next = NULL; + + hasCycle(head); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/146-LRU.go b/archive/algorithm/leetcode/146-LRU.go new file mode 100644 index 0000000..c21cf64 --- /dev/null +++ b/archive/algorithm/leetcode/146-LRU.go @@ -0,0 +1,108 @@ +package main + +import "log" + +//https://leetcode-cn.com/problems/lru-cache/ +//数组形式实现(O(n)),另外可以用双向链表+哈希表实现(O(1)) +type LRUCache struct { + capacity int + cache map[int]int + lru []int + head int + tail int +} + +func Constructor(capacity int) LRUCache { + return LRUCache{ + capacity: capacity, + cache: make(map[int]int), + lru: make([]int, capacity), + head: 0, tail: 0, + } +} + +func (this *LRUCache) Get(key int) int { + v, ok := this.cache[key] + if ok { + this.FloatUp(key) + return v + } + return -1 +} + +func (this *LRUCache) Put(key int, value int) { + this.cache[key] = value + this.FloatUp(key) +} + +func (this *LRUCache) FloatUp(key int) { + //查找位 + for i := 0; true; i++ { + var pos = this.pos(i + this.tail) + if key == this.lru[pos] { + //提到第一位,前面的后移 + for ; true; i++ { + var pos = this.pos(i + this.tail) + if pos == this.head { + //到头了,跳出 + break + } + this.lru[pos] = this.lru[this.pos(pos+1)] + } + this.head = this.head - 1 + if this.head == -1 { + this.head = this.capacity - 1 + } + break + } else if pos == this.head { + //到头了,跳出 + break + } + } + var tmp = this.lru[this.tail] + this.head = this.pos(this.head + 1) + this.lru[this.head] = key + //判断是否已满 + if this.head == this.tail { + //满,删除最后一位 + delete(this.cache, tmp) + this.tail = this.pos(this.tail + 1) + } +} + +func (this *LRUCache) pos(pos int) int { + return pos % this.capacity +} + +/** + * Your LRUCache object will be instantiated and called as such: + * obj := Constructor(capacity); + * param_1 := obj.Get(key); + * obj.Put(key,value); + */ + +func main() { + cache := Constructor(3) + cache.Put(1, 1) + cache.Put(2, 2) + cache.Put(3, 3) + cache.Put(4, 4) + cache.Get(4) + cache.Get(3) + cache.Get(2) + cache.Get(1) + cache.Put(5, 5) + cache.Get(1) + cache.Get(2) + cache.Get(3) + cache.Get(4) + cache.Get(5) +} + +func Equal(expected, actual int) { + if expected != actual { + log.Fatalln(expected, "!=", actual) + } else { + log.Println("OK") + } +} diff --git a/archive/algorithm/leetcode/15.c b/archive/algorithm/leetcode/15.c new file mode 100644 index 0000000..53d3b24 --- /dev/null +++ b/archive/algorithm/leetcode/15.c @@ -0,0 +1,160 @@ +#include +#include +#include +#include + +/** + * https://leetcode-cn.com/problems/3sum/description/ + * 三数之和 + */ +int **threeSum(int *nums, int numsSize, int *returnSize) +{ + int **ret = malloc(sizeof(int *) * numsSize); //行 + int len = numsSize; //数组现在的长度 + for (int i = 0; i < numsSize; i++) + { + ret[i] = malloc(sizeof(int) * 3); + memset(ret[i], 0, sizeof(int) * 3); + } + *returnSize = 0; + //排序 + int cmp(const void *a, const void *b) + { + return (*(int *)a - *(int *)b); + } + qsort(nums, numsSize, sizeof(int), &cmp); + //双指针的方法 + //-4,-1,-1,0,1,2 + for (int i = 0; i < numsSize - 2; i++) + { + if (nums[i] > 0) //有序的情况下,为正数是不可能=0的,跳出循环 + { + break; + } + if (i > 0 && nums[i] == nums[i - 1]) //向前检查数字重复 + continue; + int h = i + 1, w = numsSize - 1, target = -nums[i]; + //向中间移动 + while (h < w) + { + if (nums[h] + nums[w] == target) + { + //判断内存足够么 + if (len - 1 < *returnSize) + { + ret = realloc(ret, sizeof(int *) * (len + numsSize)); + //重新分配内存 + len += numsSize; + for (int i = *returnSize; i < len; i++) + { + ret[i] = malloc(sizeof(int) * 3); + memset(ret[i], 0, sizeof(int) * 3); + } + } + //符合条件 + ret[*returnSize][0] = nums[i]; + ret[*returnSize][1] = nums[h]; + ret[*returnSize][2] = nums[w]; + *returnSize = *returnSize + 1; + //跳过相同的数字 + while (h < w && nums[h] == nums[h + 1]) + h++; + while (h < w && nums[w] == nums[w - 1]) + w--; + h++; + w--; + } + else if (nums[h] + nums[w] < target) + { + //小一点,就往右移动 + h++; + } + else + { + //大一点 + w--; + } + } + } + + return ret; +} + +/* +int cmpfunc(const void * a, const void * b) +{ + return (*(int*)a - *(int*)b); +} + +int** threeSum(int* nums, int numsSize, int* returnSize) +{ + int front, back; + int i = 0; + int **result = 0; + int s = 0; + + qsort(nums, numsSize, sizeof(int), cmpfunc); + + while (i < numsSize) + { + int target = -nums[i]; + if (target < 0) + { + break; + } + + front = i + 1; + back = numsSize - 1; + + while (front < back) + { + int sum = nums[front] + nums[back]; + if (sum < target) + { + front++; + } + else if (sum > target) + { + back--; + } + else + { + s++; + result = (int **)realloc(result, sizeof(int *)*s); + int *temp = (int *)malloc(sizeof(int) * 3); + temp[0] = nums[i]; + temp[1] = nums[front]; + temp[2] = nums[back]; + result[s-1] = temp; + + while (front < back && nums[front] == temp[1]) + { + front++; + } + while (front < back && nums[back] == temp[2]) + { + back--; + } + } + } + while ((i + 1) < numsSize && nums[i] == nums[i + 1]) + { + i++; + } + i++; + } + + //returnSize = (int *)malloc(sizeof(int)); + *returnSize = s; + return result; +} +*/ + +int main() +{ + // int a[] = {-7, -4, -6, 6, 4, -6, -9, -10, -7, 5, 3, -1, -5, 8, -1, -2, -8, -1, 5, -3, -5, 4, 2, -5, -4, 4, 7}, size; + int a[] = {0, 0, 0, 0}, size; + int **ret = threeSum(a, sizeof(a) / sizeof(int), &size); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/155.c b/archive/algorithm/leetcode/155.c new file mode 100644 index 0000000..617531e --- /dev/null +++ b/archive/algorithm/leetcode/155.c @@ -0,0 +1,137 @@ +#include + +typedef struct Stack Stack; +// 大数组 +// TODO: 优化(骗人的todo) +typedef struct Stack +{ + int val; + Stack *next; +}; + +typedef struct +{ + Stack *min_stack; + Stack *stack; +} MinStack; + +/** initialize your data structure here. */ + +Stack *NewStack(int val) +{ + Stack *ret = malloc(sizeof(Stack)); + ret->val = val; + ret->next = NULL; + return ret; +} + +MinStack *minStackCreate() +{ + MinStack *ret = malloc(sizeof(MinStack)); + ret->min_stack = NewStack(-1); + ret->stack = NewStack(-1); + return ret; +} + +void minStackPush(MinStack *obj, int x) +{ + Stack *tmp = obj->min_stack->next, *prev = obj->min_stack; + while (tmp != NULL) + { + if (x < tmp->val) + { + prev->next = NewStack(x); + prev->next->next = tmp; + + tmp = obj->stack->next; + obj->stack->next = NewStack(x); + obj->stack->next->next = tmp; + return; + } + tmp = tmp->next; + prev = prev->next; + } + //最大 + prev->next = NewStack(x); + + tmp = obj->stack->next; + obj->stack->next = NewStack(x); + obj->stack->next->next = tmp; +} + +// void + +void minStackPop(MinStack *obj) +{ + int val = obj->stack->next->val; + Stack *tmp = obj->stack->next, *prev = obj->min_stack; + obj->stack->next = tmp->next; + free(tmp); + tmp = obj->min_stack->next; + while (tmp != NULL) + { + if (val == tmp->val) + { + prev->next = tmp->next; + free(tmp); + return; + } + tmp = tmp->next; + prev = prev->next; + } +} + +int minStackTop(MinStack *obj) +{ + return obj->stack->next->val; +} + +int minStackGetMin(MinStack *obj) +{ + return obj->min_stack->next->val; +} + +void minStackFree(MinStack *obj) +{ + freeStack(obj->stack); + freeStack(obj->min_stack); +} + +void freeStack(Stack *stack) +{ + Stack *tmp; + while (stack != NULL) + { + tmp = stack; + stack = stack->next; + free(tmp); + } +} + +/** + * Your MinStack struct will be instantiated and called as such: + * MinStack* obj = minStackCreate(); + * minStackPush(obj, x); + + * minStackPop(obj); + + * int param_3 = minStackTop(obj); + + * int param_4 = minStackGetMin(obj); + + * minStackFree(obj); +*/ + +int main() +{ + MinStack *minStack = minStackCreate(); + minStackPush(minStack, -2); + minStackPush(minStack, 0); + minStackPush(minStack, -3); + minStackGetMin(minStack); + minStackPop(minStack); + minStackTop(minStack); + minStackGetMin(minStack); + + minStackFree(minStack); +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/16.go b/archive/algorithm/leetcode/16.go new file mode 100644 index 0000000..1be0075 --- /dev/null +++ b/archive/algorithm/leetcode/16.go @@ -0,0 +1,41 @@ +package main + +import ( + "sort" +) + +func threeSumClosest(nums []int, target int) int { + min := int(^uint(0) >> 1) + minAbs := min + numLen := len(nums) + sort.Slice(nums, func(i, j int) bool { + return nums[i] < nums[j] + }) + for i := 0; i < numLen-2; i++ { + left, right := i+1, numLen-1 + for left < right { + tmp := nums[i] + nums[left] + nums[right] + tmpAbs := target - tmp + if tmpAbs < 0 { + tmpAbs = -tmpAbs + } + if tmp < target { + left++ + } else { + right-- + } + if tmpAbs < minAbs { + min = tmp + minAbs = tmpAbs + } + } + } + return min +} + +func main() { + println(threeSumClosest([]int{1, 2, 4, 8, 16, 32, 64, 128}, 82)) +} + +// [1,2,3,4,5,6,7,8,9] +// [-1,2,1,-4] diff --git a/archive/algorithm/leetcode/17.go b/archive/algorithm/leetcode/17.go new file mode 100644 index 0000000..80642c5 --- /dev/null +++ b/archive/algorithm/leetcode/17.go @@ -0,0 +1,39 @@ +package main + +var mapping = map[rune][]rune{ + '2': {'a', 'b', 'c'}, '3': {'d', 'e', 'f'}, + '4': {'g', 'h', 'i'}, '5': {'j', 'k', 'l'}, '6': {'m', 'n', 'o'}, + '7': {'p', 'q', 'r', 's'}, '8': {'t', 'u', 'v'}, '9': {'w', 'x', 'y', 'z'}, +} + +func dfs(digits string, ret []string) []string { + if digits == "" { + return ret + } + chars := mapping[rune(digits[0])] + if len(ret) == 0 { + for _, val := range chars { + ret = append(ret, string(val)) + } + } else { + retLen := len(ret) + for key, _ := range ret { + for _, val := range chars { + ret = append(ret, ret[key]+string(val)) + } + } + ret = ret[retLen:] + } + ret = dfs(digits[1:], ret) + return ret +} + +func letterCombinations(digits string) []string { + return dfs(digits, []string{}) +} + +func main() { + for _, val := range letterCombinations("26") { + println(val) + } +} diff --git a/archive/algorithm/leetcode/19.c b/archive/algorithm/leetcode/19.c new file mode 100644 index 0000000..b709f08 --- /dev/null +++ b/archive/algorithm/leetcode/19.c @@ -0,0 +1,66 @@ +#include +#include +#include + +// 删除链表的倒数第N个节点 +// https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ + +// 更优解:双指针 +struct ListNode +{ + int val; + struct ListNode *next; +}; + +struct ListNode *removeNthFromEnd(struct ListNode *head, int n) +{ + if (head->next == NULL) + { + return NULL; + } + int pos = 0, len = n + 1; + struct ListNode **arr = malloc(sizeof(struct ListNode *) * len); + struct ListNode *temp = malloc(sizeof(struct ListNode)); + temp->next = head; + head = temp; + while (temp != NULL) + { + arr[pos % len] = temp; + pos++; + temp = temp->next; + } + pos = abs((pos - len) % len); + if (arr[pos]->next == NULL) + { + arr[abs((pos - 1) % len)]->next = NULL; + } + else + { + arr[pos]->next = arr[pos]->next->next; + } + + return head->next; +} + +int main() +{ + struct ListNode *head = malloc(sizeof(struct ListNode)), *next = malloc(sizeof(struct ListNode)), *tmp; + head->val = 1; + head->next = next; + + next->val = 2; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 3; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + next->val = 4; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + next->val = 5; + next->next = NULL; + + removeNthFromEnd(head, 1); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/198.c b/archive/algorithm/leetcode/198.c new file mode 100644 index 0000000..8eaa018 --- /dev/null +++ b/archive/algorithm/leetcode/198.c @@ -0,0 +1,37 @@ +#include +#include + +#define MAX(a, b) a > b ? a : b; +int rob(int* nums, int numsSize) { + if (numsSize <= 0) { + return 0; + } + if (numsSize == 1) { + return nums[0]; + } + int *dp = malloc(sizeof(int) * numsSize), max = 0; + dp[0] = nums[0]; + dp[1] = MAX(nums[0], nums[1]); + for (int i = 2; i < numsSize; i++) { + dp[i] = MAX(dp[i - 1], dp[i - 2] + nums[i]); + } + max = MAX(dp[numsSize - 1], dp[numsSize - 2]); + return max; +} +/* +int rob(int* nums, int numsSize) { + int i=0; + int *dp=(int*)malloc(sizeof(int)*(numsSize+1)); + dp[0]=nums[0]; + dp[1]=nums[0]>nums[1]?nums[0]:nums[1]; + for(i=2;idp[i-2]+nums[i]?dp[i-1]:dp[i-2]+nums[i]; + } + return dp[numsSize-1]; +} +*/ +int main() { + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/2.c b/archive/algorithm/leetcode/2.c new file mode 100644 index 0000000..e6401a1 --- /dev/null +++ b/archive/algorithm/leetcode/2.c @@ -0,0 +1,28 @@ +#include + +/** + * https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/23/ + * 旋转数组 + */ + +void rotate(int *nums, int numsSize, int k) +{ + int end = 0; + for (int i = 0; i < k; i++) + { + //记录最后一位,数组向后移动一位 + end = nums[numsSize - 1]; + for (int n = 0; n < numsSize; n++) + { + nums[numsSize - n - 1] = nums[numsSize - n - 2]; + } + nums[0]=end; + } +} + +int main() +{ + int nums[] = {1, 2, 3, 4, 5, 6, 7}; + rotate(nums, 7, 3); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/20.c b/archive/algorithm/leetcode/20.c new file mode 100644 index 0000000..5b2e434 --- /dev/null +++ b/archive/algorithm/leetcode/20.c @@ -0,0 +1,39 @@ +#include +#include + +typedef int bool; + +#define false 0 +#define true 1 + +bool isValid(char *s) +{ + int len = strlen(s), stackpos = 0; + char stack[len / 2 + 1]; + int pos = 0; + len = len / 2 + 1; + while (s[pos] != '\x0') + { + if (stackpos >= len) + { + return false; + } + if (s[pos] == '(') + stack[stackpos++] = ')'; + else if (s[pos] == '{') + stack[stackpos++] = '}'; + else if (s[pos] == '[') + stack[stackpos++] = ']'; + else if (stackpos <= 0 || s[pos] != stack[--stackpos]) + return false; + + pos++; + } + return stackpos == 0; +} + +int main() +{ + isValid("(([])){}"); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/200.c b/archive/algorithm/leetcode/200.c new file mode 100644 index 0000000..8650a24 --- /dev/null +++ b/archive/algorithm/leetcode/200.c @@ -0,0 +1,78 @@ +#include +#include +/** + * 岛屿的个数 + * https://lingkou.com/problems/number-of-islands/description/ + */ + +/** + * 标记岛屿 + */ +void mark(char **grid, int h, int l, int row, int col) +{ + if (h < 0 || h >= row || l < 0 || l >= col || grid[h][l] != '1') + { + return; + } + grid[h][l] = '2'; + //标记旁边的岛 上,下,左,右 + mark(grid, h + 1, l, row, col); + mark(grid, h - 1, l, row, col); + mark(grid, h, l + 1, row, col); + mark(grid, h, l - 1, row, col); +} + +int numIslands(char **grid, int gridRowSize, int gridColSize) +{ + int num = 0; + for (int i = 0; i < gridRowSize; i++) + { + for (int n = 0; n < gridColSize; n++) + { + if (grid[i][n] == '1') + { + num++; + mark(grid, i, n, gridRowSize, gridColSize); + } + } + } + return num; +} + +/* +void mark(char** grid, int gridRowSize, int gridColSize, int i, int j) { + if(grid[i][j] == '0') + return; + grid[i][j] = '0'; + if(i > 0) + mark(grid, gridRowSize, gridColSize, i - 1, j); + if(j > 0) + mark(grid, gridRowSize, gridColSize, i, j - 1); + if(i < gridRowSize - 1) + mark(grid, gridRowSize, gridColSize, i + 1, j); + if(j < gridColSize - 1) + mark(grid, gridRowSize, gridColSize, i, j + 1); +} +int numIslands(char** grid, int gridRowSize, int gridColSize) { + int i = 0, j = 0; + int result = 0; + for(i = 0; i < gridRowSize; i++) { + for(j = 0; j < gridColSize; j++) { + if(grid[i][j] == '1') { + result++; + mark(grid, gridRowSize, gridColSize, i, j); + } + } + } + return result; +} +*/ + +int main() +{ + char a[4][5] = {{'1', '1', '1', '1', '0'}, {'1', '1', '0', '1', '0'}, {'1', '1', '0', '0', '0'}, {'0', '0', '0', '0', '0'}}; + printf("%p\n", a); + numIslands(a, 4, 5); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/206.c b/archive/algorithm/leetcode/206.c new file mode 100644 index 0000000..2c71129 --- /dev/null +++ b/archive/algorithm/leetcode/206.c @@ -0,0 +1,57 @@ +#include +#include + +//https://leetcode-cn.com/problems/reverse-linked-list/ +//反转链表 +struct ListNode +{ + int val; + struct ListNode *next; +}; + +struct ListNode *reverseList(struct ListNode *head) +{ + if (head == NULL) + { + return NULL; + } + struct ListNode *tail = head, *next = head->next, *tmp = NULL; + while (next != NULL) + { + tmp = next->next; + tail->next = tmp; + next->next = head; + head = next; + next = tmp; + } + return head; +} + +// a->b->c->d->e +// b->a->c->d->e +// c->b->a->d->e +// c->b->a->d->e + +int main() +{ + struct ListNode *head = malloc(sizeof(struct ListNode)), *next = malloc(sizeof(struct ListNode)); + head->val = 1; + head->next = next; + next->val = 2; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 3; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 4; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 5; + next->next = NULL; + + reverseList(head); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/21.c b/archive/algorithm/leetcode/21.c new file mode 100644 index 0000000..4bcfc63 --- /dev/null +++ b/archive/algorithm/leetcode/21.c @@ -0,0 +1,102 @@ +#include +#include + +struct ListNode +{ + int val; + struct ListNode *next; +}; + +struct ListNode *mergeTwoLists(struct ListNode *l1, struct ListNode *l2) +{ + if (l1 == NULL) + { + return l2; + } + if (l2 == NULL) + { + return l1; + } + struct ListNode *node = l1, *node2 = l2, *prev = node; + while (node != NULL) + { + if (node2 != NULL && node->val > node2->val) + { + //第一个链表的值大于第二个链表的值,合并链表直到node2大于node1 + if (prev == node) + { + //首节点 + l1 = node2; + while (node2 != NULL && node2->val <= node->val) + { + prev = node2; + node2 = node2->next; + } + prev->next = node; + } + else + { + while (node2 != NULL && node2->val <= node->val) + { + prev->next = node2; + prev = node2; + node2 = node2->next; + } + + prev->next = node; + } + } + prev = node; + node = node->next; + } + if (node2 != NULL) + { + prev->next = node2; + } + return l1; +} +/* +struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) +{ + struct ListNode *previous = NULL; + struct ListNode *t2 = l2; + struct ListNode *head = l1; + + while (t2) + { + if (!l1 || (l1->val > t2->val)) + { + l2 = l2->next; + t2->next = l1; + + if (previous) + { + previous->next = t2; + } + else + { + head = t2; + } + + t2 = l2; + l1 = head; + } + + previous = l1; + l1 = l1->next; + } + + return head; +} +*/ + +int main() +{ + struct ListNode *node1 = malloc(sizeof(struct ListNode)), *node2 = malloc(sizeof(struct ListNode)); + node1->val = 1; + node1->next = NULL; + node2->val = 3; + node2->next = NULL; + mergeTwoLists(node1, node2); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/217.c b/archive/algorithm/leetcode/217.c new file mode 100644 index 0000000..3dd3466 --- /dev/null +++ b/archive/algorithm/leetcode/217.c @@ -0,0 +1,28 @@ +#include + +/** + * https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/24/ + * 数组存在重复 + */ + +int containsDuplicate(int *nums, int numsSize) +{ + for (int i = 0; i < numsSize - 1; i++) + { + for (int n = i + 1; n < numsSize; n++) + { + if (nums[i] == nums[n]) + { + return 1; + } + } + } + return 0; +} + +int main() +{ + int nums[] = {1, 2, 3, 4, 5, 6, 7, 7}; + containsDuplicate(nums, 8); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/22.c b/archive/algorithm/leetcode/22.c new file mode 100644 index 0000000..7d6f13b --- /dev/null +++ b/archive/algorithm/leetcode/22.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +void dfs(char** ret, int* num, char* S, int n, int use, int ruse) { + if (use >= n && ruse >= n) { + //左括号用完了 + ret[*num] = S; + *num += 1; + return; + } + if (use < n) { + char* tmp = malloc((n * 2) + 1); + memset(tmp, 0, (n * 2) + 1); + strcpy(tmp, S); + tmp[strlen(S)] = '('; + dfs(ret, num, tmp, n, use + 1, ruse); + } + if (ruse < use) { + char* tmp = malloc((n * 2) + 1); + memset(tmp, 0, (n * 2) + 1); + strcpy(tmp, S); + S[strlen(S)] = ')'; + dfs(ret, num, S, n, use, ruse + 1); + } +} + +/** + * Note: The returned array must be malloced, assume caller calls free(). + */ +char** generateParenthesis(int n, int* returnSize) { + char** ret = malloc(pow(n, n) * sizeof(char*)); + char* S = malloc((n * 2) + 1); + memset(S, 0, (n * 2) + 1); + dfs(ret, returnSize, S, n, 0, 0); + return ret; +} +// 1 2 5 14 42 132 +int main() { + int num = 0; + char** ret = generateParenthesis(10, &num); + for (int i = 0; i < num; i++) { + printf("%s\n", ret[i]); + } + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/22.go b/archive/algorithm/leetcode/22.go new file mode 100644 index 0000000..4749b43 --- /dev/null +++ b/archive/algorithm/leetcode/22.go @@ -0,0 +1,27 @@ +package main + +func dfs(str string, ret *[]string, n, l, r int) { + if r >= n { + *ret = append(*ret, str) + return + } + if l < n { + dfs(str+"(", ret, n, l+1, r) + } + if r < l { + dfs(str+")", ret, n, l, r+1) + } +} + +func generateParenthesis(n int) []string { + ret := []string{} + dfs("", &ret, n, 0, 0) + return ret +} + +func main() { + ret := generateParenthesis(3) + for _, val := range ret { + println(val + " ") + } +} diff --git a/archive/algorithm/leetcode/231.c b/archive/algorithm/leetcode/231.c new file mode 100644 index 0000000..588f50b --- /dev/null +++ b/archive/algorithm/leetcode/231.c @@ -0,0 +1,27 @@ +#include +#include + +#define bool int +#define true 1 +#define false 0 +bool isPowerOfTwo(int num) +{ + while (num % 2 == 0) + { + num /= 2; + if (num == 0) + { + return false; + } + } + return num == 1; +} + +int main() +{ + isPowerOfTwo(27); + isPowerOfTwo(4); + isPowerOfTwo(16); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/242.c b/archive/algorithm/leetcode/242.c new file mode 100644 index 0000000..fca0c47 --- /dev/null +++ b/archive/algorithm/leetcode/242.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/problems/valid-anagram/description/ + * 有效的字母异位词 + */ + +bool isAnagram(char *s, char *t) +{ + int hash[26] = {0}, hash2[26] = {0}, i = 0; + while (1) + { + if (s[i] == '\x0') + { + if (t[i] == '\x0') + { + break; + } + return 0; + } + if (t[i] == '\x0') + { + return 0; + } + hash[s[i] - 'a']++; + hash2[t[i] - 'a']++; + i++; + } + for (int i = 0; i < 26; i++) + { + if (hash[i] != hash2[i]) + { + return 0; + } + } + return 1; +} +int main() +{ + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/268.go b/archive/algorithm/leetcode/268.go new file mode 100644 index 0000000..6141ebf --- /dev/null +++ b/archive/algorithm/leetcode/268.go @@ -0,0 +1,14 @@ +package main + +func missingNumber(nums []int) int { + ret := 0 + len := len(nums) + for i := 0; i < len; i++ { + ret = ret ^ i ^ nums[i] + } + return ret ^ len +} + +func main() { + println(missingNumber([]int{9, 6, 4, 2, 3, 5, 7, 0, 1})) +} diff --git a/archive/algorithm/leetcode/27.c b/archive/algorithm/leetcode/27.c new file mode 100644 index 0000000..4b22fc3 --- /dev/null +++ b/archive/algorithm/leetcode/27.c @@ -0,0 +1,40 @@ +#include + +//01223042 +//01230422 +int removeElement(int *nums, int numsSize, int val) +{ + int ret = 0; + for (int i = 0; i < numsSize - ret; i++) + { + if (nums[i] == val) + { + for (int n = i; n < numsSize - ret - 1; n++) + { + nums[n] = nums[n + 1]; + } + ret++; + i--; + } + } + return numsSize - ret; +} +/* +int removeElement(int* nums, int numsSize, int val) { + int pos = 0; + for(int i=0; i +#include +#include +#include +/** + * https://leetcode-cn.com/problems/implement-strstr/description/ + * 实现strStr() + */ +//a +int strStr(char *haystack, char *needle) +{ + if (*needle == '\x0') + { + return 0; + } + int pos = 0; + int sublen = strlen(needle); + while (*haystack != '\x0') + { + if (*haystack == *needle) + { + char *sub = haystack; + char *tmp = needle; + int len = 0; + while (*sub == *tmp && len < sublen) + { + len++; + sub++; + tmp++; + } + if (len == sublen) + { + return pos; + } + } + haystack++; + pos++; + } + return -1; +} +/* +int strStr(char* haystack, char* needle) { + int i=0, j=0, temp; + + if( *needle == 0 ) return 0; + if( strlen(haystack) < strlen(needle) ) return -1; + + while( haystack[i] != 0) { + while( haystack[i] != 0 && haystack[i] != needle[j] ) i++; + if( haystack[i] == 0 ) return -1; + i++; j++; + temp = i; + while( haystack[i] != 0 && needle[j] != 0 ) { + if( haystack[i] != needle[j] ) { + j = 0; + i = temp; + break; + } + i++; j++; + } + // printf("haystack = %d, sizeof(needle) = %d, haystackTmp = %d", haystack, strlen(needleTmp), haystackTmp); + if( needle[j] == 0 ) return (i - j); + } + return -1; +} +*/ + +int main() +{ + printf("%d\n", strStr("hello", "lll")); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/283.c b/archive/algorithm/leetcode/283.c new file mode 100644 index 0000000..cd36841 --- /dev/null +++ b/archive/algorithm/leetcode/283.c @@ -0,0 +1,58 @@ +#include +#include +#include +#include + +/** + * 移动零 + * https://leetcode-cn.com/problems/move-zeroes/description/ + */ +void moveZeroes(int *nums, int numsSize) +{ + int zeroNumber = 0; + for (int i = numsSize - 1; i >= 0; i--) + { + if (nums[i] == 0) //等于0时,往后移动 + { + for (int n = i; n < numsSize - zeroNumber - 1; n++) //后面的数字直接的往前赋值 + { + nums[n] = nums[n + 1]; + } + nums[numsSize - zeroNumber - 1] = 0; + zeroNumber++; + } + } +} +/* +void moveZeroes(int* nums, int numsSize) { + int zeroNum = 0; + int i; + for (i = 0; i < numsSize; i++) { + if (nums[i] == 0) { + zeroNum++; + } else { + nums[i-zeroNum] = nums[i]; + } + } + for (i = numsSize-zeroNum; i < numsSize; i++) { + nums[i] = 0; + } +} +*/ +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + int tmp[] = {0, 1, 0, 3, 12}; + moveZeroes(tmp, sizeof(tmp) / sizeof(int)); + print_r(tmp, sizeof(tmp) / sizeof(int)); + getchar(); + return 0; +} diff --git a/archive/algorithm/leetcode/29.c b/archive/algorithm/leetcode/29.c new file mode 100644 index 0000000..68cd9e1 --- /dev/null +++ b/archive/algorithm/leetcode/29.c @@ -0,0 +1,127 @@ +#include + +/** + * https://leetcode-cn.com/problems/divide-two-integers/description/ + * 两数相除,不能直接使用乘法除法 + */ + +int add(int num1, int num2) +{ + while (num2) + { + int tmp = num1 ^ num2; + num2 = (num1 & num2) << 1; + num1 = tmp; + } + return num1; +} +int sub(int num1, int num2) +{ + return add(num1, add(~num2, 1)); +} + +int negative(int num) //判断负数 +{ + return (num >> 31) & 1; +} + +int abs_(int num) +{ + if (negative(num)) //右移31位判断正负 + { + return add(~num, 1); //负数 + } + return num; +} + +int divide(int dividend, int divisor) +{ + int flag = 1; + if (negative(dividend) == negative(divisor)) + { + flag = 0; + } + unsigned int x = abs_(dividend); + unsigned int y = abs_(divisor); + unsigned int result = 0; + for (int i = 31; i >= 0; i--) + { + if ((x >> i) >= y) + { + result = add(result, 1 << i); + x = sub(x, y << i); + } + } + if (flag) + { + //负数 + if (result > 2147483648) + { + return 2147483647; + } + return add(~result,1); + } + else + { + //正数 + if (result > 2147483647) + { + return 2147483647; + } + return result; + } +} + +/* + 对于int a = 0x80000000; + long long int b = -a; + 而言,b依然是-2147483648,只不过是长长整型的-2147483648 + 可能是右边的-a运算,由于预期的结果溢出,所以就没有做负号运算 + 原先认为的是-a会导致溢出从而结果为0,实际测试发现不是 + long long int d = ((long long int)dividend > 0) ? (long long int)dividend : -(long long int)dividend; + long long int div = ((long long int)divisor > 0) ? (long long int)divisor : -(long long int)divisor; +*/ +/** +int divide(int dividend, int divisor) { + if (divisor == 1) + return dividend; + + if (divisor == -1) + { + if (dividend == (int)0x80000000) + return 0x7FFFFFFF; + else + return -dividend; + } + + int cnt = 0, factor = 0, i = 0; + long long int d = dividend; + long long int div = divisor; + + d = (d > 0) ? d : -d; + div = (div > 0) ? div : -div; + + if ((dividend ^ divisor) & 0x80000000) + factor = -1; + else + factor = 1; + + while (d >= div) + { + i = 0; + while (d >= (div << i)) + { + d -= (div << i); + cnt += (1 << i++); + } + } + + return factor*cnt; +} +*/ +int main() +{ + printf("%d\n", divide(-2147483648, -1)); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/3.c b/archive/algorithm/leetcode/3.c new file mode 100644 index 0000000..fd976fc --- /dev/null +++ b/archive/algorithm/leetcode/3.c @@ -0,0 +1,46 @@ +#include +#include +#include +/** + * https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/description/ + * 无重复字符的最长子串 + */ + +int lengthOfLongestSubstring(char *s) +{ + //初始化变量 + int len = strlen(s); + int *hash = malloc(128 * sizeof(int)); + memset(hash, -1, sizeof(int) * 128); + int maxlen = 0, nowlen = 0; + for (int i = 0; i < len; i++, nowlen++) + { + if (hash[s[i]] != -1 && hash[s[i]] >= i - nowlen) //利用一个数组增加来判断是否重复 + { + if (nowlen > maxlen) + { + maxlen = nowlen; + } + //上一次位置:hash[s[i],现在这一次位置:i + //重新计算长度 nowlen=i-hash[s[i]]-1 + nowlen = i - hash[s[i]] - 1; + } + hash[s[i]] = i;//记录位置 + } + if (nowlen > maxlen) //最后的没有判断 + { + maxlen = nowlen; + } + return maxlen; +} + +int main() +{ + printf("%d\n", lengthOfLongestSubstring("abcabcbb")); + printf("%d\n", lengthOfLongestSubstring("aab")); + printf("%d\n", lengthOfLongestSubstring("dvdf")); + printf("%d\n", lengthOfLongestSubstring("bbbbb")); + printf("%d\n", lengthOfLongestSubstring("pwwkew")); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/303.c b/archive/algorithm/leetcode/303.c new file mode 100644 index 0000000..aabdfb4 --- /dev/null +++ b/archive/algorithm/leetcode/303.c @@ -0,0 +1,63 @@ +#include +#include + +typedef struct { + int* nums; + int* sum; +} NumArray; + +NumArray* numArrayCreate(int* nums, int numsSize) { + NumArray* obj = malloc(sizeof(NumArray)); + obj->nums = nums; + obj->sum = malloc(sizeof(int) * numsSize); + obj->sum[0] = nums[0]; + for (int i = 1; i < numsSize; i++) { + obj->sum[i] = obj->sum[i - 1] + nums[i]; + } + return obj; +} + +int numArraySumRange(NumArray* obj, int i, int j) { + return (obj->sum[j] - obj->sum[i])+obj->nums[i]; +} + +void numArrayFree(NumArray* obj) { free(obj); } +/* + +typedef struct { + int *nums; + int numsSize; + +} NumArray; + +NumArray *numArrayCreate(int *nums, int numsSize) { + + + int *a = malloc(numsSize * sizeof(int) + 1); + a[0] = 0; + for (int k = 0; k < numsSize; k++) { + a[k + 1] = a[k] + nums[k]; + } + + NumArray *arr = malloc(sizeof(NumArray)); + arr->nums = a; + arr->numsSize = numsSize; + return arr; +} + +int numArraySumRange(NumArray *obj, int i, int j) { + return obj->nums[j + 1] - obj->nums[i]; +} + +void numArrayFree(NumArray *obj) { + free(obj->nums); + free(obj); +} +*/ + +/** + * Your NumArray struct will be instantiated and called as such: + * struct NumArray* obj = numArrayCreate(nums, numsSize); + * int param_1 = numArraySumRange(obj, i, j); + * numArrayFree(obj); + */ \ No newline at end of file diff --git a/archive/algorithm/leetcode/326.c b/archive/algorithm/leetcode/326.c new file mode 100644 index 0000000..b382cec --- /dev/null +++ b/archive/algorithm/leetcode/326.c @@ -0,0 +1,36 @@ +#include +#include + +#define bool int +#define true 1 +#define false 0 + +bool isPowerOfThree(int n) +{ + double a = log10l(n) / log10l(3); + if (a - ((int)a) == 0) + { + return true; + } + return false; +} +/* +第二种不用循环的解法 +bool isPowerOfThree(int n) { + if(n <= 0) return false; + while ( n % 3 == 0) { + n /= 3; + if( n==0 ) return false; + } + return n == 1; +} +*/ + +int main() +{ + isPowerOfThree(27); + isPowerOfThree(243); + isPowerOfThree(4782968); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/33.c b/archive/algorithm/leetcode/33.c new file mode 100644 index 0000000..f642437 --- /dev/null +++ b/archive/algorithm/leetcode/33.c @@ -0,0 +1,53 @@ +#include + +// https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ +// 搜索旋转排序数组 + +int search(int *nums, int numsSize, int target) +{ + int start = 0, mid = 0, end = numsSize - 1; + while (start <= end) + { + mid = start + ((end - start) >> 1); + if (nums[mid] == target) + { + return mid; + } + if (nums[start] <= nums[mid]) + { + //前半部分有序 + if (target < nums[mid] && nums[start] <= target) + { + //目标数在前半部分中 + end = mid - 1; + } + else + { + //在无序的后半部分 + start = mid + 1; + } + } + else + { + //后半部分有序 + if (target <= nums[end] && nums[mid] < target) + { + //目标数在后半部分中 + start = mid + 1; + } + else + { + //在无序的前半部分 + end = mid - 1; + } + } + } + return -1; +} + +int main() +{ + int a[] = {4, 5, 6, 7, 0, 1, 2}; + search(a, sizeof(a) / sizeof(int), 0); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/338.c b/archive/algorithm/leetcode/338.c new file mode 100644 index 0000000..fa80e29 --- /dev/null +++ b/archive/algorithm/leetcode/338.c @@ -0,0 +1,36 @@ +#include +#include +// 0 1 +/** + * Return an array of size *returnSize. + * Note: The returned array must be malloced, assume caller calls free(). + */ +int* countBits(int num, int* returnSize) { + int *dp = malloc(sizeof(int) * (num + 1)), count = 2, pos = 0; + dp[0] = 0; + dp[1] = 1; + for (int i = 2; i <= num; i++) { + pos = i % count; + if (!pos && count != i) { + count = count * 2; + } + dp[i] = dp[pos] + 1; + } + *returnSize = num + 1; + return dp; +} +/* +int* countBits(int num, int* rS) { + *rS = num+1; + int *res = calloc(num+2, sizeof(int)); + res[0] = 0; res[1] = 1; + int i=2, j; + while(i<=num) { + for(j=i; j<=num&&j<(i<<1); j++) { + res[j] = 1+res[j-i]; + } + i <<= 1; + } + return res; +} +*/ \ No newline at end of file diff --git a/archive/algorithm/leetcode/342.c b/archive/algorithm/leetcode/342.c new file mode 100644 index 0000000..e54936d --- /dev/null +++ b/archive/algorithm/leetcode/342.c @@ -0,0 +1,27 @@ +#include +#include + +#define bool int +#define true 1 +#define false 0 +bool isPowerOfFour(int num) +{ + while (num % 4 == 0) + { + num /= 4; + if (num == 0) + { + return false; + } + } + return num == 1; +} + +int main() +{ + isPowerOfFour(27); + isPowerOfFour(4); + isPowerOfFour(16); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/344.c b/archive/algorithm/leetcode/344.c new file mode 100644 index 0000000..ba7bbfe --- /dev/null +++ b/archive/algorithm/leetcode/344.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/problems/reverse-string/description/ + * 反转字符串 + */ +char *reverseString(char *s) +{ + int len = strlen(s); + for (int i = 0; i < len/2; i++) + { + s[i] ^= s[len - 1 - i]; + s[len - 1 - i] ^= s[i]; + s[i] ^= s[len - 1 - i]; + } + return s; +} + +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + char s[] = "hello"; + printf("%s\n", reverseString(s)); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/350.c b/archive/algorithm/leetcode/350.c new file mode 100644 index 0000000..b99f32a --- /dev/null +++ b/archive/algorithm/leetcode/350.c @@ -0,0 +1,86 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/description/ + * 两个数组的交集 II + */ + +int *intersect(int *nums1, int nums1Size, int *nums2, int nums2Size, int *returnSize) +{ + int *ret = 0, len = nums1Size; + if (nums1Size > nums2Size) //num1换为长的 + { + // int *tmp = nums1; + // nums1 = nums2; + // nums2 = tmp; + len = nums2Size; + } + ret = malloc(sizeof(int) * len); + len = 0; + for (int i = 0; i < nums1Size; i++) + { + for (int n = len; n < nums2Size; n++) //从len开始 + { + if (nums1[i] == nums2[n]) //每当相等时,将这个位置的数字和len位置的对调 + { + nums2[n] = nums2[len]; + nums2[len] = nums1[i]; + ret[len++] = nums1[i]; + break; + } + } + } + *returnSize = len; + return ret; +} + +/* +//大佬的写法 +int cmp(const void * a, const void * b) +{ + if(*(int *)a == INT_MIN) + return (*(int *)a); + else if (*(int *)b == INT_MIN) + return 1; + else + return (*(int*)a - *(int*)b); +} +int* intersect(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize) { + qsort(nums1,nums1Size,sizeof(int),cmp); + qsort(nums2,nums2Size,sizeof(int),cmp); + int len = nums1Size < nums2Size ? nums1Size : nums2Size; + int * res = malloc(sizeof(int)*len); + int length = 0; + int i = 0 ,j = 0; + while(inums2[j]) + j++; + else if(nums1[i] +#include +#include +#include + +/** + * https://leetcode-cn.com/problems/valid-sudoku/description/ + * 有效的数独 + */ + +int isValidSudoku(char **board, int boardRowSize, int boardColSize) +{ + for (int i = 0; i < 9; i++) + { + int hash[9] = {0}; + for (int n = 0; n < 9; n++) + { + if (board[i][n] != '.') + { + hash[board[i][n] - 49]++; + if (hash[board[i][n] - 49] > 1) + { + return 0; + } + } + } + } + for (int i = 0; i < 9; i++) + { + int hash[9] = {0}; + for (int n = 0; n < 9; n++) + { + if (board[n][i] != '.') + { + hash[board[n][i] - 49]++; + if (hash[board[n][i] - 49] > 1) + { + return 0; + } + } + } + } + //对小块进行校验 + for (int p1 = 0; p1 < 3; p1++) + { + for (int p = 0; p < 3; p++) + { + int hash[9] = {0}; + for (int i = 0; i < 3; i++) + { + for (int n = 0; n < 3; n++) + { + int x = p1 * 3 + i, y = p * 3 + n; + if (board[x][y] != '.') + { + hash[board[x][y] - 49]++; + if (hash[board[x][y] - 49] > 1) + { + return 0; + } + } + } + } + } + } + return 1; +} +/* +bool isValidSudoku(char** board, int boardRowSize, int boardColSize) { + int i, j, tmp, l; + int flag[27][9]; + for (i=0; i<27; i++) { + for (j=0; j<9; j++) { + flag[i][j] = 0; + } + } + for (i=0; i +#include +#include +#include +/** + * https://leetcode-cn.com/problems/count-and-say/description/ + * 报数 + */ +//111221 +//312211 +//13112221 +char *countAndSay(int n) +{ + char *s = malloc(n*n*n), *tmp_ret = malloc(n*n*n); + int len = 1; + memset(s, 0, n*n*n); + memset(tmp_ret, 0, n*n*n); + strcpy(s, "1"); + for (int i = 1; i < n; i++) + { + char last_chr = s[0]; + int last_num=1; + for (int n = 1; n < len; n++) + { + if (s[n] != last_chr) + { + char tmp[3] = {0}; + tmp[0] = '0' + last_num; + tmp[1] = last_chr; + strcat(tmp_ret, tmp); + last_chr = s[n]; + last_num = 1; + } + else + { + last_num++; + } + } + char tmp[3] = {0}; + tmp[0] = '0' + last_num; + tmp[1] = last_chr; + strcat(tmp_ret, tmp); + strcpy(s, tmp_ret); + memset(tmp_ret, 0, n*n*n); + len = strlen(s); + }; + free(tmp_ret); + return s; +} +/* +char* countAndSay(int n) { + char *num = (char*)malloc(sizeof(char)*2); + char *num1, *p, *q; + int index; + // char c; + + num[0] = '1'; + num[1] = '\0'; + while(n>1){ + index = 0; + p = q = num; + num1 = (char*)malloc(sizeof(char)*strlen(num)*2+1); + + while(*q){ + if(*p != (*(q + 1))){ + num1[index++] = q - p + '1'; + num1[index++] = *p; + p = q + 1; + } + q++; + } + num1[index] = '\0'; + + free(num); + num = num1; + + n--; + } + + return num; +} +*/ + +int main() +{ + countAndSay(40); + countAndSay(20); + countAndSay(10); + countAndSay(12); + countAndSay(14); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/387.c b/archive/algorithm/leetcode/387.c new file mode 100644 index 0000000..8118b28 --- /dev/null +++ b/archive/algorithm/leetcode/387.c @@ -0,0 +1,71 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/problems/first-unique-character-in-a-string/description/ + * 字符串中的第一个唯一字符 + */ + +int firstUniqChar(char *s) +{ + struct hash_pos + { + char num; + short pos; + }; + struct hash_pos hash[26] = {0}; + int pos = -1, i = 0; + while (s[i] != '\x0') + { + hash[s[i] - 97].num += 1; + hash[s[i] - 97].pos = i++; + } + for (int i = 0; i < 26; i++) + { + if (hash[i].num == 1 && (pos > hash[i].pos || pos == -1)) + { + pos = hash[i].pos; + } + } + return pos; +} +/* +int firstUniqChar(char* s) { + int i,j; + int len=strlen(s); + int b[26]; + for(int k=0;k<26;k++) + { + b[k]=0; + } + for(i=0;i + +/** + * https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/25/ + * 只出现一次的数字 + */ +int containsDuplicate(int *nums, int numsSize) +{ + int ret=0; + for (int i = 0; i < numsSize; i++) + { + ret^=nums[i]; + } + return ret; +} + +int main() +{ + int nums[] = {1, 2,3,3,8,2,1,5,9,4,9,5,4}; + int b = containsDuplicate(nums, sizeof(nums) / 4); + printf("%d\n", b); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/413.c b/archive/algorithm/leetcode/413.c new file mode 100644 index 0000000..310b888 --- /dev/null +++ b/archive/algorithm/leetcode/413.c @@ -0,0 +1,34 @@ +int numberOfArithmeticSlices(int* A, int ASize) { + int *dp = malloc(sizeof(int) * ASize), ret = 0; + memset(dp, 0, sizeof(int) * ASize); + dp[0] = 0; + dp[1] = 0; + for (int i = 2; i < ASize; i++) { + if (A[i] - A[i - 1] == A[i - 1] - A[i - 2]) { + dp[i] = dp[i - 1]+1; + } + } + for(int i=2;i2) sum += count*(count-3)/2+1; + count = 2; + pred = A[i]-A[i-1]; + } + } + if(count>2) sum += count*(count-3)/2+1; + return sum; +} +*/ \ No newline at end of file diff --git a/archive/algorithm/leetcode/48.c b/archive/algorithm/leetcode/48.c new file mode 100644 index 0000000..18f54fb --- /dev/null +++ b/archive/algorithm/leetcode/48.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/problems/rotate-image/description/ + * 旋转图像 + */ + +//123 +//456 +//789 + +//963 +//852 +//741 + +//741 +//852 +//963 + +//1,0 +//2,1 + +//0,0 2,2 +//2,0 2,0 +//1,0 2,1 +//0,1 1,2 + +void rotate(int matrix[3][3], int matrixRowSize, int *matrixColSizes) +{ + //先换对角 + int count = matrixRowSize; + for (int i = 0; i < count; i++) //对角线交换元素 + { + for (int n = 0; n < count - i; n++) + { + if (i == count - 1 - n &&n == count - 1 - i) + { + continue; + } + matrix[i][n] ^= matrix[count - 1 - n][count - 1 - i]; + matrix[count - 1 - n][count - 1 - i] ^= matrix[i][n]; + matrix[i][n] ^= matrix[count - 1 - n][count - 1 - i]; + } + } + //以中间为轴换 + for (int i = 0; i < count / 2; i++) + { + for (int n = 0; n < count; n++) + { + matrix[i][n] ^= matrix[count-1 - i][n]; + matrix[count-1 - i][n] ^= matrix[i][n]; + matrix[i][n] ^= matrix[count-1 - i][n]; + } + } +} +/* +void rotate(int** matrix, int matrixRowSize, int *matrixColSizes) { + int i = 0, j = 0, key; + int n =matrixRowSize; + for(i = 0; i < n / 2; i++){ + for(j = i; j < n-1-i; j++){ + key = matrix[i][j]; + matrix[i][j] = matrix[n - 1 - j][i]; + matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]; + matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]; + matrix[j][n - 1 - i] = key; + } + } + +} +*/ + +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + int a[3][3] = {{1, 2, 3}, + {4, 5, 6}, + {7, 8, 9}}; + int *b = malloc(4); + rotate(a, 3, b); + printf("%d\n", 6 ^ 6); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/5.c b/archive/algorithm/leetcode/5.c new file mode 100644 index 0000000..0fe7974 --- /dev/null +++ b/archive/algorithm/leetcode/5.c @@ -0,0 +1,136 @@ +#include +#include +#include +#include + +/** + * 最长回文子串 + * https://leetcode-cn.com/problems/longest-palindromic-substring/description/ + */ + +/** + * 看网上的Manacher算法 + */ +char *longestPalindrome(char *s) +{ + if (strlen(s) <= 1) + { + return s; + } + char new_s[2010] = {0}; + int p[2010] = {0}; + // memset(p, 0, sizeof(int) * (strlen(s) * 2 + 1)); //创建p + // memset(new_s, 0, strlen(s) * 2 + 1); //构建一个新的字符串 + //给字符串填充#分割 + int len = strlen(s); + for (int i = 0; i < len; i++) + { + new_s[i * 2] = '#'; + new_s[(i * 2) + 1] = s[i]; + } + new_s[len * 2] = '#'; + p[0] = 1; + int id = 0, mx = 0, max_pos = 0, max_len = 0; + for (int i = 1; i < strlen(new_s); i++) + { + if (i < mx) + { + p[i] = p[2 * id - i] > mx - i ? mx - i : p[2 * id - i]; + } + else + { + p[i] = 1; + } + while (i - p[i] >= 0 && new_s[i - p[i]] == new_s[i + p[i]]) + { + p[i]++; + } + if (mx < i + p[i]) + { + id = i; + mx = i + p[i]; + } + if (max_len < p[i] - 1) + { + max_pos = i; + max_len = p[i] - 1; + } + } + char *ret = malloc(max_len + 1); //返回的字符串 + memset(ret, 0, max_len); + int pos = max_pos / 2 + max_pos % 2 - max_len / 2 - max_len % 2; + memcpy(ret, &s[pos], max_len); + return ret; +} +/* +char* longestPalindrome(char* s) { + int max = 1, len; + int left, right; + int maxLeft = 0; + int totalLen = strlen(s); + int i,j; + char *res = (char *) calloc(1, 1001); + if(totalLen == 1) { + res[0] = s[0]; + return res; + } + for(i = 0; i < totalLen - 1; /*i++) { + if(totalLen-i<=max/2) + break; + //first, pass consecutive numbers equal to each other + right = i; + left = i; + while((right < totalLen - 1) && (s[right] == s[right + 1])) { + right ++; + } + + //second, set i = r + 1, for there is no len larger when start from i to r + i = right + 1; + + //third, count those s[right] == s[left] + while((left > 0) && (right < totalLen - 1) && (s[left - 1] == s[right + 1])) { + right++; + left--; + } + + if(right - left + 1 > max) { + maxLeft = left; + max = right - left + 1; + } + } + + + strncpy(res, s + maxLeft, max); + return res; + +} +*/ +void print_r_c(char *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%c\t", a[i]); + } + printf("\n"); +} + +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + printf("%s\n", longestPalindrome("caba")); + printf("%s\n", longestPalindrome("dddddddd")); + printf("%s\n", longestPalindrome("aca")); + printf("%s\n", longestPalindrome("feef")); + printf("%s\n", longestPalindrome("abcba")); + printf("%s\n", longestPalindrome("daomdukomcayjwgmmetypncdeixarhbectjcwftjjtwjrctixtrsehegwlfotpljeeqhntacfihecdjysgfmxxbjfeskvvfqdoedfxriujnoeteleftsjgdsagqvcgcdjbxgmguunhbjxyajutohgbdwqtjghdftpvidkbftqbpeahxbfyamonazvubzirhqseetaneptnpjbtrtitttxsyjckjvwtrmuwgidkofvobrwrffzrpnxbectsydbvswstfiqranjzhsebjnmprjoirqkgttahrivkcjtitdcpohwwerwgrdivqbltfnigavydxpmitttjjzyrmpaptkczzgnsovebvxezkkovgqegctxacvjfqwtiycnhartzczcgosiquhmdbljjzyrnmffcwnkyzytnsvyzayrieqyrfpxintbbiyrawxlguzaisedwabpzvevlejadztuclcpwvonehkhknicdksdcnjfaoeaqhcdkdtywilwewadcnaprcasccdcnvdgjdqirrsqwzhqqorlhbgpelpupdvuynzybcqkffnnpocidkkigimsa")); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/50.c b/archive/algorithm/leetcode/50.c new file mode 100644 index 0000000..92f8791 --- /dev/null +++ b/archive/algorithm/leetcode/50.c @@ -0,0 +1,35 @@ +double myPow(double x, int n) { + double ret = 1; + for (int i = n; i != 0; i = i / 2) { + if (i % 2 != 0) ret *= x; + x *= x; + } + return n > 0 ? ret : 1 / ret; +} +/* +double myPow(double x, int n) { + //如果n为零,表明幂数为0,直接返回1 + if(n == 0) + return 1; + //如果n为零,表明幂数为0,直接返回x + if(n == 1) + return x; + //p值相当于将幂数折半,减少重复计算 + int p=n/2; + //如果n为负数,那么将x值取其倒数,然后再将p的值乘以-1,这样就相当于 + //求x倒数的n次幂,你为正数 + if(n < 0) { + //p值改为正数 + p=-p; + //x值取其倒数 + x = 1 / x; + } + double res = myPow(x, p); + //为了提高时间复杂度,避免重复计算,可以将n不断除二来减少计算量 + //当n为32时,除二就为16,那么只需要将x^16与自身相乘即可,若n为奇数 + //那么只需要再乘以x即可 + if(n % 2 == 0) + return res * res; + return res * res * x; +} +*/ \ No newline at end of file diff --git a/archive/algorithm/leetcode/53.c b/archive/algorithm/leetcode/53.c new file mode 100644 index 0000000..e79c43d --- /dev/null +++ b/archive/algorithm/leetcode/53.c @@ -0,0 +1,45 @@ +#include +#include + +int maxSubArray(int *nums, int numsSize) { + if (numsSize <= 0) { + return 0; + } + int *result = malloc(sizeof(int) * numsSize), max; + memset(result, 0, sizeof(int) * numsSize); + result[0] = nums[0]; + max = result[0]; + for (int i = 1; i < numsSize; i++) { + result[i] = result[i - 1] + nums[i]; + if (result[i] < nums[i]) { + result[i] = nums[i]; + } + if (max < result[i]) { + max = result[i]; + } + } + free(result); + return max; +} +/* +#define MAX(a,b) a > b ? a:b + +int maxSubArray(int* nums, int numsSize) { + int* dp = malloc(sizeof(int) * numsSize); + int i; + int result; + dp[0] = nums[0]; + for(i = 1; i < numsSize; i++) + dp[i] = MAX(nums[i], dp[i-1] + nums[i]); + result = dp[0]; + for(i = 1; i < numsSize; i++) + if(result < dp[i]) + result = dp[i]; + free(dp); + return result; +} +*/ +int main() { + getchar(); + return 0; +} diff --git a/archive/algorithm/leetcode/535.c b/archive/algorithm/leetcode/535.c new file mode 100644 index 0000000..532eefc --- /dev/null +++ b/archive/algorithm/leetcode/535.c @@ -0,0 +1,39 @@ +#include +#include +#include + +char* hash[1024]; +/** Encodes a URL to a shortened URL. */ +char* encode(char* longUrl) { + char* ret = malloc(30); + int x = 0; + for (int i = 0; i < strlen(longUrl); i++) { + x += longUrl[i]; + } + x %= 1024; + hash[x] = malloc(1024); + strcpy(hash[x], longUrl); + // if(strlen(hahs[x])>=3){ + + // } + sprintf(ret, "http://tinyurl.com/%d", x); + return ret; +} + +/** Decodes a shortened URL to its original URL. */ +char* decode(char* shortUrl) { + const char* s = strrchr(shortUrl, '/'); + int x = atoi(&s[1]); + return hash[x]; +} +//直接返回原字符leetcode也是可以通过 +// Your functions will be called as such: +// char* s = encode(s); +// decode(s); + +int main() { + char* s = encode("https://leetcode.com/problems/design-tinyurl"); + s = decode(s); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/611.go b/archive/algorithm/leetcode/611.go new file mode 100644 index 0000000..904976d --- /dev/null +++ b/archive/algorithm/leetcode/611.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "sort" +) + +func triangleNumber(nums []int) int { + sort.Sort(sort.IntSlice(nums)) + ret := 0 + for i := range nums { + i2 := len(nums) - 2 + if i2 > i { + num := nums[i] + nums[i2] + for i3 := len(nums) - 1; i3 > i2; i3-- { + if num > nums[i3] { + ret += (i3 - i2) + (i2 - i - 1) + break + } + } + } + + } + return ret +} + +func main() { + fmt.Println(triangleNumber([]int{2, 3, 4, 4})) //4 + + fmt.Println(triangleNumber([]int{2, 2, 3, 4})) //3 +} diff --git a/archive/algorithm/leetcode/64.c b/archive/algorithm/leetcode/64.c new file mode 100644 index 0000000..261a4f2 --- /dev/null +++ b/archive/algorithm/leetcode/64.c @@ -0,0 +1,21 @@ +#define MIN(a, b) (a > b ? b : a) +int minPathSum(int** grid, int gridRowSize, int gridColSize) { + int** dp = malloc(sizeof(int*) * gridRowSize); + for (int i = 0; i < gridRowSize; i++) { + dp[i] = malloc(sizeof(int) * gridColSize); + } + for (int m = 0; m < gridRowSize; m++) { + for (int n = 0; n < gridColSize; n++) { + if (m == 0 && n == 0) { + dp[m][n] = grid[m][n]; + } else if (m == 0) { + dp[m][n] = dp[m][n - 1] + grid[m][n]; + } else if (n == 0) { + dp[m][n] = dp[m - 1][n] + grid[m][n]; + } else { + dp[m][n] = MIN(dp[m - 1][n], dp[m][n - 1]) + grid[m][n]; + } + } + } + return dp[gridRowSize - 1][gridColSize - 1]; +} diff --git a/archive/algorithm/leetcode/66.c b/archive/algorithm/leetcode/66.c new file mode 100644 index 0000000..66e2b6c --- /dev/null +++ b/archive/algorithm/leetcode/66.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/problems/plus-one/description/ + * +1(s) + * 不断优化,达到了0ms。。。。虽然是道简单题 + */ +int *plusOne(int *digits, int digitsSize, int *returnSize) +{ + int *ret = malloc(sizeof(int) * (digitsSize + 1)); + *returnSize = digitsSize; + int next = 1, pos; + for (int i = digitsSize; i > 0; i--) + { + ret[i] = digits[i - 1] + next; + if (ret[i] == 10) + { + ret[i] = 0; + next = 1; + } + else + { + next = 0; + } + } + if (next) + { + ret[0] = 1; + (*returnSize)++; + } + else + { + ret = &ret[1]; + } + return ret; +} + +int main() +{ + int a[] = {9, 8}, ret = 0; + int *retArray = plusOne(a, 2, &ret); + for (int i = 0; i < ret; i++) + { + printf("%d\t", retArray[i]); + } + printf("%d\n", ret); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/7.c b/archive/algorithm/leetcode/7.c new file mode 100644 index 0000000..b074b6a --- /dev/null +++ b/archive/algorithm/leetcode/7.c @@ -0,0 +1,52 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/problems/reverse-integer/description/ + * 反转整数 + */ +int reverse(int x) +{ + long long ret = 0; + while (x) + { + ret = x % 10 + ret * 10; + x /= 10; + } + if (ret <= 2147483647 && ret >= -2147483648) + { + return ret; + } + return 0; +} +/* +最快的dalao解法 +int reverse(int x) { + int y=0; + while(x) + { + int temp=y; + y=y*10+x%10; + if((y-x%10)/10!=temp) + { + return 0; + } + x/=10; + } + return y; +} +*/ +int main() +{ + int a = pow(2, 31); + printf("%d\n", reverse(1534236469)); + printf("%d\n", reverse(-321)); + printf("%d\n", reverse(-2147483648)); + printf("%d\n", reverse(32006)); + printf("%d\n", reverse(-1563847412)); + printf("%d\n", pow(2, 31)); + printf("%d\n", a); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/70.c b/archive/algorithm/leetcode/70.c new file mode 100644 index 0000000..55325fb --- /dev/null +++ b/archive/algorithm/leetcode/70.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int climbStairs(int n) +{ + int *tmp = malloc((n + 1) * sizeof(int)); + memset(tmp, sizeof(int) * (n + 1), 0); + tmp[0] = 1; + tmp[1] = 1; + for (int i = 2; i <= n; i++) + { + tmp[n] = tmp[n - 1] + tmp[n - 2]; + } + return tmp[n]; +} +int main() +{ + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/73.c b/archive/algorithm/leetcode/73.c new file mode 100644 index 0000000..944a13e --- /dev/null +++ b/archive/algorithm/leetcode/73.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include + +#define bool char +#define true 1 +#define false 0 +void setZeroes(int matrix[7][1], int matrixRowSize, int matrixColSize) +{ + bool h = false, l = false; + //扫描首行有没有0 + for (int i = 0; i < matrixColSize; i++) + { + if (matrix[0][i] == 0) + { + h = true; + break; + } + } + //扫描首列有没有0 + for (int i = 0; i < matrixRowSize; i++) + { + if (matrix[i][0] == 0) + { + l = true; + break; + } + } + //扫描0 + for (int i = 1; i < matrixRowSize; i++) + { + for (int n = 1; n < matrixColSize; n++) + { + if (matrix[i][n] == 0) + { + matrix[0][n] = 0; //首行置0 + matrix[i][0] = 0; //首列置0 + } + } + } + //开始填0,扫描首行 + for (int i = 0; i < matrixColSize; i++) + { + if (matrix[0][i] == 0) + { + for (int n = 1; i > 0 && n < matrixRowSize; n++) + { + matrix[n][i] = 0; + } + } + } + //开始填0,扫描首列 + for (int i = 0; i < matrixRowSize; i++) + { + if (matrix[i][0] == 0) + { + for (int n = 1; i > 0 && n < matrixColSize; n++) + { + matrix[i][n] = 0; + } + } + } + //对首行/列判断 + for (int i = 0; h && i < matrixColSize; i++) + { + matrix[0][i] = 0; + } + for (int i = 0; l && i < matrixRowSize; i++) + { + matrix[i][0] = 0; + } +} +/* +void solution(int** matrix, int i, int j, int *row, int*col, int r, int c);//每个元素的操作 +void setZeroes(int** matrix, int matrixRowSize, int matrixColSize) { + int r = matrixRowSize, c = matrixColSize, i, j; + int*row = (int*)malloc(sizeof(int)*r), *col = (int*)malloc(sizeof(int)*c);//标记某行、某列是否已经已经有过0,用于减枝所用空间O(m+n),不减枝则所用额外空间为常数级 + for (i = 0; i < r; i++) { + for (j = 0; j < c; j++) { + solution(matrix, i, j, row, col, r, c);// + } + } + for (i = 0; i < r; i++) + for (j = 0; j < c; j++) + matrix[i][j] = matrix[i][j] == -20 ? 0 : matrix[i][j];//更新标记值-20为0 +} +void solution(int** matrix, int i, int j, int *row, int*col, int r, int c) { + if (matrix[i][j] == 0) {//满足操作条件的元素 + if (col[j] != 20) { + col[j] = 20;//列标记 + for (int q = 0; q < r; q++) + matrix[q][j] = matrix[q][j] == 0 ? matrix[q][j] : -20;//该列上0保持不变,其余改为标记值-20 + } + if (row[i] != 20) { + row[i] = 20;//行标记 + for (int q = 0; q +#include + +#define MIN(a, b) a > b ? b : a; +int minCostClimbingStairs(int* cost, int costSize) { + int *dp = malloc(sizeof(int) * costSize), max = 0; + memset(dp, 0, sizeof(int) * costSize); + for (int i = 2; i < costSize; i++) { + dp[i] = MIN(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); + } + max = MIN(dp[costSize - 1] + cost[costSize - 1], + dp[costSize - 2] + cost[costSize - 2]); + free(dp); + return max; +} +/* +int minCostClimbingStairs(int* cost, int costSize) { + int sum[costSize]; + sum[costSize-1]=cost[costSize-1]; + sum[costSize-2]=cost[costSize-2]; + for(int i=costSize-3;i>=0;i--){ + sum[i]=(sum[i+1]>sum[i+2]?sum[i+2]:sum[i+1])+cost[i]; + } + return sum[0]>sum[1]?sum[1]:sum[0]; +} +*/ +int main() { + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/784.c b/archive/algorithm/leetcode/784.c new file mode 100644 index 0000000..42c8972 --- /dev/null +++ b/archive/algorithm/leetcode/784.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +void dfs(char** ret, int* num, char* S, int pos) { + if (pos > strlen(S)) { + ret[*num] = S; + *num += 1; + return; + } + dfs(ret, num, S, pos + 1); + if ((S[pos] >= 'a' && S[pos] <= 'z') || (S[pos] >= 'A' && S[pos] <= 'Z')) { + //是字母 + char* b = malloc(strlen(S)); + strcpy(b, S); + b[pos] ^= 32; + dfs(ret, num, b, pos + 1); + } +} + +char** letterCasePermutation(char* S, int* returnSize) { + char** ret = malloc(pow(2, strlen(S)) * sizeof(char*)); + dfs(ret, returnSize, S, 0); + return ret; +} + +int main() { + char s[] = "qwertyuiopas"; + int num = 0; + char** ret = letterCasePermutation(s, &num); + for (int i = 0; i < num; i++) { + printf("%s\n", ret[i]); + } + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/8.c b/archive/algorithm/leetcode/8.c new file mode 100644 index 0000000..a5e959a --- /dev/null +++ b/archive/algorithm/leetcode/8.c @@ -0,0 +1,108 @@ +#include +#include +#include +#include +/** + * https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/37/ + * 字符串转整数(atoi) + */ +#define INT_MIN -2147483648 +#define INT_MAX 0x7fffffff +int myAtoi(char *str) +{ + long long ret = 0; + char flag = 1, len = 0; + while (*str == ' ') //删除空 + { + str++; + } + if (*str == '-') + { + flag = -1; + str++; + } + else if (*str == '+') + { + str++; + } + else if (*str < '0' || *str > '9') + { + return 0; + } + while (*str >= '0' && *str <= '9' && len < 11) + { + ret = ret * 10 + (*str - '0'); + str++; + if (ret != 0) + { + len++; + } + } + ret *= flag; + if (ret < INT_MIN) + { + return INT_MIN; + } + if (ret > INT_MAX) + { + return INT_MAX; + } + return ret; +} +/* +int myAtoi(char* str) { + if(strlen(str)==0) + return 0; + char* xianzai= str; + long long fanhui = 0; + int flag = 1;//记录符号位正负 + long long max = pow(2,31)-1; + long long min = pow(2,31);//溢出的上下界不相同 + while (*xianzai == ' ') + { + xianzai++;//跳过空格位置 + } + if (*xianzai == '-') + { + flag = -1; + xianzai++; + } + else if(*xianzai == '+') + { + xianzai++; + } + else if (*xianzai < '0' || *xianzai > '9') + { + return 0; + } + while (*xianzai >= '0' && *xianzai <= '9') + { + fanhui= fanhui*10; + fanhui=fanhui+*xianzai-'0';//利用符号本身的ascii码直接转换成数字 + if(flag==1 && fanhui>max) + { + //正数溢出,返回INT_MAX + return max; + } + else if(flag==-1&&fanhui>min) + { + return min;//注意int类型上下界数值上相差1 + } + xianzai++; + } + return flag*fanhui; +} +*/ +int main() +{ + printf("%d\n", myAtoi("-1")); + printf("%d\n", myAtoi("456")); + printf("%d\n", myAtoi(" -42")); + printf("%d\n", myAtoi("a65r")); + printf("%d\n", myAtoi("9223372036854775808")); + printf("%d\n", myAtoi("-91283472332")); + printf("%d\n", myAtoi("4193 with words")); + printf("%ld,%ld\n", -pow(2, 31), pow(2, 31) - 1); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/876.c b/archive/algorithm/leetcode/876.c new file mode 100644 index 0000000..9b4857f --- /dev/null +++ b/archive/algorithm/leetcode/876.c @@ -0,0 +1,30 @@ +#include +#include +#include + +// 链表的中间结点 +// https://leetcode-cn.com/problems/middle-of-the-linked-list/ + +struct ListNode +{ + int val; + struct ListNode *next; +}; + +struct ListNode *middleNode(struct ListNode *head) +{ + int len = 0; + struct ListNode *p1 = head, *p2 = head->next; + while (p2 != NULL) + { + p1 = p1->next; + p2 = p2->next; + len++; + if (p2 == NULL) + { + break; + } + p2 = p2->next; + } + return p1; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/877.c b/archive/algorithm/leetcode/877.c new file mode 100644 index 0000000..fb3f266 --- /dev/null +++ b/archive/algorithm/leetcode/877.c @@ -0,0 +1,4 @@ +bool stoneGame(int* piles, int pilesSize) { + return true; +} +//只要是我先,我就必胜,我拿最多的不就好了 \ No newline at end of file diff --git a/archive/algorithm/leetcode/884.c b/archive/algorithm/leetcode/884.c new file mode 100644 index 0000000..0e94e3f --- /dev/null +++ b/archive/algorithm/leetcode/884.c @@ -0,0 +1,48 @@ +#include +#include +#include + +typedef int bool; + +#define false 0 +#define true 1 + +#define MAX_NUM 500 +char *backspace(char *s) +{ + char stack[MAX_NUM]; + int len = 0, pos = 0; + while (s[pos] != '\x0') + { + if (s[pos] == '#') + { + if (len > 0) + { + stack[len--] = '\x0'; + } + } + else + { + stack[len++] = s[pos]; + } + pos++; + } + char *ret = malloc(sizeof(char) * (len + 1)); + for (int i = 0; i < len; i++) + { + ret[i] = stack[i]; + } + ret[len] = '\x0'; + return ret; +} + +bool backspaceCompare(char *S, char *T) +{ + char *s1 = backspace(S), *s2 = backspace(T); + return strcmp(s1, s2) == 0; +} + +int main() +{ + bool a = backspaceCompare("y#f#o##f", "y#fo##f"); +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/9.c b/archive/algorithm/leetcode/9.c new file mode 100644 index 0000000..39947c2 --- /dev/null +++ b/archive/algorithm/leetcode/9.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include + +/** + * https://leetcode-cn.com/problems/palindrome-number/description/ + * 回文数 + */ +void atoi_(int x, char *s); +int isPalindrome(int x) +{ + if (x < 0) //负数直接返回false + { + return 0; + } + char s[16]={0}; + atoi_(x, s); + int len = strlen(s), n = len / 2; + for (int i = 0; i < n; i++) + { + if (s[i] != s[len - i - 1]) + { + return 0; + } + } + return 1; +} +void atoi_(int x, char *s) +{ + int i = 0; + while (x > 0) + { + s[i++] = 48 + x % 10; + x /= 10; + } +} +/* +bool isPalindrome(int x) { + int y=0; + int z=x; + int p=0; + if(z<0){ + return false; + } + while(z>0){ + p=z%10; + y=y*10+p; + z=z/10; + } + if(y==x){ + return true; + } + return false; +} +*/ +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + printf("%d", isPalindrome(12321)); + printf("%d", isPalindrome(-121)); + printf("%d", isPalindrome(1024)); + printf("%d", isPalindrome(1)); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/902.go b/archive/algorithm/leetcode/902.go new file mode 100644 index 0000000..3c87188 --- /dev/null +++ b/archive/algorithm/leetcode/902.go @@ -0,0 +1,17 @@ +package main + +import "fmt" + +func eventualSafeNodes(graph [][]int) []int { + ret := make([]int, 0) + m := make(map[int]bool) + for k, v := range graph { + + } + + return []int{} +} + +func main() { + fmt.Println(eventualSafeNodes([][]int{[]int{1, 2}, []int{2, 3}, []int{5}, []int{0}, []int{5}, {}, {}})) +} diff --git a/archive/algorithm/leetcode/92.c b/archive/algorithm/leetcode/92.c new file mode 100644 index 0000000..6e5ea94 --- /dev/null +++ b/archive/algorithm/leetcode/92.c @@ -0,0 +1,74 @@ +#include + +//https://leetcode-cn.com/problems/reverse-linked-list-ii/ +//反转链表 II + +struct ListNode +{ + int val; + struct ListNode *next; +}; + +// b->a->c->d->e +// c->b->a->d->e + +struct ListNode *reverseBetween(struct ListNode *head, int m, int n) +{ + int pos = 1; + if (head == NULL) + { + return NULL; + } + if (m == n) + { + return head; + } + struct ListNode *tmp = malloc(sizeof(struct ListNode)); + tmp->next = head; + head = tmp; + while (pos <= n) + { + if (pos >= m) + { + struct ListNode *head1 = tmp->next, *tail = tmp->next, *next = tmp->next, *tmp2 = NULL; + while (pos <= n) + { + tmp2 = next->next; + tail->next = tmp2; + next->next = head1; + head1 = next; + next = tmp2; + pos++; + } + tmp->next = head1; + break; + } + tmp = tmp->next; + pos++; + } + return head->next; +} + +int main() +{ + struct ListNode *head = malloc(sizeof(struct ListNode)), *next = malloc(sizeof(struct ListNode)); + head->val = 1; + head->next = next; + next->val = 2; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 3; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 4; + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + + next->val = 5; + next->next = NULL; + + reverseBetween(head, 2, 4); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/96.c b/archive/algorithm/leetcode/96.c new file mode 100644 index 0000000..647efd7 --- /dev/null +++ b/archive/algorithm/leetcode/96.c @@ -0,0 +1,14 @@ +int numTrees(int n) { + int *dp = malloc(sizeof(int) * (n + 1)); + dp[0] = 1; + for (int i = 1; i <= n; i++) { + for (int n = 1; n <= i; n++) { + dp[i] += (dp[n - 1] * dp[i - n]); + } + } + return dp[n]; +} +// 1 2 5 +// 2 1 +// 1 2 +// \ No newline at end of file diff --git a/archive/algorithm/leetcode/add-two-numbers.c b/archive/algorithm/leetcode/add-two-numbers.c new file mode 100644 index 0000000..378004f --- /dev/null +++ b/archive/algorithm/leetcode/add-two-numbers.c @@ -0,0 +1,111 @@ +#include +#include + +/** + * https://leetcode-cn.com/problems/add-two-numbers/description/ + * 两数相加 + */ + +struct ListNode +{ + int val; + struct ListNode *next; +}; + +struct ListNode *addTwoNumbers(struct ListNode *l1, struct ListNode *l2) +{ + struct ListNode *head = malloc(sizeof(struct ListNode)); + memset(head, 0, sizeof(struct ListNode)); + struct ListNode *next = head; + int j = 0; + if (l1->val == 0 && l1->next == NULL) + { + l1 = NULL; + } + if (l2->val == 0 && l2->next == NULL) + { + l2 = NULL; + } + do + { + int num1 = 0, num2 = 0; + if (l1 != NULL) + { + num1 = l1->val; + l1 = l1->next; + } + if (l2 != NULL) + { + num2 = l2->val; + l2 = l2->next; + } + + num1 += num2 + j; + if (num1 >= 10) + { + num1 %= 10; + j = 1; + } + else + { + j = 0; + } + next->val = num1; + if (l1 == NULL && l2 == NULL) + { + break; + } + else + { + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + memset(next, 0, sizeof(struct ListNode)); + } + } while (1); + if (j == 1) + { + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + memset(next, 0, sizeof(struct ListNode)); + next->val = j; + } + return head; +} + +struct ListNode *zh(long long num) +{ + struct ListNode *head = malloc(sizeof(struct ListNode)); + memset(head, 0, sizeof(struct ListNode)); + struct ListNode *next = head; + do + { + next->val = num % 10; + num = num / 10; + if (num > 0) + { + next->next = malloc(sizeof(struct ListNode)); + next = next->next; + memset(next, 0, sizeof(struct ListNode)); + } + else + { + break; + } + } while (1); + return head; +} +void listNumber(struct ListNode *a) +{ + do + { + printf("%d", a->val); + } while ((a = a->next) != NULL); + printf("\n"); +} + +int main() +{ + struct ListNode *a = addTwoNumbers(zh(0), zh(1)); + listNumber(a); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/go/347.go b/archive/algorithm/leetcode/go/347.go new file mode 100644 index 0000000..f39f175 --- /dev/null +++ b/archive/algorithm/leetcode/go/347.go @@ -0,0 +1,66 @@ +package main + +//数字表 +type NumberTable struct { + key int + val int +} + +//构建最小堆 +func minHeap(heap []NumberTable, k int) { + for i := k/2 - 1; i >= 0; i-- { + if heap[i].val > heap[(i+1)*2-1].val { + tmp := heap[i] + heap[i] = heap[(i+1)*2-1] + heap[(i+1)*2-1] = tmp + //0123 + //1234 + } + if k > (i+1)*2 && heap[i].val > heap[(i+1)*2].val { + tmp := heap[i] + heap[i] = heap[(i+1)*2] + heap[(i+1)*2] = tmp + } + } +} + +func topKFrequent(nums []int, k int) []int { + //hashmap计算各个数字次数 + var numMap = make(map[int]int) + for _, val := range nums { + numMap[val]++ + } + //构建优先队列 + var heap = make([]NumberTable, k) + var i = 0 + for key, val := range numMap { + if i >= k { + break + } + heap[i] = NumberTable{key, val} + i++ + numMap[key] = 0 + } + //构建一次最小堆 + minHeap(heap, k) + for key, val := range numMap { + if val == 0 { + continue + } + //后面的继续进入堆,对比第一个位置 + if heap[0].val < val { + heap[0] = NumberTable{key, val} + minHeap(heap, k) + } + } + + var ret []int + for _, val := range heap { + ret = append(ret, val.key) + } + return ret +} + +func main() { + topKFrequent([]int{5, -3, 9, 1, 7, 7, 9, 10, 2, 2, 10, 10, 3, -1, 3, 7, -9, -1, 3, 3}, 3) +} diff --git a/archive/algorithm/leetcode/go/692.go b/archive/algorithm/leetcode/go/692.go new file mode 100644 index 0000000..2dcd28a --- /dev/null +++ b/archive/algorithm/leetcode/go/692.go @@ -0,0 +1,70 @@ +package main + +//一模一样的题目 +//347 刷一下 + +//数字表 +type StringTable struct { + key string + val int +} + +//构建最小堆 +func minHeap(heap []StringTable, k int) { + for i := k/2 - 1; i >= 0; i-- { + if heap[i].val > heap[(i+1)*2-1].val { + tmp := heap[i] + heap[i] = heap[(i+1)*2-1] + heap[(i+1)*2-1] = tmp + //0123 + //1234 + } + if k > (i+1)*2 && heap[i].val > heap[(i+1)*2].val { + tmp := heap[i] + heap[i] = heap[(i+1)*2] + heap[(i+1)*2] = tmp + } + } +} + +func topKFrequent(words []string, k int) []string { + //hashmap计算各个数字次数 + var numMap = make(map[string]int) + for _, val := range words { + numMap[val]++ + } + //构建优先队列 + var heap = make([]StringTable, k) + var i = 0 + for key, val := range numMap { + if i >= k { + break + } + heap[i] = StringTable{key, val} + i++ + numMap[key] = 0 + } + //构建一次最小堆 + minHeap(heap, k) + for key, val := range numMap { + if val == 0 { + continue + } + //后面的继续进入堆,对比第一个位置 + if heap[0].val < val { + heap[0] = StringTable{key, val} + minHeap(heap, k) + } + } + //比那个多了一个排序,来次快排 + //TODO:快排 + var ret []string + for i = k - 1; i >= 0; i-- { + ret = append(ret, heap[i].key) + } + return ret +} + +func main() { + topKFrequent([]string{"the", "day", "is", "sunny", "the", "the", "the", "sunny", "is", "is"}, 4) +} diff --git a/archive/algorithm/leetcode/ms.17.14.c b/archive/algorithm/leetcode/ms.17.14.c new file mode 100644 index 0000000..767fea9 --- /dev/null +++ b/archive/algorithm/leetcode/ms.17.14.c @@ -0,0 +1,82 @@ +#include +#include + +//面试题 17.14. 最小K个数 +//https://leetcode-cn.com/problems/smallest-k-lcci/ + +void swap(int *array, int pos, int pos2) +{ + int tmp = array[pos]; + array[pos] = array[pos2]; + array[pos2] = tmp; +} + +int *topk(int *arr, int start, int end, int k, int *returnSize) +{ + int q = start, p = end + 1, mid = (end - start) / 2 + start, flag = 0; + if (arr[start] > arr[end]) + { + swap(arr, start, end); + } + if (arr[mid] > arr[end]) + { + swap(arr, mid, end); + } + if (arr[start] > arr[mid]) + { + swap(arr, mid, end); + } + flag = arr[mid]; + swap(arr, start, mid); + while (1) + { + while (arr[++q] < flag) + ; + while (arr[--p] > flag) + ; + if (q > p) + { + break; + } + swap(arr, q, p); + } + swap(arr, start, p); + if (p > k) + { + //大于k,搜索左边 + topk(arr, start, p - 1, k, returnSize); + } + else if (p < k) + { + //小于k,搜索右边 + topk(arr, p + 1, end, k, returnSize); + } + else + { + //等于k,返回 + return arr; + } + return arr; +} + +/** + * Note: The returned array must be malloced, assume caller calls free(). + */ +int *smallestK(int *arr, int arrSize, int k, int *returnSize) +{ + if (k == arrSize) + { + return arr; + } + *returnSize = k; + topk(arr, 0, arrSize - 1, k, returnSize); + + return arr; +} + +int main() +{ + int arr[] = {4, -5051, 6, 10156, 1, -39670, 2, -686, -19101, 42719, 8216, -56, -30716, -6, 0, -14, 97, -37023, 0, -28, 5094, 884, -508, 36504, 47475, 8, 37603, 2, -5021, -65, 0, 3229, 6068, 7, 5534, -577, -184, 92, 4, -797, -126, 460}; + int ret = 0; + smallestK(arr, sizeof(arr) / sizeof(int), 34, &ret); +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/template.c b/archive/algorithm/leetcode/template.c new file mode 100644 index 0000000..e59a14d --- /dev/null +++ b/archive/algorithm/leetcode/template.c @@ -0,0 +1,23 @@ +#include +#include +#include +#include + +#define bool int +#define true 1 +#define false 0 + +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/two-sum.c b/archive/algorithm/leetcode/two-sum.c new file mode 100644 index 0000000..b46d938 --- /dev/null +++ b/archive/algorithm/leetcode/two-sum.c @@ -0,0 +1,34 @@ +#include +#include + +/** + * https://leetcode-cn.com/problems/two-sum/description/ + * 两数之和 + */ +int *twoSum(int *nums, int numsSize, int target) +{ + int *s = malloc(sizeof(int) * 2); + memset(s, 0, sizeof(int) * 2); + for (int i = 0; i < numsSize; i++) + { + int tmp = target - nums[i]; + for (int n = i + 1; n < numsSize; n++) + { + if (nums[n] == tmp) + { + s[0] = i; + s[1] = n; + return s; + } + } + } + return 0; +} +int main() +{ + int nums[] = {2, 7, 11, 15}; + int *s = twoSum(nums, sizeof(nums) / 4, 9); + printf("%d,%d\n", s[0], s[1]); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/leetcode/vhw.c b/archive/algorithm/leetcode/vhw.c new file mode 100644 index 0000000..a093ea2 --- /dev/null +++ b/archive/algorithm/leetcode/vhw.c @@ -0,0 +1,144 @@ +#include +#include +#include +#include +/** + * 验证回文字符串 + * https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/5/strings/36/ + */ +#define bool int +#define true 1 +#define false 0 +bool isPalindrome(char *s) +{ + int len = strlen(s); + if (len < 1) + { + return true; + } + for (int start = 0, end = len - 1; start < end; start++, end--) + { + while (start < end) //遇到我们要判断数字字母的停止 + { + if ((s[start] >= 48 && s[start] <= 57) || + (s[start] >= 97 && s[start] <= 122)) + { + } + else if (s[start] >= 65 && s[start] <= 90) + { + s[start] |= 32; //转换为小写 + } + else + { + start++; + continue; + } + break; + } + while (start < end) //结束的同上 + { + if ((s[end] >= 48 && s[end] <= 57) || + (s[end] >= 97 && s[end] <= 122)) + { + } + else if (s[end] >= 65 && s[end] <= 90) + { + s[end] |= 32; //转换为小写 + } + else + { + end--; + continue; + } + break; + } + if (start >= end) + { + break; + } + if (s[start] != s[end]) + { + return false; + } + } + return true; +} +/* +int is_char(char c) +{ + return ( (c>='a' && c<='z') || (c>='A' && c<='Z') ); +} + +int is_num(char c) +{ + return (c>='0'&&c<='9'); +} + +int is_equal(char c1,char c2){ + if(is_num(c1)) + return c1 == c2; + else//c1 is charactrer + { + if(is_num(c2)) + return 0; + + c1 = c1 > 96 ? c1-32:c1; + c2 = c2 > 96 ? c2-32:c2; + + return c1 == c2; + } + +} + +int isPalindrome(char* s) { + int len; + if(s == NULL || (len = strlen(s)) == 0) + return 1; + + char *p = s; + char *q = s + len-1; + + while(p < q) + { + if((!is_num(*p)) && (!is_char(*p))) + { + p = p + 1; + continue; + } + + if((!is_num(*q)) && (!is_char(*q))) + { + q = q - 1; + continue; + } + + if(is_equal(*p,*q) == 0) + return 0; + + p = p + 1; + q = q - 1; + } + return 1; +} +*/ +void print_r(int *a, int len) +{ + for (int i = 0; i < len; i++) + { + printf("%d\t", a[i]); + } + printf("\n"); +} + +int main() +{ + char a[] = "A man, a plan, a canal: Panama"; + printf("%d\n", isPalindrome("qwewq")); + printf("%d\n", isPalindrome(a)); + printf("%d\n", isPalindrome("race a car")); + char b[] = "A man\r\na plan\r\na canal: Panama"; + printf("%d\n", isPalindrome(b)); + printf("%d\n", isPalindrome(".,")); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/problem/calculator.c b/archive/algorithm/problem/calculator.c new file mode 100644 index 0000000..5e2bf4f --- /dev/null +++ b/archive/algorithm/problem/calculator.c @@ -0,0 +1,188 @@ +#include +#include +#include +#include +#define MAIN_FUNC +#include "../struct/stack.c" +/** + * 用栈实现计算器 + * 先将中缀表达式转换成后缀表达式 + */ + +/** + * 字符串转int + */ +int str2int(const char *str, int len) +{ + int result = 0; + for (int i = 0; i < len; i++) + { + double t = pow(10, i); + result += (str[len - i - 1] - 48) * t; + } + return result; +} +/** + * 数字转换运算符,有内存泄漏问题,emmm不管了,反正我只管跑 + */ +const char *get_symbol(int symbol) +{ + char *ret = malloc(2); + memset(ret, 0, 2); + switch (symbol) + { + case 0: + { + ret[0] = '+'; + break; + } + case 2: + { + ret[0] = '*'; + break; + } + } + return ret; +} +/** + * 生成后缀表达式 + */ +void suffix_expression(const char *exp, char *sufExp) +{ + prt_stack pSal = create_stack(-1); + int last = 0; + for (int i = 0; i < strlen(exp) + 1; i++) + { + if (exp[i] < '0' || exp[i] > '9') //提取数字 + { + memcpy(&sufExp[strlen(sufExp)], &exp[last], i - last); + sufExp = strcat(sufExp, "|"); //|用作分割 + last = i + 1; + int symbol = 0; //123*+45*6+7*+ + if (exp[i] != 0) + { + switch (exp[i]) + { + case '+': + { + symbol = 0; + break; + } + case '*': + { + symbol = 2; + break; + } + case '(': + { + symbol = 5; + break; + } + case ')': + { + symbol = 6; + break; + } + } + push(symbol, &pSal); + } + int lastSymbol = 0; + while (lastSymbol >= 0) + { + symbol = pop(&pSal); //本次运算符 + lastSymbol = pop(&pSal); //上一次运算符 + if (symbol == 6) //遇到)时,弹出栈元素,直到遇到( + { + if (lastSymbol != 5) + { + sufExp = strcat(sufExp, get_symbol(lastSymbol)); + push(symbol, &pSal); + } + } + else if (symbol > lastSymbol || lastSymbol == 5) //上一个为(不弹出 + { + push(lastSymbol, &pSal); + push(symbol, &pSal); + break; + } + else + { + sufExp = strcat(sufExp, get_symbol(lastSymbol)); + push(symbol, &pSal); + } + } + } + } + + int lastSymbol = 0; + while ((lastSymbol = pop(&pSal)) >= 0) //将剩下的全部弹出 + { + sufExp = strcat(sufExp, get_symbol(lastSymbol)); + } +} +/** + * 计算后缀表达式 + */ +int calculate(char *exp) +{ + //先将字符处理入栈 + prt_stack pSal = create_stack(-1); + int len = strlen(exp); + for (int i = 0; i < len; i++) //先处理分割符号|,替换成0x00 + { + if (exp[i] == '|') + { + exp[i] = 0; + } + } + int last = 0; + for (int i = 0; i < len + 1; i++) + { + if (exp[i] == 0 || (exp[i] < '0' || exp[i] > '9')) //提取数字(符号) + { + int result = -1; + switch (exp[i]) + { + case '+': + { + result = pop(&pSal) + pop(&pSal); + break; + } + case '*': + { + result = pop(&pSal) * pop(&pSal); + break; + } + default: + { + if (i != last) + { + push(str2int(&exp[last], i - last), &pSal); + } + } + } + if (result != -1) + { + push(result, &pSal); + } + // memcpy(&sufExp[strlen(sufExp)], &exp[last], i - last); + // sufExp = strcat(sufExp, "|"); //|用作分割 + last = i + 1; + // int symbol = 0; //123*+45*6+7*+ + } + } + return pop(&pSal); +} +int main() +{ + char exp[128] = {0}, *sufExp = malloc(128); + memset(sufExp, 0, 128); + printf("请输入前缀表达式:\n"); + scanf("%s", exp); + suffix_expression(exp, sufExp); + printf("后缀表达式为:%s\n", sufExp); + int result = calculate(sufExp); + printf("计算结果为:%d\n", result); + system("pause"); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/problem/n!.c b/archive/algorithm/problem/n!.c new file mode 100644 index 0000000..5d427d0 --- /dev/null +++ b/archive/algorithm/problem/n!.c @@ -0,0 +1,63 @@ +#include +// 使用栈的方式计算阶乘 +struct stack +{ + int val[100]; + int pos; +} s; + +void push(int i) +{ + s.val[s.pos++] = i; +} + +int pop() +{ + if (s.pos == 0) + { + return 0; + } + return s.val[--s.pos]; +} + +int fac2(int n) +{ + int result = 1; + for (int i = n; i > 0; i--) + { + result *= i; + } + return result; +} + +int fac1(int n) +{ + if (n == 1) + return 1; + else + return n * fac1(n - 1); +} + +//这算么? +int fac3(int n) +{ + do + { + push(n); + } while (--n); + + int i = 0, result = 1; + while (i = pop()) + { + result *= i; + } + return result; +} + +int main() +{ + printf("%d\n", fac1(10)); + printf("%d\n", fac2(10)); + printf("%d", fac3(10)); + getchar(); +} \ No newline at end of file diff --git a/archive/algorithm/struct/adt/hash.c b/archive/algorithm/struct/adt/hash.c new file mode 100644 index 0000000..7808743 --- /dev/null +++ b/archive/algorithm/struct/adt/hash.c @@ -0,0 +1,103 @@ +#include +#include +#include +#include + +#define TABLE_SIZE 41 +#define MAX_FIND 4 + +//利用平方探测法创建散列 +typedef struct _hash *HASH_TABLE; + +struct _hash +{ + char *key; + int value; +}; + +HASH_TABLE hash_create() +{ + //创建一个大小为size的表 + //也就是申请size大小的内存空间 + HASH_TABLE ret = (HASH_TABLE)malloc(TABLE_SIZE * sizeof(struct _hash)); + memset(ret, 0, sizeof(struct _hash) * TABLE_SIZE); + return ret; +} + +int hash(const char *key) +{ + //散列函数,P113 + unsigned int hash_value = 0; + while (*key != '\0') + { + hash_value = (hash_value << 5) + *key++; + } + return hash_value % TABLE_SIZE; +} + +int hash_insert(HASH_TABLE hash_table, const char *key, int value) +{ + //插入一个值到hash表中 + //先计算hash值 + int sub = hash(key); + //判断是否有碰撞 + if ((int)hash_table[sub].key != 0) + { + //值不是空的,利用平方的方法,探测空的地方 + int tmp_sub = 0; + for (int i = 0; i < MAX_FIND; i++) + { + tmp_sub = sub + i * i; + if (tmp_sub >= TABLE_SIZE) + { + tmp_sub -= TABLE_SIZE; + } + if ((int)hash_table[tmp_sub].key == 0 || strcmp(hash_table[tmp_sub].key, key) == 0) + { + //找到了空的位置,赋值,跳出循环 + break; + } + //如果继续碰撞,继续往后计算 + } + if (hash_table[tmp_sub].value != value) + { + //没有找到空位,返回-1,提示失败 + return -1; + } + sub = tmp_sub; + } + hash_table[sub].key = (char *)malloc(strlen(key)+1); + memset(hash_table[sub].key,0,strlen(key)+1); + memcpy(hash_table[sub].key, key, strlen(key)); + hash_table[sub].value = value; + return sub; +} + +int hash_find(HASH_TABLE hash_table, const char *key, int value) +{ +} + +#ifndef MAIN_FUNC +int main() +{ + HASH_TABLE hash_table = hash_create(); + hash_insert(hash_table, "one", 1); + hash_insert(hash_table, "t", 2); + hash_insert(hash_table, "e", 3); + hash_insert(hash_table, "q", 4); + hash_insert(hash_table, "while", 5); + hash_insert(hash_table, "z", 6); + hash_insert(hash_table, "f", 7); + //遍历表 + for (int i = 0; i < TABLE_SIZE; i++) + { + if ((int)hash_table[i].key == 0) + { + continue; + } + printf("%s=>%d\n", hash_table[i].key, hash_table[i].value); + } + + return 0; +} +#endif diff --git a/archive/algorithm/struct/adt/queue.c b/archive/algorithm/struct/adt/queue.c new file mode 100644 index 0000000..b4e2c9a --- /dev/null +++ b/archive/algorithm/struct/adt/queue.c @@ -0,0 +1,97 @@ +#include +#include +#include +/** + * 数据结构,队列 感觉和栈差不多吧,一个先进后出,一个先进先出 + * 用双向链表的速度将快一些,本例采用双向链表,就不需要再检索倒数第二个节点,记录最后一个节点即可 + */ +struct queue; +typedef struct queue *prt_queue; +//3->2->1->3 +struct queue +{ + int data; + prt_queue last; //上一个 + prt_queue next; //下一个 +}; + +//3<=>2<=>1 +//3<=>2 +//3 +/** + * 出队列 + */ +int pop(prt_queue *end) +{ + if (*end == NULL) + { + return 0; + } + int ret_data = (*end)->data; + prt_queue *tmp = end; + *end = (*end)->last; + if ((*end) != NULL) + { + (*end)->next = NULL; + } + free(tmp); + return ret_data; +} +//1 +//2<=>1 +//3<=>2<=>1 +/** + * 进入队列 + */ +prt_queue push(int data, prt_queue *h) +{ + prt_queue tmp_node = malloc(sizeof(struct queue)); + (*h)->last = tmp_node; + memset(tmp_node, 0, sizeof(struct queue)); + tmp_node->data = data; + tmp_node->next = *h; + *h = tmp_node; + return tmp_node; +} +/** + * 创建栈 + */ +prt_queue create_queue(int data) +{ + prt_queue header = malloc(sizeof(struct queue)); + memset(header, 0, sizeof(struct queue)); + header->data = data; + return header; +} + +void print_queue(prt_queue *end) +{ + int data = 0; + while ((data = pop(end)) != 0) + { + printf("%d\t", data); + } +} +#ifndef MAIN_FUNC +int main() +{ + prt_queue queue = create_queue(1); + prt_queue end_node = queue; + push(23, &queue); + push(15, &queue); + push(123, &queue); + push(36, &queue); + push(89, &queue); + push(16, &queue); + push(324, &queue); + push(526, &queue); + push(166, &queue); + push(984, &queue); + push(85, &queue); + pop(&end_node); + pop(&end_node); + print_queue(&end_node); + getchar(); + return 0; +} +#endif \ No newline at end of file diff --git a/archive/algorithm/struct/adt/stack.c b/archive/algorithm/struct/adt/stack.c new file mode 100644 index 0000000..498171c --- /dev/null +++ b/archive/algorithm/struct/adt/stack.c @@ -0,0 +1,86 @@ +#include +#include +#include +/** + * 数据结构,栈 + */ +struct stack; +typedef struct stack *prt_stack; + +struct stack +{ + int data; + prt_stack last; +}; + +//1<-2 header=2 header->last=1 +//1 header=1 header->last=null +/** + * 出栈 + */ +int pop(prt_stack *h) +{ + if (*h == NULL) + { + return 0; + } + int ret_data = (*h)->data; + prt_stack *tmp = h; + *h = (*h)->last; + free(tmp); + return ret_data; +} +//1 header=1 header->last=null +//1<-2 header=2 header->last=1 +/** + * 入栈 + */ +prt_stack push(int data, prt_stack *h) +{ + prt_stack tmp_node = malloc(sizeof(struct stack)); + memset(tmp_node, 0, sizeof(struct stack)); + tmp_node->data = data; + tmp_node->last = *h; + *h = tmp_node; + return tmp_node; +} +/** + * 创建栈 + */ +prt_stack create_stack(int data) +{ + prt_stack header = malloc(sizeof(struct stack)); + memset(header, 0, sizeof(struct stack)); + header->data = data; + return header; +} + +void print_stack(prt_stack *h) +{ + int data = 0; + while ((data = pop(h)) != 0) + { + printf("%d\t", data); + } +} +#ifndef MAIN_FUNC +int main() +{ + prt_stack stack = create_stack(1); + push(23, &stack); + push(15, &stack); + push(123, &stack); + push(36, &stack); + push(89, &stack); + push(16, &stack); + push(324, &stack); + push(526, &stack); + push(166, &stack); + push(984, &stack); + push(85, &stack); + pop(&stack); + print_stack(&stack); + getchar(); + return 0; +} +#endif \ No newline at end of file diff --git a/archive/algorithm/struct/adt/u_link_list.c b/archive/algorithm/struct/adt/u_link_list.c new file mode 100644 index 0000000..5edf37d --- /dev/null +++ b/archive/algorithm/struct/adt/u_link_list.c @@ -0,0 +1,109 @@ +#include +#include +#include +/** + * 单向链表 增,删,查,改 + */ +struct node; +typedef struct node *prt_node; + +prt_node insert(int, int, prt_node); +prt_node find_node(int, prt_node); +void print_list(prt_node); +prt_node after_node(prt_node); +void del(int, prt_node); +void modify(int, int, prt_node); + +struct node +{ + int data; + prt_node next; +}; +/** + * 在n位置后面插入一个数据,n为-1时插入到最后 + */ +prt_node insert(int n, int data, prt_node h) +{ + prt_node tmp_node; + prt_node last_node = n == -1 ? after_node(h) : find_node(n, h); //取得前一个节点 + tmp_node = last_node->next; + last_node->next = malloc(sizeof(struct node)); + last_node->next->next = tmp_node; + last_node->next->data = data; + tmp_node = last_node->next; + return tmp_node; //返回插入的节点 +} +/** + * 寻找前一个节点,n为-1时查找最后节点 + */ +prt_node find_node(int n, prt_node h) +{ + prt_node ret = h; + for (int i = 0; i < n; i++) + { + if (ret->next == NULL) + { + break; + } + ret = ret->next; + } + return ret; +} +/** + * 最后一个 + */ +prt_node after_node(prt_node h) +{ + while (h->next != NULL) + h = h->next; + return h; +} +/** + * 删除数据 + */ +void del(int n, prt_node h) +{ + h = find_node(n, h); + prt_node tmp_node = h->next; + h->next = tmp_node->next; + free(tmp_node); +} +/** + * 修改数据 + */ +void modify(int n, int data, prt_node h) +{ + prt_node tmp_node = find_node(n, h)->next; + tmp_node->data = data; +} +/** + * 输出链表 + */ +void print_list(prt_node h) +{ + while ((h = h->next) != NULL) + { + printf("%d\t", h->data); + } + printf("\n"); +} + +int main() +{ + prt_node header = memset(malloc(sizeof(struct node)), 0, sizeof(struct node)); + //添加 + insert(-1, 153, header); + insert(-1, 2343, header); + insert(-1, 323, header); + insert(-1, 564, header); + //删除 + del(2, header); + //插入 + insert(2, 23333, header); + insert(4, 312, header); + //修改 + modify(0, 888, header); + print_list(header); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/struct/adt/u_link_list.h b/archive/algorithm/struct/adt/u_link_list.h new file mode 100644 index 0000000..c9c7b4d --- /dev/null +++ b/archive/algorithm/struct/adt/u_link_list.h @@ -0,0 +1,94 @@ +#include +#include +#include + +/** + * 单向链表头文件 + */ + +/** + * 单向链表 增,删,查,改 + */ +struct node; +typedef struct node *prt_node; + +prt_node insert(int, int, prt_node); +prt_node find_node(int, prt_node); +void print_list(prt_node); +prt_node after_node(prt_node); +void del(int, prt_node); +void modify(int, int, prt_node); + +struct node +{ + int data; + prt_node next; +}; +/** + * 在n位置后面插入一个数据,n为-1时插入到最后 + */ +prt_node insert(int n, int data, prt_node h) +{ + prt_node tmp_node; + prt_node last_node = n == -1 ? after_node(h) : find_node(n, h); //取得前一个节点 + tmp_node = last_node->next; + last_node->next = (prt_node)malloc(sizeof(struct node)); + last_node->next->next = tmp_node; + last_node->next->data = data; + tmp_node = last_node->next; + return tmp_node; //返回插入的节点 +} +/** + * 寻找前一个节点,n为-1时查找最后节点 + */ +prt_node find_node(int n, prt_node h) +{ + prt_node ret = h; + for (int i = 0; i < n; i++) + { + if (ret->next == NULL) + { + break; + } + ret = ret->next; + } + return ret; +} +/** + * 最后一个 + */ +prt_node after_node(prt_node h) +{ + while (h->next != NULL) + h = h->next; + return h; +} +/** + * 删除数据 + */ +void del(int n, prt_node h) +{ + h = find_node(n, h); + prt_node tmp_node = h->next; + h->next = tmp_node->next; + free(tmp_node); +} +/** + * 修改数据 + */ +void modify(int n, int data, prt_node h) +{ + prt_node tmp_node = find_node(n, h)->next; + tmp_node->data = data; +} +/** + * 输出链表 + */ +void print_list(prt_node h) +{ + while ((h = h->next) != NULL) + { + printf("%d\t", h->data); + } + printf("\n"); +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/avlTree.c b/archive/algorithm/struct/tree/avlTree.c new file mode 100644 index 0000000..1b9c456 --- /dev/null +++ b/archive/algorithm/struct/tree/avlTree.c @@ -0,0 +1,149 @@ +#include +#include +#include +/** + * AVL树 + */ +struct tree; +typedef struct tree *prt_tree; +#define bool int +#define false 0 +#define true 1 +#ifndef max +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +struct tree +{ + int data; //数据 + int height; //树深度 + prt_tree lt; //左节点 + prt_tree rt; //右节点 +}; + +/** + * 创建一个节点 + */ +prt_tree create_tree(int data) +{ + prt_tree tmp = malloc(sizeof(struct tree)); + memset(tmp, 0, sizeof(struct tree)); + tmp->data = data; + return tmp; +} +int height(prt_tree tree) +{ + if (tree != NULL) + { + return tree->height; + } + return 0; +} +/** + * 右单旋 + */ +prt_tree rightSingleRotation(prt_tree root) +{ + //1->2->3 交换1 2,也就是1 2 旋转 + prt_tree tmp = root->rt; //root=1 tmp=2 + root->rt = tmp->lt; //root->rt=tmp->lt 吧2的右节点接到1的左节点 + tmp->lt = root; //1的左节点为2节点 + // tmp->lt= + root->height = (height(root->lt) > height(root->rt) ? height(root->lt) : height(root->rt)) + 1; + tmp->height = (height(tmp->lt) > height(tmp->rt) ? height(tmp->lt) : height(tmp->rt)) + 1; + return tmp; +} +/** + * 左单旋 + */ +prt_tree leftSingleRotation(prt_tree root) +{ + //1->2->3 交换1 2,也就是1 2 旋转 + prt_tree tmp = root->lt; //root=1 tmp=2 + root->lt = tmp->rt; //root->lt=tmp->rt 吧2的右节点接到1的左节点 + tmp->rt = root; //1的左节点为2节点 + // tmp->rt= + root->height = (height(root->rt) > height(root->lt) ? height(root->rt) : height(root->lt)) + 1; + tmp->height = (height(tmp->rt) > height(tmp->lt) ? height(tmp->rt) : height(tmp->lt)) + 1; + return tmp; +} +/** + * 左双旋 + */ +prt_tree leftDoubleRotation(prt_tree root) +{ + root->lt = rightSingleRotation(root->lt); + return leftSingleRotation(root); +} +/** + * 右双旋 + */ +prt_tree rightDoubleRotation(prt_tree root) +{ + root->rt = leftSingleRotation(root->rt); + return rightSingleRotation(root); +} + +/** + * 插入树 + */ +prt_tree insert(int data, prt_tree root) +{ + if (root == NULL) //如果节点为空,则认为将插入到该点 + { + root = create_tree(data); + } + else if (root->data > data) // 判断往哪个方向节点插入,数据比当前小,往左 + { + root->lt = insert(data, root->lt); + if (height(root->lt) - height(root->rt) == 2) //重新平衡 + { + if (data < root->lt->data) + { + root = leftSingleRotation(root); + } + else + { + root = leftDoubleRotation(root); + } + } + } + else if (root->data < data) //数据比当前大,往右 + { + root->rt = insert(data, root->rt); + if (height(root->rt) - height(root->lt) == 2) //重新平衡 + { + if (data > root->rt->data) + { + root = rightSingleRotation(root); + } + else + { + root = rightDoubleRotation(root); + } + } + } + root->height = max(height(root->lt), height(root->rt)) + 1; + return root; +} +void print_tree(prt_tree root) //中序输出就是排序啦 +{ + if (root == NULL) + { + return; + } + print_tree(root->lt); + printf("%d\t", root->data); + print_tree(root->rt); +} +int main() +{ + prt_tree root = insert(201, NULL); + for (int i = 0; i < 20; i++) + { + root = insert(rand(), root); + } + print_tree(root); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/b-tree.c b/archive/algorithm/struct/tree/b-tree.c new file mode 100644 index 0000000..4412253 --- /dev/null +++ b/archive/algorithm/struct/tree/b-tree.c @@ -0,0 +1,186 @@ +#include +#include +#include +#include +#define M 3 + +typedef struct tree *prt_tree; + +struct tree +{ + int data; //存储的数据 + prt_tree left; //左子节点 + prt_tree right; //右子节点 + prt_tree brother; //兄弟节点 +}; +prt_tree create_node(int data) +{ + prt_tree tree = malloc(sizeof(struct tree)); + memset(tree, 0, sizeof(struct tree)); + tree->data = data; + return tree; +} + +prt_tree insert(int data, prt_tree root, prt_tree father) +{ + if (root == NULL) + { + root = create_node(data); + return root; + } + //在兄弟节点进行搜索,直到data夹在两个兄弟节点之中,或者相等,或者为空 + //如果相等不进行处理,直接返回 + //如果比最小的还小,插入节点后,与第一个交换返回 + //如果是夹在兄弟中,就进入第一个的右,或者第二个左节点 + //如果等于NULL的话,证明这是叶子节点,就直接在中间插入,否则进行插入操作,回到第一行 + //如果是空就插入在最后一个兄弟节点 + //插入之后继续进行循环,得到n来判断这个节点数量有没有大于m + prt_tree tmp = root; + int n = 0; + while (tmp != NULL) + { + n += 1; + if (data == tmp->data) + { + //相等的情况 + break; + } + else if (data < tmp->data) + { + //比最小还小的情况(也就是最小),往左边插入,先判断left节点是不是NULL + //为NULL则认为是叶子节点,数量+1,然后跳出循环,新节点变为老节点 + //否则递归调用insert,往left节点继续搜索 + if (tmp->left == NULL) + { + prt_tree new_tree = create_node(data); + new_tree->brother = tmp; + n += 1; + root = new_tree; + break; + } + else + { + //往左节点继续搜索 + insert(data, tmp->left, tmp); + } + } + else if (tmp->brother == NULL) + { + //等于空的情况(也就是最大的情况),往右插入,先判断right节点是不是NULL + //为NULL则认为是叶子节点,新节点加入兄弟节点后,tmp指向兄弟节点,跳出循环 + //否则递归调用insert,往right节点继续搜索 + if (tmp->right == NULL) + { + prt_tree new_tree = create_node(data); + tmp->brother = new_tree; + tmp = tmp->brother; + break; + } + else + { + insert(data, tmp->right, tmp); + } + } + else if (data > tmp->data && data < tmp->brother->data) + { + //夹在中间的情况,如果right为空的就认为是叶子节点,插入在中间 + if (tmp->right == NULL) + { + //插入在中间,新建立一个新的节点,然后将节点插入到中间 + prt_tree new_tree = create_node(data); + prt_tree tmpPrtTree = tmp->brother; + tmp->brother = new_tree; + new_tree->brother = tmpPrtTree; + tmp = tmp->brother; + break; + } + else + { + //往父的right插入 + insert(data, tmp->right, tmp); + } + } + tmp = tmp->brother; + } + //接着tmp继续循环,遍历这个节点有没有超过m + while (tmp != NULL) + { + tmp = tmp->brother; + n += 1; + } + //判断是否超过M + if (n > M) + { + //超过m,取出中间的前一个节点 + prt_tree mid_before_tree = root; + prt_tree mid_tree = NULL; + int sub = ceil(M / 2); + for (int i = 0; i < sub; i++) + { + mid_before_tree = mid_before_tree->brother; + } + mid_tree = mid_before_tree->brother; + //取出中间的后,判断父节点,是不是等于当前,如果是等于当前root节点 + //将这一整个块从mid_tree分开,中间节点提取到上一节点 + mid_before_tree->brother = NULL; + mid_tree->left = root; + mid_tree->right = mid_tree->brother; + mid_tree->brother = NULL; + //则认为这是在操作根节点,操作的是根节点的话 + //就要将现在的这个节点变为根节点 + if (root == father) + { + root = mid_tree; + } + else + { + //然后判断比父节点大还是小 + //比父大就是直接插入到父的兄弟节点 + //然后父的兄弟的left为空 + //比父小就进行交换,插入 + //父right为空 + if (father->data > data) + { + prt_tree tmp_node = father->brother; + father->brother = mid_tree; + mid_tree->brother = tmp_node; + } + else + { + //连接兄弟节点 + mid_tree->brother = father->brother; + father->brother = mid_tree; + } + } + } + printf("data:%d\tn:%d\n", data, n); + return root; +} + +//排序输出 +void print_tree(prt_tree root) +{ + if (root == NULL) + return; + print_tree(root->left); + printf("%d\t", root->data); + print_tree(root->brother); + if (root->brother == NULL) + { + print_tree(root->right); + } +} + +int main() +{ + prt_tree root = NULL; + root = insert(1, root, root); + root = insert(6, root, root); + root = insert(8, root, root); + root = insert(11, root, root); + root = insert(15, root, root); + root = insert(16, root, root); + root = insert(18, root, root); + print_tree(root); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/binary_tree.c b/archive/algorithm/struct/tree/binary_tree.c new file mode 100644 index 0000000..0091e83 --- /dev/null +++ b/archive/algorithm/struct/tree/binary_tree.c @@ -0,0 +1,139 @@ +#include +#include +#include + +typedef struct tree tree; + +struct tree { + tree* left; + tree* right; + int val; +}; + +tree* new_tree() { + tree* t = malloc(sizeof(tree)); + memset(t, 0, sizeof(tree)); + return t; +} + +int add_tree(tree* root) { + int val = 0; + printf("value:"); + scanf("%d", &val); + root->val = val; + int flag = 0; + while (1) { + printf("left(1) or right(2) or upper(3) or quit(any):"); + scanf("%d", &flag); + if (flag == 1) { + if (root->left == NULL) { + root->left = new_tree(); + } + if (!add_tree(root->left)) break; + } else if (flag == 2) { + if (root->right == NULL) { + root->right = new_tree(); + } + if (!add_tree(root->right)) break; + } else if (flag == 3) { + return 1; + } else { + break; + } + } + return 0; +} + +//前;中;后序遍历 dfs +void print_tree_before(tree* root) { + if (root == NULL) { + return; + } + printf("%d\t", root->val); + print_tree_before(root->left); + print_tree_before(root->right); +} + +void print_tree_stack(tree* root) { + //使用栈来实现前序(不是递归) + tree* stack[100] = {NULL}; + int start = 0, end = 0; + stack[0] = root; + while (end >= 0) { + //弹出栈顶 + int top = end--; + tree * tmp=stack[top]; + printf("%d\t", tmp->val); + //右入 + if (tmp->right != NULL) { + stack[++end] = tmp->right; + } + //左入 + if (tmp->left != NULL) { + stack[++end] = tmp->left; + } + } +} + +void print_tree_mid(tree* root) { + if (root == NULL) { + return; + } + print_tree_mid(root->left); + printf("%d\t", root->val); + print_tree_mid(root->right); +} + +void print_tree_after(tree* root) { + if (root == NULL) { + return; + } + print_tree_after(root->left); + print_tree_after(root->right); + printf("%d\t", root->val); +} + +//层次遍历 bfs +void print_tree_cengci(tree* root) { + tree* queue[100] = {NULL}; + int pos = 0; //队首 + int end = 0; //队尾 + queue[0] = root; + while (queue[pos] != NULL) { + if (queue[pos]->left != NULL) { + //入队 + queue[++end] = queue[pos]->left; + } + if (queue[pos] != NULL) { + queue[++end] = queue[pos]->right; + } + //输出(出队) + printf("%d\t", queue[pos++]->val); + } +} + +int main() { + tree* root = new_tree(); + root->left = new_tree(); + root->right = new_tree(); + root->left->left = new_tree(); + root->left->right = new_tree(); + root->left->left->val = 4; + root->left->right->val = 5; + root->val = 1; + root->left->val = 2; + root->right->val = 3; + // add_tree(root); + print_tree_before(root); + printf("\n"); + print_tree_mid(root); + printf("\n"); + print_tree_after(root); + printf("\n"); + print_tree_cengci(root); + printf("\n"); + print_tree_stack(root); + printf("\n"); + system("pause"); + return 0; +} diff --git a/archive/algorithm/struct/tree/b树.md b/archive/algorithm/struct/tree/b树.md new file mode 100644 index 0000000..bfcb6d7 --- /dev/null +++ b/archive/algorithm/struct/tree/b树.md @@ -0,0 +1,65 @@ +## B树 + +感觉B树是有点从下往上伸展的感觉,而不是像val树伸展树那些插入一个数据后旋转达到平衡,所以**所有的树叶都在相同的深度上** + +* 树中每个结点最多含有m个孩子 +* 除根结点和叶子结点外,其它每个结点至少有[ceil(m / 2)]个孩子 **(就是其他节点至少有 ceil(m/2) 个子节点咯)** +* 若根结点不是叶子结点,则至少有2个孩子 +* 所有叶子结点都出现在同一层 **(也就是高度相同吧)** + + +《数据结构与算法分析》上描述的b树(p97)所有数据都在树叶上,但是又没指向下一根的树叶,所以又不是b+树...应该是是另外一种形式吧....所以我还是按照往上那些比较详细的教程来理解吧 + +插入 1 2 3 4 5 6 7 8 9 10到一个3阶的b树下 + +插入1 +```graphviz +digraph{ + node[shape=record width=0.2 height=0.2] + 1[label="|1|"] +} +``` +```graphviz +digraph{ + rankdir=LR + node[shape=record width=0.2 height=0.2] + 1[label="{|1|}"] + 2[label="{|2|}"] + 1->2 +} +``` +```graphviz +digraph{ + rankdir=LR + node[shape=record width=0.2 height=0.2] + 1[label="{|1|}"] + 2[label="{|2|}"] + 3[label="{|3|}"] + 1->2->3 +} +``` +当插入第四个的时候就需要进行处理了,因为我们设置的是三阶的B树 +```graphviz +digraph{ + rankdir=LR + node[shape=record width=.2 height=.1] + 1[label="{|1|}"] + 2[label="{|2|}"] + 3[label="{|3|}"] + 4[label="{|4|}" style="dashed"] + 1->2->3->4 +} +``` +需要将中间的一个移动到上方,拆分成两个子节点(vscode绘图插件貌似语法不是很支持,直接换图了....而且确实是有些毛病) + +![](img/graph1.png) + +![](img/graph2.png) + +然后插入5,6,7,8,9什么的直接略过吧,来看看当上一行也满了怎么办 + +这差不多是一个饱和的状态了,再插入一个10就会,往上增加一个,但是上一行也满了,操作也一样 + +![](img/graph3.png) + + diff --git a/archive/algorithm/struct/tree/huffman.c b/archive/algorithm/struct/tree/huffman.c new file mode 100644 index 0000000..93c003b --- /dev/null +++ b/archive/algorithm/struct/tree/huffman.c @@ -0,0 +1,34 @@ +#include +#include +#include + +typedef struct hfm *HaffmanTree; + +struct hfm +{ + HaffmanTree node; + int val; + int priority; +}; + +int hashQ[26]; //权 +HaffmanTree tree; +//构建列表 +HaffmanTree buildList(char *str) +{ + //先计算权 + for (int i = 0; i < strlen(str); i++) + { + hashQ[str[i] - 'a']++; + } + return NULL; +} + +int main() +{ + tree = malloc(hfm) char str[] = "athisteststring"; + + buildList(str); + + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/img/graph1.gv b/archive/algorithm/struct/tree/img/graph1.gv new file mode 100644 index 0000000..b3c9acf --- /dev/null +++ b/archive/algorithm/struct/tree/img/graph1.gv @@ -0,0 +1,11 @@ +digraph{ + node[shape=record width=.2 height=.1] + 1[label="|1|"] + 2[label="|2|"] + node3[label="|3|"] + node4[label="|4|"] + node3->1 + 1->2 + node3->node4 + {rank=same; 1, 2} +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/img/graph1.png b/archive/algorithm/struct/tree/img/graph1.png new file mode 100644 index 0000000..3959c73 Binary files /dev/null and b/archive/algorithm/struct/tree/img/graph1.png differ diff --git a/archive/algorithm/struct/tree/img/graph2.gv b/archive/algorithm/struct/tree/img/graph2.gv new file mode 100644 index 0000000..b488b51 --- /dev/null +++ b/archive/algorithm/struct/tree/img/graph2.gv @@ -0,0 +1,16 @@ +digraph{ + node[shape=record width=.2 height=.1] + 1[label=" |1|"] + 2[label="|2|"] + 3[label=" |3|"] + 4[label=" |4|"] + 5[label=" |5|"] + 6[label=" |6|"] + + 3:f0->1:f1 + 1->2 + 3:f2->4 + 4->5->6 + {rank=same; 1, 2} + {rank=same; 4, 5, 6} +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/img/graph2.png b/archive/algorithm/struct/tree/img/graph2.png new file mode 100644 index 0000000..dd7aeb2 Binary files /dev/null and b/archive/algorithm/struct/tree/img/graph2.png differ diff --git a/archive/algorithm/struct/tree/img/graph3.gv b/archive/algorithm/struct/tree/img/graph3.gv new file mode 100644 index 0000000..1772d45 --- /dev/null +++ b/archive/algorithm/struct/tree/img/graph3.gv @@ -0,0 +1,32 @@ +digraph{ + node[shape=record width=.2 height=.1] + 1[label=" |1|"] + 2[label="|2|"] + 3[label=" |3|"] + 4[label=" |4|"] + 5[label=" |5|"] + 6[label=" |6|"] + 7[label=" |7|"] + 8[label=" |8|"] + 9[label=" |9|"] + + 3->6->9 + + 3:f0->1:f1 + 1->2 + 3:f2->4:f1 + 4->5 + + 6:f0->4:f1 + 6:f2->7:f1 + 7->8 + + 9:f0->7:f1 + + + {rank=same; 3, 6, 9} + {rank=same; 1, 2} + {rank=same; 4, 5} + {rank=same; 7, 8} + +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/img/graph3.png b/archive/algorithm/struct/tree/img/graph3.png new file mode 100644 index 0000000..32340b0 Binary files /dev/null and b/archive/algorithm/struct/tree/img/graph3.png differ diff --git a/archive/algorithm/struct/tree/img/valTree单旋.png b/archive/algorithm/struct/tree/img/valTree单旋.png new file mode 100644 index 0000000..4346f48 Binary files /dev/null and b/archive/algorithm/struct/tree/img/valTree单旋.png differ diff --git a/archive/algorithm/struct/tree/splayTree.c b/archive/algorithm/struct/tree/splayTree.c new file mode 100644 index 0000000..a890e44 --- /dev/null +++ b/archive/algorithm/struct/tree/splayTree.c @@ -0,0 +1,150 @@ +#include +#include +#include +/** + * 二叉伸展树 + * https://blog.csdn.net/u014634338/article/details/49586689 + */ + +struct tree; +#define bool int +#define false 0 +#define true 1 +#ifndef max +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif +typedef struct tree *prt_tree; +struct tree +{ + int data; //数据 + int height; //树深度 + prt_tree lt; //左节点 + prt_tree rt; //右节点 +}; + +prt_tree create_tree(int data) +{ + prt_tree tmp = malloc(sizeof(struct tree)); + memset(tmp, 0, sizeof(struct tree)); + tmp->data = data; + return tmp; +} +prt_tree add_tree(int data, prt_tree root) +{ + if (root == NULL) + { + prt_tree tmp = create_tree(data); + return tmp; + } + if (root->data > data) + { + root->lt = add_tree(data, root->lt); + } + else if (root->data < data) + { + root->rt = add_tree(data, root->rt); + } + return root; +} + +void splay_tree(prt_tree root, prt_tree tree); +prt_tree find_tree(prt_tree root, int val) +{ + if (root == NULL) + { + return NULL; + } + prt_tree tmp = NULL; + if (root->data > val) + { + tmp = find_tree(root->lt, val); + } + else if (root->data < val) + { + tmp = find_tree(root->rt, val); + } + if (tmp != NULL) + { + splay_tree(root, tmp); + } + return root; +} +void l_rotate(prt_tree a, prt_tree b); +void r_rotate(prt_tree a, prt_tree b); +void splay_tree(prt_tree root, prt_tree tree) +{ + if (tree == NULL) + { + return; + } + if (root->lt == tree) + { + l_rotate(root, tree); + } + else if (root->rt == tree) + { + r_rotate(root, tree); + } +} + +void l_rotate(prt_tree a, prt_tree b) +{ + int tmp = a->data; + a->data = b->data; //交换ab数据 + b->data = tmp; + prt_tree tmpNode = a->rt; + a->rt = b; + a->lt = b->lt; + b->lt = b->rt; + b->rt = tmpNode; +} +void r_rotate(prt_tree a, prt_tree b) +{ + int tmp = a->data; + a->data = b->data; + b->data = tmp; //交换ab数据 + prt_tree tmpNode = a->lt; + a->lt = b; + a->rt = b->rt; + b->rt = b->lt; + b->lt = tmpNode; +} +bool find(prt_tree root, int val) +{ + if (root->data == val) + { + return true; + } + prt_tree tmp = find_tree(root, val); + if (tmp == NULL || tmp == root) + { + return false; + } + return true; +} + +void print_tree(prt_tree root) //中序输出就是排序啦 +{ + if (root == NULL) + { + return; + } + print_tree(root->lt); + printf("%d\t", root->data); + print_tree(root->rt); +} + +int main() +{ + prt_tree root = create_tree(201); + for (int i = 0; i < 20; i++) + { + root = add_tree(rand(), root); + } + int s = 0; + scanf("%d", &s); + find(root, s); + print_tree(root); + system("pause"); + return 0; +} diff --git a/archive/algorithm/struct/tree/tree.c b/archive/algorithm/struct/tree/tree.c new file mode 100644 index 0000000..e8235f4 --- /dev/null +++ b/archive/algorithm/struct/tree/tree.c @@ -0,0 +1,156 @@ +#include +#include +#include +/** + * 树 + */ +struct tree; +typedef struct tree *prt_tree; + +struct tree +{ + int data; + prt_tree child; //子节点链表 + prt_tree brother; //兄弟节点链表 +}; + +prt_tree create_tree() +{ + void *tmp = malloc(sizeof(struct tree)); + memset(tmp, 0, sizeof(struct tree)); + return tmp; +} +/** + * 最后一个兄弟节点 + */ +prt_tree end_node_brother(prt_tree node) +{ + while (1) + { + if (node->brother != NULL) + { + node = node->brother; + } + else + { + break; + } + } + return node; +} + +/** + * 最后一个子节点 + */ +prt_tree end_node_child(prt_tree node) +{ + while (1) + { + if (node->child != NULL) + { + node = node->child; + } + else + { + break; + } + } + return node; +} +/** + * 子节点增加 + */ +prt_tree child_add(int data, prt_tree root) +{ + //判断子节点是不是空的,不是空就插入子节点的最后一个 + //应该子节点是只有一个的,其余的子节点通过兄弟节点链接 + prt_tree node = malloc(sizeof(struct tree)); + prt_tree child; + memset(node, 0, sizeof(struct tree)); + child = end_node_child(root); + child->child = node; + node->data = data; + return node; +} + +/** + * 兄弟节点增加 + */ +prt_tree brother_add(int data, prt_tree root) +{ + //判断兄弟节点是不是空的,不是空就插入至兄弟节点的最后一个 + prt_tree node = malloc(sizeof(struct tree)); + prt_tree brother; + memset(node, 0, sizeof(struct tree)); + brother = end_node_brother(root); + brother->brother = node; + node->data = data; + return node; +} +/** + * 添加树的内容 + */ +void add_tree(prt_tree root) +{ + char action = 0; + printf("当前节点数据:%d 操作:\n", root->data); + scanf("%s", &action); + switch (action) + { + case 'i': + { + int data = 0; + printf("子节点数据:\n"); + scanf("%d", &data); + prt_tree child = child_add(data, root); + add_tree(child); + //子节点插入 + break; + } + case 'o': + { + int data = 0; + printf("兄弟节点数据:\n"); + scanf("%d", &data); + prt_tree child = brother_add(data, root); + add_tree(child); + //兄弟节点插入 + break; + } + case 'q': + //滚回上一个节点 + return; + default: + break; + } + add_tree(root); +} + +/** + * 输出数 + */ +void print_tree(prt_tree root) +{ + if (root != NULL) + { + //输出子节点 + printf("%d的子节点:\n", root->data); + prt_tree child = root->child; + print_tree(child); + //输出兄弟节点 + printf("%d的兄弟节点:\n", root->data); + prt_tree brother = root->brother; + print_tree(brother); + printf("%d\n", root->data); + } +} + +int main() +{ + prt_tree root = NULL; + root = create_tree(); + add_tree(root); + print_tree(root); + system("pause"); + return 0; +} \ No newline at end of file diff --git a/archive/algorithm/struct/tree/trie.c b/archive/algorithm/struct/tree/trie.c new file mode 100644 index 0000000..b6c284b --- /dev/null +++ b/archive/algorithm/struct/tree/trie.c @@ -0,0 +1,159 @@ +#include +#include +#include + +#define MIN(a, b) a > b ? b : a +#define bool char +#define false 0 +#define true 1 + +typedef struct trie *trieNode; +typedef struct trie Trie; + +// 有bug的trie压缩树 + +struct trie +{ + char *path; //节点路径 + int data; //节点存放数据 + trieNode brother; //兄弟节点 + trieNode next; //下面的节点 +}; +trieNode tree; + +trieNode newNode() +{ + trieNode tmp = malloc(sizeof(Trie)); + memset(tmp, 0, sizeof(Trie)); + tmp->path = ""; + return tmp; +} + +//插入数据 +void insert(trieNode tree, char *path, int data) +{ + //判断节点路径 + if (tree->path == "") + { + //空路径直接插入 + tree->path = path; + tree->data = data; + return; + } + //判断路径耦合,path大于节点路径,往next节点查找 + //节点路径大于path,往brother找 (大小指相等的长度) + bool isPath = false; //表示path长度大于tree->path + int minLen = strlen(path); + if (strlen(path) > strlen(tree->path)) + { + isPath = true; + minLen = strlen(tree->path); + } + int pathPos = 0; + for (pathPos = 0; pathPos < minLen; pathPos++) + { + if (path[pathPos] != tree->path[pathPos]) + { + break; + } + } + if (pathPos == 0) //为0是全部不等,继续向下一个兄弟节点查询,除非下一个兄弟节点为null,直接插入 + { + if (tree->brother == NULL) + { + trieNode tmp = newNode(); + tmp->data = data; + tmp->path = path; + tree->brother = tmp; + } + else + { + insert(tree->brother, path, data); + } + } + else if (pathPos != minLen) //没有全部的相等 + { + if (tree->next == NULL) + { + tree->next = newNode(); + } + insert(tree->next, &path[pathPos], data); + insert(tree->next, &tree->path[pathPos], tree->data); + char *tmp = malloc(pathPos + 1); + memcpy(tmp, tree->path, pathPos); + tree->path = tmp; + tree->data = 0; + } + else //全部的相等 + { + if (isPath) //全等,并且path大,继续往next节点查找 + { + insert(tree->next, &path[pathPos], data); + } + else //全等,node->path大, + { + //空节点 + if (tree->next == NULL) + { + tree->next = newNode(); + } + char *tmp = malloc(pathPos + 1); + memcpy(tmp, tree->path, pathPos); + insert(tree->next, &tree->path[pathPos], tree->data); + tree->path = tmp; + tree->data = data; + } + } +} + +trieNode search(trieNode tree, char *path) +{ + if (tree == NULL) + { + return NULL; + } + int pos1 = 0, pos2 = 0; + for (; pos2 < strlen(path); pos2++, pos1++) + { + if (tree->path[pos1] != path[pos2]) + { + if (pos1 == 0) //为0则表示一个都不相等,往兄弟节点查询 + { + pos1 = -1; + pos2 -= 1; + tree = tree->brother; + } + else + { + //否则没了 + return NULL; + } + } + else if (pos1 == strlen(tree->path) - 1) //如果全部相等,node->path查找完毕,继续判断pos2是不是相等 + { + if (pos2 == strlen(path) - 1) //传入的path也全部扫描完毕,则当前节点就是搜索到的节点 + { + return tree; + } + else //否则,pos1重置为0,从下一个节点继续查找 + { + pos1 = -1; + tree = tree->next; + } + } + } + + return NULL; +} + +int main() +{ + tree = newNode(); + insert(tree, "/user/login", 111); + insert(tree, "/user/register", 222); + insert(tree, "/user/logout", 333); + insert(tree, "/user/message", 444); + insert(tree, "/user/mess", 555); + + trieNode tmp = search(tree, "/user/mess"); +} diff --git a/archive/algorithm/struct/tree/trie.drawio b/archive/algorithm/struct/tree/trie.drawio new file mode 100644 index 0000000..05dd952 --- /dev/null +++ b/archive/algorithm/struct/tree/trie.drawio @@ -0,0 +1 @@ +7Vtdk5owFP01PLYjBBAe1eq2M9vpxz6025cOK1lIG4kT4yr99Q2SyEeylum2EB2fdnNJgHvOzbk3V7XAbLW/odE6fU9iiC1nFO8t8MZyHHvkuPxPYclLiweEIaEoFpMqwx36BeVKYd2iGG4aExkhmKF107gkWQaXrGGLKCW75rRHgptPXUcJVAx3ywir1i8oZmlpDZxxZX8LUZLKJ9t+WF5ZRXKy8GSTRjHZ1UxgboEZJYSV/632M4gL8CQu5brFM1ePL0Zhxros2ON3Px8e4oDk9i4IJx/8W/vrK1De5SnCW+GweFmWSwRgzAERQ0JZShKSRXheWaeUbLMYFo8Z8VE155aQNTfa3PgDMpYLdqMtI9yUshUWV1VXhHcbsqVLeOL9ZUhENIHsxDzhVuFL7QECqBtIVpDRnE+gEEcMPTXJj0QMJcd5YumE0iivTVgTlLFN7c4fCwOfILYDj5vXXnnPXMZLi7TWCjsYnV7B/ynfQo5q7lSmQyjow2LxkN5+XzwRMs0/fV5+w+Pww7tXtnN5caF31D7TwADB+D8HxilcG3GxUEKjIr5gcZciBu/W0YGwHU8THUl+gpTB/UlWJHygDYYnRHdXaXYoTGlNrsHoeSJrQP7FBlKBSvmti3ttksHxAq4Sbn5/gGkDyztzwXE6JiL3X+vNi1C3zz3/d4VdJjRDcFfT63YDqQlSaoPhhEGrpMEQAQn3iH0tlnOZLEf3tStv9uLOh0EuBxl3t7aoGN7Xr1XLDiO57u+D3+0Y/MFQsa8l1LWvjL6UUXk6NkTOXEXOMBm+yvGbSnaUqKFKnEBBCWWDgyS7E7l03hsWJBnZNZTIlg0Okw3aFfPwSKm7zpp7VjC3gqk1H1vTmTUJGUXQmvvWZGSFqu5y51kTqg2j5CecEUwot2QkK8T3EWHcMkUYJRkfLjmkvHAB0wJKtIzwRFxYoTg+KLeOm6aa//utPtbsdE+lxvlvpz+VGWchKjwKE7QpMLtYMhy7Jby6ErJPOnTNLEkHT1QaFb4YLlpUALc/Kk6ew2pcPLshek+F7bjtsWDQy4iuKVILXF1ivJzIVTNuj8Gr58PX8XGir3cxZByhl12BcGgq1GL6T5ret5x4Lcy8/upFfRY8o16f3oGuH+pIxwxpeDiaQv0KfB/A6/T6CnwPwIdD4Gxci++FnI7N4vTUoda4ZDv4xxaSPRMPOl7Y4YDeK1jqqdCMGs41DSmgtkfPK6UBzUcc+om+UfIHdPJ3Bb4H4FVtuALfC/BgCJzPo4jrzqlnFqe6o6hBRVyr4afrMvWabdUGrDFFnD9qVrzu4GDpWnJnJdR+101t1snMPfuasDPwoVHAA7W/ZML3XjzjlCFUcDLhOx3tdOP5A3fogdozMOEM7I36gqn4esTx91DlTxaqX5WB+W8= \ No newline at end of file diff --git a/archive/algorithm/struct/tree/理解.md b/archive/algorithm/struct/tree/理解.md new file mode 100644 index 0000000..6923ec9 --- /dev/null +++ b/archive/algorithm/struct/tree/理解.md @@ -0,0 +1,57 @@ +avlTree 自平衡二叉查找树 是在插入的时候进行旋转,使树的深度相同(不超过1) +![](灵魂画图/valTree单旋.png) + +splayTree 伸展树 是在搜索的时候将节点往上提,提到根节点 + +单次旋转 +```graphviz +digraph{ + label="初始状态" + l_6;l_77; + a_7[color=blue] + b_8[color=red] + a_7->l_6->l_5 + a_7->b_8->r_9 + b_8->l_77 + l_6->r_66 +} +``` +```cpp +int tmp = a->data; +a->data = b->data; +b->data = tmp; +``` +```graphviz +digraph{ + label="交换ab" + l_6;l_77; + b_7[color=red] + a_8[color=blue] + a_8->l_6->l_5 + a_8->b_7->r_9 + b_7->l_77 + l_6->r_66 +} +``` +```cpp +//之后处理节点,需要吧b_7移动到左边,a_8左指向b_7 +//b_7左指向原a_8左(l_6),b_7右指向原b_7左(l_77) +//a_8右指向b_7右(r_9) +prt_tree tmp=a_8->lt; +a_8->lt=b_7; +a_8->rt=b_7->rt; +b_7->rt=b_7->lt; +b_7->lt=tmp; +``` +```graphviz +digraph{ + label="处理节点" + l_6;r_77; + b_7[color=red] + a_8[color=blue] + a_8->b_7->l_6->l_5 + a_8->r_9 + b_7->r_77 + l_6->r_66 +} +``` diff --git a/archive/algorithm/test.c b/archive/algorithm/test.c new file mode 100644 index 0000000..45d1afc --- /dev/null +++ b/archive/algorithm/test.c @@ -0,0 +1,14 @@ +#include +/** + * 调试Makefile +*/ +#define MIN(a, b) (a > b ? b : a) +int main() +{ + printf("Hello World!\n"); + int a = 1, b = 2, c = 3; + int d = (a > b) && (c++); + printf("%d\t%d\n", c, MIN(100, 20)); + getchar(); + return 0; +} diff --git a/archive/algorithm/tests/sort.c b/archive/algorithm/tests/sort.c new file mode 100644 index 0000000..cd6a6d1 --- /dev/null +++ b/archive/algorithm/tests/sort.c @@ -0,0 +1,78 @@ +#include +#include "time.h" + +#define MAIN_FUNC +#include "../algorithm/radix_sort.c" +#include "../algorithm/bubble.c" +#include "../algorithm/qsort.c" + +/** + * 排序耗时 + */ +int big_rand() +{ + return (((rand() << 8) & 0xFF00ul) | ((rand()) & 0x00FFul)); +} +/** + * 生成随机数 + */ +int *rand_generate(int len) +{ + // srand(time(NULL)); + int *list = malloc(len * sizeof(int)); + for (int i = 0; i < len; i++) + { + list[i] = big_rand(); + } + return list; +} +int *copy_int(int *source, int len) +{ + int *tmp = malloc(len * sizeof(int)); + memcpy(tmp, source, len * sizeof(int)); + return tmp; +} +void print_int(int *n) +{ + for (int i = 0; i < 100; i++) + { + printf("%d\t", n[i]); + } +} + +int main() +{ + + int len = 10000; + int *number = rand_generate(len); + int *tmp = copy_int(number, len); + clock_t start_time = clock(), t = 0; + // 基数排序 + radix_sort_lds(tmp, len); + t = clock(); + print_int(tmp); + printf("radix_sort_lds number:%d\ttime:%ldms\n", len, t - start_time); + //快速排序 + tmp = copy_int(number, len); + start_time = clock(); + quick_sort(tmp, len); + t = clock(); + print_int(tmp); + printf("quick_sort\tnumber:%d\ttime:%ldms\n", len, t - start_time); + //插入排序 + tmp = copy_int(number, len); + start_time = clock(); + insert_sort(tmp, len); + t = clock(); + print_int(tmp); + printf("insert_sort number:%d\ttime:%ldms\n", len, t - start_time); + //冒泡排序 + tmp = copy_int(number, len); + start_time = clock(); + bubble_sort(tmp, len); + t = clock(); + print_int(tmp); + printf("bubble_sort number:%d\ttime:%ldms\n", len, t - start_time); + getchar(); + return 0; +} \ No newline at end of file diff --git a/archive/blog.md b/archive/blog.md new file mode 100644 index 0000000..e3301e5 --- /dev/null +++ b/archive/blog.md @@ -0,0 +1,23 @@ +为了更好地组织你的博客,可以在已有的大类基础上细化分类,从而帮助读者快速找到他们感兴趣的内容。考虑到博客内容主要是开发和运维相关的知识分享,下面是一些建议的分类: + +DEV (开发) +编程语言 - 详细介绍不同编程语言的技巧、最佳实践和实例,如 Python、Java、JavaScript 等。 +框架与库 - 分享各种开发框架和库的使用技巧,如 React、Django、Spring Boot 等。 +前端开发 - 专注于前端技术栈,如 HTML、CSS、JavaScript、前端框架等。 +后端开发 - 涵盖后端技术和架构设计,如 API 开发、数据库交互、服务端脚本等。 +移动应用开发 - 分享 iOS 和 Android 开发的最佳实践、工具和库。 +开发工具 - 介绍各种开发工具的使用方法,如 IDE、版本控制系统、构建工具等。 +测试与质量保证 - 探讨软件测试方法、自动化测试工具和提高代码质量的策略。 +OPS (运维) +云计算与虚拟化 - 介绍云服务平台(如 AWS、Azure、Google Cloud)和虚拟化技术的使用和最佳实践。 +容器化与编排 - 深入探讨 Docker、Kubernetes 等容器技术和容器编排工具的应用。 +持续集成/持续部署 - 分享 CI/CD 流程的建立、工具(如 Jenkins、GitLab CI/CD)的使用和自动化部署技巧。 +监控与日志 - 介绍监控工具(如 Prometheus、Grafana)和日志管理实践,帮助运维团队及时发现并解决问题。 +网络安全 - 分享网络安全最佳实践、安全工具的使用以及如何防御常见的安全威胁。 +系统管理 - 涉及服务器和操作系统(如 Linux、Windows Server)的配置、管理和优化技巧。 +笔记 +学习笔记 - 分享个人学习新技术或解决特定问题的过程和心得。 +技术总结 - 定期总结技术学习和项目开发中的关键点和经验教训。 +读书笔记 - 分享阅读技术书籍或相关资料的心得和要点。 +工具与资源 - 推荐有用的开发和运维工具,分享资源链接,如在线学习平台、技术社区等。 +这样的分类既能够帮助你系统地组织内容,也能让读者更容易找到他们感兴趣的文章。你可以根据自己博客的具体内容和读者反馈进一步调整和完善这些分类。 diff --git a/archive/design pattern/adapter.cpp b/archive/design pattern/adapter.cpp new file mode 100644 index 0000000..93e9558 --- /dev/null +++ b/archive/design pattern/adapter.cpp @@ -0,0 +1,80 @@ +#include +using namespace std; + +class Encode1 +{ +public: + void print() + { + cout << "编码1\n"; + } +}; + +class Encode2 +{ +public: + void printf() + { + cout << "编码2\n"; + } +}; + +class Encrypt +{ +public: + virtual void Encode() = 0; +}; + +class Encode1Adapter : public Encrypt +{ +private: + Encode1 *encode; + +public: + Encode1Adapter(Encode1 *e) + { + encode = e; + } + void Encode() + { + encode->print(); + } +}; + +class ClassEncode2Adapter : public Encode2, public Encrypt +{ +public: + void Encode() + { + this->printf(); + } +}; + +class User +{ +private: + Encrypt *encrypt; + +public: + User(Encrypt *e) + { + this->encrypt = e; + } + void Use() + { + this->encrypt->Encode(); + } +}; + +int main() +{ + //对象适配器 + Encrypt *e = new Encode1Adapter(new Encode1()); + User *u = new User(e); + u->Use(); + //类适配器 + e = new ClassEncode2Adapter(); + u = new User(e); + u->Use(); + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/bridge.cpp b/archive/design pattern/bridge.cpp new file mode 100644 index 0000000..5052e50 --- /dev/null +++ b/archive/design pattern/bridge.cpp @@ -0,0 +1,66 @@ +#include +using namespace std; + +class DB +{ +public: + virtual string data() = 0; +}; + +class File +{ +protected: + DB *db; + +public: + void setDb(DB *db) + { + this->db = db; + } + virtual void print() = 0; +}; + +class Mysql : public DB +{ +public: + string data() + { + return "mysql"; + }; +}; + +class Oracle:public DB{ + public: + string data(){ + return "oracle"; + } +}; + +class Txt : public File +{ +public: + void print() + { + cout << "从" << this->db->data() << "提取数据转换为TXT格式\n"; + } +}; +class Pdf:public File{ + public: + void print() + { + cout << "从" << this->db->data() << "提取数据转换为PDF格式\n"; + } +}; +int main() +{ + DB *db = new Mysql();//选择数据库 + File *file=new Txt();//选择输出格式 + file->setDb(db); + file->print(); + + file=new Pdf(); + db=new Oracle(); + file->setDb(db); + file->print(); + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/builder.cpp b/archive/design pattern/builder.cpp new file mode 100644 index 0000000..60defde --- /dev/null +++ b/archive/design pattern/builder.cpp @@ -0,0 +1,109 @@ +#include + +using namespace std; + +class PlayWindow +{ +public: + string menu; + string list; + string window; + string control; + void print() + { + cout << "菜单:" << menu << "\t列表:" << list << "\t窗口:" << window << "\t控制条:" << control << "\n"; + } +}; + +class UI +{ +protected: + PlayWindow *window; + +public: + UI() + { + this->window = new PlayWindow; + } + virtual void buildMenu() = 0; + virtual void buildList() = 0; + virtual void buildWindow() = 0; + virtual void buildControl() = 0; + PlayWindow *create() + { + return this->window; + } +}; + +class Complete : public UI +{ +public: + Complete() : UI() {} + void buildMenu() + { + this->window->menu = "菜单"; + } + void buildList() + { + this->window->list = "播放菜单"; + } + void buildWindow() + { + this->window->window = "完整模式"; + } + void buildControl() + { + this->window->control = "控制条"; + } +}; + +class Thin : public UI +{ +public: + Thin() : UI() {} + void buildMenu() + { + this->window->menu = "无"; + } + void buildList() + { + this->window->list = "无"; + } + void buildWindow() + { + this->window->window = "精简窗口"; + } + void buildControl() + { + this->window->control = "精简控制条"; + } +}; +// 其它模式窗口 +class UIController +{ +private: + UI *ui; + +public: + UIController(UI *ui) + { + this->ui = ui; + } + PlayWindow *build() + { + this->ui->buildControl(); + this->ui->buildWindow(); + this->ui->buildList(); + this->ui->buildMenu(); + return this->ui->create(); + } +}; + +int main() +{ + UI *ui = new Complete(); //窗口样式 + UIController *uictl = new UIController(ui); + PlayWindow *window = uictl->build(); + window->print(); + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/command.cpp b/archive/design pattern/command.cpp new file mode 100644 index 0000000..772c8e8 --- /dev/null +++ b/archive/design pattern/command.cpp @@ -0,0 +1,106 @@ +#include +#include +using namespace std; + +class Operate +{ +public: + void Open() + { + cout << "打开" << endl; + } + void Create() + { + cout << "创建\n"; + } + void Edit() + { + cout << "编辑\n"; + } +}; + +class Command +{ +public: + virtual void execute() = 0; +}; + +class OpenCommand : public Command +{ + Operate oper; + +public: + void execute() + { + oper.Open(); + } +}; + +class EditCommand : public Command +{ + Operate oper; + +public: + void execute() + { + oper.Edit(); + } +}; + +class CreateCommand : public Command +{ + Operate oper; + +public: + void execute() + { + oper.Create(); + } +}; + +class MenuItem +{ + Command *command; + +public: + void setCommand(Command *command) + { + this->command = command; + } + void click() + { + command->execute(); + } +}; + +class Menu +{ + unordered_map items; + +public: + void add(string name, MenuItem *m) + { + items[name] = m; + } + void click(string name) + { + items[name]->click(); + } +}; + +int main() +{ + Menu *menu = new Menu(); + MenuItem *open = new MenuItem(), *create = new MenuItem(), *edit = new MenuItem(); + open->setCommand(new OpenCommand()); + menu->add("open", open); + create->setCommand(new CreateCommand()); + menu->add("create", create); + edit->setCommand(new EditCommand()); + menu->add("edit", edit); + + menu->click("open"); + menu->click("create"); + menu->click("edit"); + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/composite.cpp b/archive/design pattern/composite.cpp new file mode 100644 index 0000000..b12a5c9 --- /dev/null +++ b/archive/design pattern/composite.cpp @@ -0,0 +1,84 @@ +#include +#include +using namespace std; + +class Component +{ +public: + virtual void click() = 0; +}; +class Button : public Component +{ +public: + void click() + { + cout << "按钮按下\n"; + } +}; +class Text : public Component +{ +public: + void click() + { + cout << "文本框按下\n"; + } +}; + +class Window : public Component +{ +protected: + vector vec; + +public: + void add(Component *component) + { + vec.push_back(component); + } + void remove(Component *component) + { + for (int i = 0; i < vec.size(); i++) + { + if (vec[i] == component) + { + vec.erase(vec.begin() + i); + } + } + } + void click() + { + cout << "窗口按下\n"; + for (int i = 0; i < vec.size(); i++) + { + vec[i]->click(); + } + } +}; + +class Container : public Window +{ +public: + void click() + { + cout << "容器按下\n"; + for (int i = 0; i < vec.size(); i++) + { + vec[i]->click(); + } + } +}; + +int main() +{ + Window *w = new Window(); + w->add(new Text()); + w->add(new Button()); + Container *c = new Container(); + w->add(c); + c->add(new Button()); + c->add(new Text()); + c->add(new Button()); + w->click(); + cout << "\n\n"; + c->click(); + return 0; +} diff --git a/archive/design pattern/decorator.cpp b/archive/design pattern/decorator.cpp new file mode 100644 index 0000000..ccff23a --- /dev/null +++ b/archive/design pattern/decorator.cpp @@ -0,0 +1,69 @@ +#include +using namespace std; + +class text +{ +public: + virtual void display() = 0; +}; + +class original : public text +{ +public: + void display() + { + cout << "简单加密\n"; + } +}; + +class encrypt : public text +{ +protected: + text *t; + +public: + encrypt(text *t) + { + this->t = t; + } + void display() + { + t->display(); + } +}; + +class rsa : public encrypt +{ +public: + rsa(text *t) : encrypt(t) + { + } + void display() + { + encrypt::display(); + cout << "rsa加密\n"; + } +}; + +class bit : public encrypt +{ +public: + bit(text *t) : encrypt(t) + { + } + void display() + { + encrypt::display(); + cout << "位加密\n"; + } +}; + +int main() +{ + text *a, *b, *c; + a = new original(); + b = new rsa(a); + c = new bit(b); + c->display(); + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/facade.cpp b/archive/design pattern/facade.cpp new file mode 100644 index 0000000..2c2a7a6 --- /dev/null +++ b/archive/design pattern/facade.cpp @@ -0,0 +1,79 @@ +#include +using namespace std; + +class A +{ +public: + void printA() + { + cout << "A\n"; + } +}; + +class B +{ +public: + void printB() + { + cout << "B\n"; + } +}; + +class C +{ +public: + void printC() + { + cout << "C\n"; + } +}; + +class AbstractSystemFacade +{ +public: + virtual void Func() = 0; +}; + +class ABFacade : public AbstractSystemFacade +{ + A *a; + B *b; + +public: + ABFacade() + { + a = new A(); + b = new B(); + } + void Func() + { + a->printA(); + b->printB(); + } +}; +class ACFacade : public AbstractSystemFacade +{ + A *a; + C *c; + +public: + ACFacade() + { + a = new A(); + c = new C(); + } + void Func() + { + a->printA(); + c->printC(); + } +}; + +int main() +{ + AbstractSystemFacade *f = new ABFacade(); + f->Func(); + f=new ACFacade(); + f->Func(); + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/factory/abstract.cpp b/archive/design pattern/factory/abstract.cpp new file mode 100644 index 0000000..c7e2ca9 --- /dev/null +++ b/archive/design pattern/factory/abstract.cpp @@ -0,0 +1,62 @@ +#include +#include +using namespace std; + +class Init +{ +public: + virtual void init() = 0; +}; + +class ArrowKeys +{ +public: + virtual void arrowKeys() = 0; +}; + +class SystemFactory +{ +public: + virtual Init *CreateInit() = 0; + virtual ArrowKeys *CreateArrowKeys() = 0; +}; + +class AndroidInit : public Init +{ +public: + void init() + { + cout << "安卓初始化" << endl; + } +}; + +class AndroidArrowKeys : public ArrowKeys +{ +public: + void arrowKeys() + { + cout << "安卓方向键" << endl; + } +}; + +class AndroidFactory : public SystemFactory +{ +public: + Init *CreateInit() + { + return new AndroidInit(); + } + ArrowKeys *CreateArrowKeys() + { + return new AndroidArrowKeys(); + } +}; + +int main() +{ + SystemFactory *s = new AndroidFactory(); + s->CreateInit()->init(); + s->CreateArrowKeys()->arrowKeys(); + + return 0; +} diff --git a/archive/design pattern/factory/factory.cpp b/archive/design pattern/factory/factory.cpp new file mode 100644 index 0000000..63a8125 --- /dev/null +++ b/archive/design pattern/factory/factory.cpp @@ -0,0 +1,91 @@ +#include +#include +using namespace std; + +class Image +{ +public: + virtual void read() = 0; +}; + +class ImageFactory +{ +public: + virtual Image *create() = 0; + virtual void read() = 0; +}; + +class JpgImage : public Image +{ +public: + string filename; + +public: + JpgImage(string filename) + { + this->filename = filename; + } + + void read() + { + cout << "读取jpg文件:" << this->filename << endl; + } +}; + +class PngImage : public Image +{ +public: + void read() + { + cout << "读取png图片" << endl; + } +}; + +class JpgImageFactory : public ImageFactory +{ +private: + Image *img; + +public: + Image *create() + { + this->img = new JpgImage("file-name"); + return this->img; + } + + void read() + { + img->read(); + } +}; + +class PngImageFactory : public ImageFactory +{ +private: + Image *img; + +public: + Image *create() + { + this->img = new PngImage(); + return this->img; + } + void read() + { + img->read(); + } +}; + +int main() +{ + ImageFactory *factory = new JpgImageFactory(); + Image *img = factory->create(); + img->read(); + factory->read(); + + factory = new PngImageFactory(); + img = factory->create(); + img->read(); + factory->read(); + return 0; +} diff --git a/archive/design pattern/factory/img/1.png b/archive/design pattern/factory/img/1.png new file mode 100644 index 0000000..0670538 Binary files /dev/null and b/archive/design pattern/factory/img/1.png differ diff --git a/archive/design pattern/factory/readme.md b/archive/design pattern/factory/readme.md new file mode 100644 index 0000000..623a982 --- /dev/null +++ b/archive/design pattern/factory/readme.md @@ -0,0 +1,8 @@ +## 简单工厂模式 +> 一个工厂生产多个产品 + +## 工厂方法模式 +> 多个工厂生产多个产品 + + +![](img/1.png) \ No newline at end of file diff --git a/archive/design pattern/factory/simple.cpp b/archive/design pattern/factory/simple.cpp new file mode 100644 index 0000000..21551fa --- /dev/null +++ b/archive/design pattern/factory/simple.cpp @@ -0,0 +1,52 @@ +#include +#include + +class Graph +{ +public: + virtual void show() = 0; +}; + +class Triangle : public Graph +{ +public: + void show() + { + std::cout << "三角形" << std::endl; + } +}; + +class Round : public Graph +{ +public: + void show() + { + std::cout << "圆形" << std::endl; + } +}; + +class GraphFactory +{ +public: + static Graph *CreateGraph(std::string name) + { + if (name == "triangle") + { + return new Triangle(); + } + else if (name == "round") + { + return new Round(); + } + return NULL; + } +}; + +int main() +{ + Graph *a = GraphFactory::CreateGraph("triangle"); + a->show(); + a = GraphFactory::CreateGraph("round"); + a->show(); + return 0; +} diff --git a/archive/design pattern/flyweight.cpp b/archive/design pattern/flyweight.cpp new file mode 100644 index 0000000..e251c26 --- /dev/null +++ b/archive/design pattern/flyweight.cpp @@ -0,0 +1,98 @@ +#include +#include +using namespace std; + +class info +{ +public: + int x; + int y; + info(int x, int y) + { + this->x = x; + this->y = y; + } +}; + +class resource +{ +public: + virtual void display(info *) = 0; +}; + +class img : public resource +{ + string image; + +public: + img(string img) + { + this->image = img; + } + void display(info *i) + { + cout << "图片:" << image << "位置:" << i->x << "," << i->y << endl; + } +}; + +class video : public resource +{ + string v; + +public: + video(string video) + { + this->v = video; + } + void display(info *i) + { + cout << "视频:" << v << "位置:" << i->x << "," << i->y << endl; + } +}; + +class resourceFactory +{ +protected: + static unordered_map map; + + static resourceFactory *res; + +public: + static resourceFactory *getResourceFactory() + { + return resourceFactory::res; + } + + resource *getResource(string key) + { + if (map.find(key) == map.end()) + { + return NULL; + } + return map[key]; + } + + void add(string key, resource *res) + { + map[key] = res; + } +}; + +unordered_map resourceFactory::map; +resourceFactory *resourceFactory::res = new resourceFactory(); + +int main() +{ + resource *img1 = new img("1"), *img2 = new img("2"); + resource *video1 = new video("1"), *video2 = new video("2"); + resourceFactory *factory = resourceFactory::getResourceFactory(); + factory->add("img1", img1); + factory->add("img2", img2); + factory->add("video1", video1); + factory->add("video2", video2); + + factory->getResource("img1")->display(new info(1, 2)); + factory->getResource("video1")->display(new info(4, 2)); + + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/interpreter.cpp b/archive/design pattern/interpreter.cpp new file mode 100644 index 0000000..8f0e540 --- /dev/null +++ b/archive/design pattern/interpreter.cpp @@ -0,0 +1,104 @@ +#include +using namespace std; + +//expression=command';'* +//command=action object 'from' databse 'to' database +//action='copy'|'move' +//object='view'|'table' name +//database=string +class AbstractExpression +{ +public: + virtual string interpert() = 0; +}; + +class Object : public AbstractExpression +{ + string str; + +public: + Object(string str) + { + this->str=str; + } + string interpert() + { + if (str.substr(0, 4) == "view") + { + return "视图"; + } + else + { + return "表" + str.substr(6); + } + } +}; + +class Database : public AbstractExpression +{ + string db; + +public: + Database(string db) + { + this->db = db; + } + string interpert() + { + return db; + } +}; + +class Action : public AbstractExpression +{ + string action; + +public: + Action(string action) + { + this->action = action; + } + string interpert() + { + if (action == "copy") + { + return "复制"; + } + else + { + return "移动"; + } + } +}; + +class Command : public AbstractExpression +{ + AbstractExpression *action; + AbstractExpression *object; + AbstractExpression *db1; + AbstractExpression *db2; + +public: + Command(AbstractExpression *action, + AbstractExpression *object, + AbstractExpression *db1, + AbstractExpression *db2) + { + this->action = action; + this->object = object; + this->db1 = db1; + this->db2 = db2; + } + string interpert() + { + return "从" + db1->interpert() + "中" + action->interpert() + object->interpert() + "到" + db2->interpert(); + } +}; + +int main() +{ + string cmd = "copy view from db1 to db2;move table a from db1 to db2;"; + AbstractExpression *exp = new Command(new Action("copy"), new Object("view"), new Database("db1"), new Database("db2")); + cout << exp->interpert() << endl; + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/interpreter_calculator.cpp b/archive/design pattern/interpreter_calculator.cpp new file mode 100644 index 0000000..173c8de --- /dev/null +++ b/archive/design pattern/interpreter_calculator.cpp @@ -0,0 +1,102 @@ +#include +#include +#include +using namespace std; + +class AbstractExpression +{ +public: + virtual int value() = 0; +}; + +class ValueExpression : public AbstractExpression +{ + int val; + +public: + ValueExpression(string val) + { + this->val = atoi(val.c_str()); + } + int value() + { + return this->val; + } +}; + +class SymbolExpression : public AbstractExpression +{ + AbstractExpression *left, *right; + string symbol; + +public: + SymbolExpression(string symbol, AbstractExpression *left, AbstractExpression *right) + { + this->symbol = symbol; + this->left = left; + this->right = right; + } + + int value() + { + // 非加即减 + if (symbol == "+") + { + return left->value() + right->value(); + } + else + { + return left->value() - right->value(); + } + } +}; +//expression=value|operator +//value=number +//operator='+'|'-' +int main() +{ + char str[] = "1+4+5+6-7"; + AbstractExpression *exp = new SymbolExpression("+", new ValueExpression("1"), new SymbolExpression("+", new ValueExpression("4"), new SymbolExpression("+", new ValueExpression("5"), new SymbolExpression("-", new ValueExpression("6"), new ValueExpression("7"))))); //反了 + cout << "手动构建:" << exp->value() << endl; + stack stack; + AbstractExpression *expression; + for (int i = 0; i < strlen(str); i++) + { + if (str[i] >= '0') + { + string val; + for (; i < strlen(str); i++) + { + if (str[i] < '0') + { + break; + } + val += str[i]; + } + i--; + stack.push(new ValueExpression(val)); + } + else + { + string symbol; + symbol += str[i++]; + AbstractExpression *exp = stack.top(); + stack.pop(); + string val; + for (; i < strlen(str); i++) + { + if (str[i] < '0') + { + break; + } + val += str[i]; + } + i--; + stack.push(new SymbolExpression(symbol, exp, new ValueExpression(val))); + } + } + expression = stack.top(); + cout << "value:" << expression->value() << endl; + + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/iterator.cpp b/archive/design pattern/iterator.cpp new file mode 100644 index 0000000..a1b4602 --- /dev/null +++ b/archive/design pattern/iterator.cpp @@ -0,0 +1,71 @@ +#include +#include +using namespace std; + +class AbstractIterator +{ +public: + virtual void *next() = 0; +}; +class PageIterator : public AbstractIterator +{ +protected: + vector v; + int pos = 0; + +public: + PageIterator(vector v) + { + this->v = v; + } + void *next() + { + if (pos >= v.size()) + { + return NULL; + } + + return v[pos++]; + } +}; +class List +{ +protected: + vector v; + +public: + void add(void *data) + { + v.insert(v.end(), data); + } + AbstractIterator *page(int page) + { + vector p(v.begin() + ((page - 1) * 5), v.begin() + (page * 5)); + return new PageIterator(p); + } +}; + +int main() +{ + List *list = new List(); + for (int i = 0; i < 8; i++) + { + int *tmp = (int *)malloc(sizeof(int)); + *tmp = i; + list->add(tmp); + } + AbstractIterator *iterator = list->page(1); + void *next; + cout << "page1:\n"; + while ((next = iterator->next()) != NULL) + { + cout << *(int *)next << "\t"; + } + cout << "\npage2:\n"; + iterator = list->page(2); + while ((next = iterator->next()) != NULL) + { + cout << *(int *)next << "\t"; + } + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/observer.cpp b/archive/design pattern/observer.cpp new file mode 100644 index 0000000..1e0bde6 --- /dev/null +++ b/archive/design pattern/observer.cpp @@ -0,0 +1,85 @@ +#include +#include +using namespace std; + +class Observer +{ +public: + virtual void sell(int) = 0; +}; +class Subject +{ +protected: + vector vec; + +public: + void add(Observer *o) + { + vec.push_back(o); + } + virtual void notify(int) = 0; +}; + +class DJIA : public Subject +{ +public: + void notify(int price) + { + cout << "道琼斯发生了熔断,通知" << endl; + for (int i = 0; i < vec.size(); i++) + { + vec[i]->sell(price); + } + } +}; + +class SSE : public Subject +{ +public: + void notify(int price) + { + cout << "上证突破3000点了,通知" << endl; + for (int i = 0; i < vec.size(); i++) + { + vec[i]->sell(price); + } + } +}; + +class Chives : public Observer +{ + string name; + +public: + Chives(string name) + { + this->name = name; + } + void sell(int price) + { + cout << name << ":买就行了,加仓干\n"; + } +}; + +class Dalao : public Observer +{ +public: + void sell(int price) + { + cout << "大佬:分析一下\n"; + }; +}; + +int main() +{ + Subject *a = new DJIA(), *b = new SSE(); + Observer *c1 = new Chives("韭菜1"), *c2 = new Chives("韭菜2"), *dl = new Dalao(); + a->add(c1); + a->add(dl); + b->add(c2); + + a->notify(10000); + b->notify(3000); + + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/prototype.cpp b/archive/design pattern/prototype.cpp new file mode 100644 index 0000000..14df632 --- /dev/null +++ b/archive/design pattern/prototype.cpp @@ -0,0 +1,53 @@ +#include +#include + +using namespace std; + +class Object +{ +public: + virtual Object *colne() { return NULL; }; + virtual void display() = 0; +}; + +class Address +{ +public: + string address; + Address(string addr) + { + this->address = addr; + } +}; + +class Customer : public Object +{ +public: + Address *address; + string user; + Object *clone() // 深拷贝 + { + Customer *a = new Customer(); + a->user = this->user; + a->address = new Address(this->address->address); + return a; + } + void display() + { + cout << this->user << ":" << this->address->address << endl; + } +}; + +int main() +{ + Customer *a = new Customer(); + a->user = "test"; + a->address = new Address("haha"); + + Customer *b = (Customer *)a->clone(); + b->user = "test123"; + a->display(); + b->display(); + + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/proxy.cpp b/archive/design pattern/proxy.cpp new file mode 100644 index 0000000..e8fa727 --- /dev/null +++ b/archive/design pattern/proxy.cpp @@ -0,0 +1,42 @@ +#include +using namespace std; + +class method +{ +public: + void Method() + { + cout << "方法Method调用成功" << endl; + } +}; + +class methodProxy +{ +protected: + method *m; + +public: + methodProxy() + { + m = new method(); + } + void Method(int uid) + { + cout << "用户" << uid << "方法Method()被调用" << time(NULL) << endl; + if (uid > 10) + { + cout << "用户" << uid << "方法Method()调用失败" << time(NULL) << endl; + return; + } + this->m->Method(); + cout << "用户" << uid << "方法Method()调用结束" << time(NULL) << endl; + } +}; + +int main() +{ + methodProxy *proxy = new methodProxy(); + proxy->Method(1); + proxy->Method(11); + return 0; +} \ No newline at end of file diff --git a/archive/design pattern/proxy_2.cpp b/archive/design pattern/proxy_2.cpp new file mode 100644 index 0000000..b0d7876 --- /dev/null +++ b/archive/design pattern/proxy_2.cpp @@ -0,0 +1,38 @@ +#include +using namespace std; + +class Pic +{ +public: + string download(string url) + { + cout << "图片下载中..."; + return url; + } +}; + +class PicProxy +{ +protected: + Pic *pic; + +public: + PicProxy() + { + pic = new Pic(); + } + void download(string url) + { + cout<<"显示默认图片到列表\n"; + cout<<"开启线程下载图片\n"; + cout<pic->download(url); + } +}; + + +int main() +{ + PicProxy* p=new PicProxy(); + p->download("img1"); + return 0; +} diff --git a/archive/design pattern/readme.md b/archive/design pattern/readme.md new file mode 100644 index 0000000..4d726dd --- /dev/null +++ b/archive/design pattern/readme.md @@ -0,0 +1,22 @@ +## 单一职责原则 +一个类只负责一个功能领域中的相应职责 + +## 开闭原则 +软件实体应对扩展开放,而对修改关闭 + +## 里氏替换原则 +> 将父类替换为子类,逻辑依旧通过 +所有引用基类对象的地方能够透明地使用其子类的对象 + +## 依赖倒置原则 +抽象不应该依赖于细节,细节应该依赖于抽象 + +## 接口隔离原则 +> 接口版的单一职责原则 +使用多个专门的接口,而不使用单一的总接口 + +## 合成复用原则 +尽量使用对象组合,而不是继承来达到复用的目的 + +## 迪米特法则 +一个软件实体应当尽可能少地与其他实体发生相互作用 diff --git a/archive/design pattern/responsibility.cpp b/archive/design pattern/responsibility.cpp new file mode 100644 index 0000000..0e12068 --- /dev/null +++ b/archive/design pattern/responsibility.cpp @@ -0,0 +1,89 @@ +#include +using namespace std; +class Info +{ +public: + string name; + int day; + Info(string name, int day) + { + this->name = name; + this->day = day; + } +}; +class Approval +{ +protected: + string name; + Approval *next; + +public: + Approval(string name) + { + this->name = name; + } + void setSuccessor(Approval *next) + { + this->next = next; + } + virtual void process(Info *info) = 0; +}; + +class Director : public Approval +{ +public: + Director(string name) : Approval(name) {} + void process(Info *info) + { + if (info->day <= 3) + { + cout << this->name << "同意" << info->name << "请假" << info->day << "天" << endl; + } + else + { + this->next->process(info); + } + } +}; + +class Manager : public Approval +{ +public: + Manager(string name) : Approval(name) {} + void process(Info *info) + { + if (info->day <= 10) + { + cout << this->name << "同意" << info->name << "请假" << info->day << "天" << endl; + } + else + { + this->next->process(info); + } + } +}; + +class Boss : public Approval +{ +public: + Boss(string name) : Approval(name) {} + void process(Info *info) + { + cout << this->name << "同意" << info->name << "请假" << info->day << "天" << endl; + } +}; + +int main() +{ + Director *d = new Director("主管A"); + Manager *m = new Manager("经理B"); + Boss *b = new Boss("老板C"); + d->setSuccessor(m); + m->setSuccessor(b); + + d->process(new Info("员工A", 2)); + d->process(new Info("员工B", 4)); + d->process(new Info("员工C", 15)); + + return 0; +} \ No newline at end of file diff --git a/archive/docs/docker&k8s/entrypoint.assets/image-20210114105711640.png b/archive/docs/docker&k8s/entrypoint.assets/image-20210114105711640.png new file mode 100644 index 0000000..d13c47b Binary files /dev/null and b/archive/docs/docker&k8s/entrypoint.assets/image-20210114105711640.png differ diff --git a/archive/docs/docker&k8s/entrypoint.assets/image-20210114111116997.png b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111116997.png new file mode 100644 index 0000000..8523303 Binary files /dev/null and b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111116997.png differ diff --git a/archive/docs/docker&k8s/entrypoint.assets/image-20210114111300414.png b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111300414.png new file mode 100644 index 0000000..d31b960 Binary files /dev/null and b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111300414.png differ diff --git a/archive/docs/docker&k8s/entrypoint.assets/image-20210114111521900.png b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111521900.png new file mode 100644 index 0000000..1ed1946 Binary files /dev/null and b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111521900.png differ diff --git a/archive/docs/docker&k8s/entrypoint.assets/image-20210114111836685.png b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111836685.png new file mode 100644 index 0000000..f778a45 Binary files /dev/null and b/archive/docs/docker&k8s/entrypoint.assets/image-20210114111836685.png differ diff --git a/archive/docs/docker&k8s/entrypoint.assets/image-20210114112052386.png b/archive/docs/docker&k8s/entrypoint.assets/image-20210114112052386.png new file mode 100644 index 0000000..b7663f7 Binary files /dev/null and b/archive/docs/docker&k8s/entrypoint.assets/image-20210114112052386.png differ diff --git a/archive/docs/docker&k8s/entrypoint.assets/image-20210114112244500.png b/archive/docs/docker&k8s/entrypoint.assets/image-20210114112244500.png new file mode 100644 index 0000000..b8759dc Binary files /dev/null and b/archive/docs/docker&k8s/entrypoint.assets/image-20210114112244500.png differ diff --git a/archive/docs/docker&k8s/entrypoint和cmd.md b/archive/docs/docker&k8s/entrypoint和cmd.md new file mode 100644 index 0000000..76d046b --- /dev/null +++ b/archive/docs/docker&k8s/entrypoint和cmd.md @@ -0,0 +1,58 @@ +entrypoint是容器执行的命令cmd是执行的命令或者参数. + +```bash +docker run --entrypoint /bin/bash test bash +# 覆盖ENTRYPOINT 覆盖CMD +``` + +```dockerfile +ENTRYPOINT ["/bin/echo", "hello"] +CMD ["world"] +``` + +![image-20210114105711640](entrypoint.assets/image-20210114105711640.png) + +像这样执行结果是:`Hello world` + +覆盖CMD的参数 + +```bash +docker run test eicas +``` + +![image-20210114111521900](entrypoint.assets/image-20210114111521900.png) + +感觉就像是将两个命令拼接起来 + +### 在k8s中的对应 + +[k8s文档地址](https://kubernetes.io/zh/docs/tasks/inject-data-application/define-command-argument-container/#notes) + +![image-20210114112244500](entrypoint.assets/image-20210114112244500.png) + + + +### CMD和ENTRYPOINT执行的两种形式 + +```dockerfile +CMD "命令/参数" +# 以shell执行,相当于会自动补全"/bin/sh -c ",等价于CMD ["/bin/sh -c ","\"命令/参数\""],ENTRYPOINT也是如此 +``` + +![image-20210114112052386](entrypoint.assets/image-20210114112052386.png) + +![image-20210114105605169](https://i.loli.net/2021/01/14/6LMPTFvfbrkXjd1.png) + +![image-20210114111116997](entrypoint.assets/image-20210114111116997.png) + +ENTRYPOINT的shell方式下,无法接受参数 + +![image-20210114111300414](entrypoint.assets/image-20210114111300414.png) + +```dockerfile +CMD ["命令/参数","命令/参数"] +# 以exec形式执行 +``` + +![image-20210114105711640](entrypoint.assets/image-20210114105711640.png) + diff --git a/archive/docs/docker&k8s/搭建环境.md b/archive/docs/docker&k8s/搭建环境.md new file mode 100644 index 0000000..d1989ad --- /dev/null +++ b/archive/docs/docker&k8s/搭建环境.md @@ -0,0 +1,68 @@ +> 最终还是放弃了使用wsl2和docker来运行k8s,安装了虚拟机来使用,后续可能尝试在本地连接虚拟机环境的docker来在本地用docker. +> 主要还是因为wsl2不够完善systemctl不能使用,我这小菜鸡不知道怎么去解决了,docker for desktop的k8s时好时坏.还是虚拟机好使一点... + +### 安装虚拟机 +我使用的是`VirtualBox`,安装我已经安装好了,网络使用的是桥接,其他没什么可注意的,正常安装,这里我用的是centos.CPU-->2 MEM-->4G + +![](../../img/screen/}]6J69Q}FQCLI]E]}L5F$TG.png) + +### 安装docker +> 用这些工具安装都是很简单的,主要是网络的问题(我只创建了root账号,所以后面的没有用sudo,用了sudo反而不能用代理,没管那么多了) + +按照[https://docs.docker.com/install/linux/docker-ce/centos/](https://docs.docker.com/install/linux/docker-ce/centos/)的来就好了 +```bash +export https_proxy=http://proxyip:port +yum install -y yum-utils \ + device-mapper-persistent-data \ + lvm2 +yum-config-manager \ + --add-repo \ + https://download.docker.com/linux/centos/docker-ce.repo +yum install docker-ce docker-ce-cli containerd.io +systemctl start docker +# test +docker run hello-world +``` + +### 设置docker代理 +[https://docs.docker.com/config/daemon/systemd/](https://docs.docker.com/config/daemon/systemd/) + +```bash +mkdir -p /etc/systemd/system/docker.service.d +vi /etc/systemd/system/docker.service.d/https-proxy.conf +### 输入(和之前的一样) +[Service] +Environment="HTTPS_PROXY=http://proxyip:port" +### +systemctl daemon-reload +systemctl restart docker +systemctl show --property=Environment docker +``` + + + +### 然后是minikube +> 主要是代理配置好,就没什么问题,哪里慢也可以配置代理提高速度 + +#### 获取kubectl和minikunbe +```bash +curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && mv kubectl /usr/local/bin/ + +curl -Lo minikube https://storage.googleapis.com/minikube/releases/v1.3.0/minikube-linux-amd64 && chmod +x minikube && cp minikube /usr/local/bin/ && rm minikube +``` + +#### start +``` +minikube start --vm-driver=none +``` + +如果中间有失败的可以删除minikube再重新上面的步骤(尝试记得做快照) +```bash +rm ~/.minikube/ ~/.kube -rf +``` + +这样就算成功了 + +![](../../img/screen/VV68]}9Y0F4LGCF]I$P\({6M.png) + +- -...弄好干啥,暂时不知道,先弄好吧 \ No newline at end of file diff --git a/archive/docs/docker&k8s/踩坑记录.md b/archive/docs/docker&k8s/踩坑记录.md new file mode 100644 index 0000000..b0128a9 --- /dev/null +++ b/archive/docs/docker&k8s/踩坑记录.md @@ -0,0 +1,40 @@ +### minikube安装之后 kubectl get node 无效 +需要移除http_proxy不要使用代理 + +### nginx无法反代其他端口 +查看日志: +connect() to 127.0.0.1:8080 failed (13: Permission denied) + +解决: +修改SeLinux +```bash +setsebool -P httpd_can_network_connect 1 +``` + +### minikube安装面板无法访问 +报错Error while initializing connection to Kubernetes apiserver. This most likely means that the cluster is misconfigured (e.g., it has invalid apiserver certificates or service account's configuration) or the --apiserver-host param points to a server that does not exist. Reason: Get https://10.96.0.1:443/version: dial tcp 10.96.0.1:443: connect: no route to host +Refer to our FAQ and wiki pages for more information: https://github.com/kubernetes/dashboard/wiki/FAQ + +解决: +https://blog.csdn.net/shida_csdn/article/details/80028905 +```bash +# systemctl stop kubelet +# systemctl stop docker +# iptables --flush +# iptables -tnat --flush +# systemctl start kubelet +# systemctl start docker +``` + +### docker私有仓库 +需要在 /etc/docker/certs.d 下建立域名为名称的文件夹,放入ca.crt证书 + +### golang module私有仓库 +> 当天就更新了go1.13 +主要是设置git的(注意配置.ssh秘钥之类) +``` +[url "ssh://git@xxxxx"] + insteadOf = https://xxxx +``` + +私有仓库参考文章:https://mp.weixin.qq.com/s?__biz=MzU3Mzk5OTk1OQ==&mid=2247483702&idx=1&sn=d2a97191cec84ca59a3c63c7de273aeb&chksm=fd385f0eca4fd618dbb63bc01e50297a075663e8f6b401fe9171fa69fae9bd088de67f1fbe9b&mpshare=1&scene=23&srcid=0905LuIt21jXoWgVuNwcdzRO&sharer_sharetime=1567642857821&sharer_shareid=8b453be2580fa2f2bbcdf77f41134328#rd \ No newline at end of file diff --git a/archive/docs/docker&k8s/远程调试.md b/archive/docs/docker&k8s/远程调试.md new file mode 100644 index 0000000..04ebd15 --- /dev/null +++ b/archive/docs/docker&k8s/远程调试.md @@ -0,0 +1,59 @@ +> 在虚拟机内进行调试,肯定没有本机的wsl和docker那么方便,不过总是有办法的 + +### VSCode +> vscode 提供了远程连接的插件`Visual Studio Code Remote - SSH` + +然后新建一个连接就好了,然后新建的vscode就完全处在远程的环境中了 + +![](../../img/screen/OH1IUV3NV\(LH7U\]H8N0WZ_E.png) +config内容: +```bash +# Read more about SSH config files: https://linux.die.net/man/5/ssh_config +Host centos + HostName 虚拟机ip + User root +``` + +然后比较烦的就是每次打开都需要输入密码,我们可以用我们的公钥登录(git那个) +```bash +mkdir .ssh +chmod 700 .ssh/ +touch ~/.ssh/authorized_keys +chmod 600 ~/.ssh/authorized_keys +vi ~/.ssh/authorized_keys +### 这里我们直接吧id_rsa.pub复制粘贴上传上去- -...用xshell之类的工具去粘贴 +``` +config后面增加`IdentityFile`,然后就完事了 +```bash +# Read more about SSH config files: https://linux.die.net/man/5/ssh_config +Host centos + HostName 虚拟机ip + User root + IdentityFile ~/.ssh/id_rsa +``` + +不过就是还要重新建立环境 + +### docker(vscode) +安装微软的那个docker插件,然后进入首选项,修改如下配置 +![](../../img/screen/6UVI\)HI6]~QXP33OMNWYSAF.png) + +在虚拟机中允许docker远程访问 +```bash +vi /usr/lib/systemd/system/docker.service +### 修改文件 +[Service] +ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock +### 上面这一行,主要是增加了`-H tcp://0.0.0.0:2375` +systemctl daemon-reload +systemctl restart docker +### 如果连不上,关闭防火墙,直接关! +systemctl stop firewalld +### 算了,只打开docker的端口 +firewall-cmd --zone=public --add-port=2375/tcp --permanent +``` + +### idea系列 +![](../../img/screen/7AOA\[T4P2V`Y9O3E9AR6~YN.png) +直接上图 + diff --git a/archive/docs/go-micro-learn/demo_test.go b/archive/docs/go-micro-learn/demo_test.go new file mode 100644 index 0000000..fe2fb04 --- /dev/null +++ b/archive/docs/go-micro-learn/demo_test.go @@ -0,0 +1 @@ +package micro diff --git a/archive/docs/go-micro-learn/interface&struct.md b/archive/docs/go-micro-learn/interface&struct.md new file mode 100644 index 0000000..b06c5f7 --- /dev/null +++ b/archive/docs/go-micro-learn/interface&struct.md @@ -0,0 +1,70 @@ +## resolver.Resolver +请求解析器,当一个http请求过来,解析到对应的服务 + +https://github.com/micro/go-micro/blob/master/api/resolver/resolver.go +```go +type Resolver interface { + Resolve(r *http.Request) (*Endpoint, error) + String() string +} +``` +deme:(来自grpc) +```go +func (r *Resolver) Resolve(req *http.Request) (*resolver.Endpoint, error) { + // /foo.Bar/Service + if req.URL.Path == "/" { + return nil, errors.New("unknown name") + } + // [foo.Bar, Service] + parts := strings.Split(req.URL.Path[1:], "/") + // [foo, Bar] + name := strings.Split(parts[0], ".") + // foo + return &resolver.Endpoint{ + Name: strings.Join(name[:len(name)-1], "."),//foo + Host: req.Host, + Method: req.Method, + Path: req.URL.Path, + }, nil +} +``` + +## Namespace + +https://github.com/micro/go-micro/blob/master/api/handler/options.go +```go +type Option func(o *Options) +``` + + +## Registry +服务注册发现接口 + +https://github.com/micro/go-micro/blob/master/registry/registry.go +```go +type Registry interface { + Init(...Option) error + Options() Options + Register(*Service, ...RegisterOption) error + Deregister(*Service) error + GetService(string) ([]*Service, error) + ListServices() ([]*Service, error) + Watch(...WatchOption) (Watcher, error) + String() string +} +``` + +## api.Router +路由接口 +```go +type Router interface { + // Returns options + Options() Options + // Stop the router + Close() error + // Endpoint returns an api.Service endpoint or an error if it does not exist + Endpoint(r *http.Request) (*api.Service, error) + // Route returns an api.Service route + Route(r *http.Request) (*api.Service, error) +} +``` \ No newline at end of file diff --git a/archive/docs/go-micro-learn/readme.md b/archive/docs/go-micro-learn/readme.md new file mode 100644 index 0000000..d9f5fdf --- /dev/null +++ b/archive/docs/go-micro-learn/readme.md @@ -0,0 +1 @@ +> 大概只有我自己能看懂吧 \ No newline at end of file diff --git a/archive/docs/go-micro-learn/方法.md b/archive/docs/go-micro-learn/方法.md new file mode 100644 index 0000000..ddec5ed --- /dev/null +++ b/archive/docs/go-micro-learn/方法.md @@ -0,0 +1,5 @@ +## micro.NewService +从这里开始,帮你实现服务注册等功能 + +## micro.NewServer +创建服务端 diff --git a/archive/go.mod b/archive/go.mod new file mode 100644 index 0000000..2ed0453 --- /dev/null +++ b/archive/go.mod @@ -0,0 +1,15 @@ +module study + +go 1.17 + +require ( + github.com/allegro/bigcache/v3 v3.0.2 + github.com/pkg/errors v0.9.1 + github.com/stretchr/testify v1.7.0 +) + +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) diff --git a/archive/go.sum b/archive/go.sum new file mode 100644 index 0000000..0c70149 --- /dev/null +++ b/archive/go.sum @@ -0,0 +1,15 @@ +github.com/allegro/bigcache/v3 v3.0.2 h1:AKZCw+5eAaVyNTBmI2fgyPVJhHkdWder3O9IrprcQfI= +github.com/allegro/bigcache/v3 v3.0.2/go.mod h1:aPyh7jEvrog9zAwx5N7+JUQX5dZTSGpxF1LAR4dr35I= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/archive/go/atomic/atomic.go b/archive/go/atomic/atomic.go new file mode 100644 index 0000000..c00a530 --- /dev/null +++ b/archive/go/atomic/atomic.go @@ -0,0 +1,39 @@ +package main + +import ( + "sync" + "sync/atomic" + "time" +) + +func main() { + t := time.Now() + sum := int64(0) + for i := int64(0); i < 500000000; i++ { + sum += i + } + t1 := time.Now().Sub(t) + println(sum) + println(t1.String()) + //锁 + t = time.Now() + sum = 0 + var mutex sync.Mutex + for i := int64(0); i < 500000000; i++ { + mutex.Lock() + sum += i + mutex.Unlock() + } + t1 = time.Now().Sub(t) + println(sum) + println(t1.String()) + //原子操作 + t = time.Now() + sum = 0 + for i := int64(0); i < 500000000; i++ { + atomic.AddInt64(&sum, i) + } + t1 = time.Now().Sub(t) + println(sum) + println(t1.String()) +} diff --git a/archive/go/big-file-sign/main.go b/archive/go/big-file-sign/main.go new file mode 100644 index 0000000..f08de51 --- /dev/null +++ b/archive/go/big-file-sign/main.go @@ -0,0 +1,129 @@ +package main + +import ( + "bytes" + "crypto/md5" + "fmt" + "io" + "net/http" + "runtime" + + "github.com/gin-gonic/gin" +) + +func main() { + r := gin.Default() + /** + 1G 文件测试结果 + { + "md5": "23023b24fc0ab2d03d5cd62a18bb4aa8", + "mem": "96M", + "startMem": "1M" + } + 100M 文件测试结果 + { + "md5": "6ba2b5a1b62f356fc86efad690613916", + "mem": "96M", + "startMem": "0M" + } + */ + r.GET("/hash1", func(c *gin.Context) { + fmt.Printf("%v", c.ContentType()) + m := runtime.MemStats{} + runtime.ReadMemStats(&m) + startM := m.Alloc / 1024 / 1024 + oldBody := c.Request.Body + defer oldBody.Close() + pr, pw := io.Pipe() + defer pw.Close() + defer pr.Close() + c.Request.Body = pr + hash := md5.New() + go func() { + _, err := io.Copy(io.MultiWriter(hash, pw), oldBody) + if err != nil { + fmt.Printf("io copy: %v", err) + } + }() + _, err := c.MultipartForm() + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + runtime.ReadMemStats(&m) + c.JSON(http.StatusOK, gin.H{ + "md5": fmt.Sprintf("%x", hash.Sum(nil)), + "startMem": fmt.Sprintf("%dM", startM), + "mem": fmt.Sprintf("%dM", m.Alloc/1024/1024), + }) + }) + + /** + 1G 文件测试结果 + { + "md5": "62da2c499cdb3fad927f881c134684b0", + "mem": "2922M", + "startMem": "1M" + } + 100M 文件测试结果 + { + "md5": "55a6849293d0847a48f856254aa910e2", + "mem": "341M", + "startMem": "1M" + } + */ + r.GET("/hash2", func(c *gin.Context) { + m := runtime.MemStats{} + runtime.ReadMemStats(&m) + startM := m.Alloc / 1024 / 1024 + oldBody := c.Request.Body + defer oldBody.Close() + buffer := bytes.NewBuffer(nil) + hash := md5.New() + _, err := io.Copy(io.MultiWriter(buffer, hash), oldBody) + if err != nil { + fmt.Printf("io copy2: %v", err) + } + c.Request.Body = io.NopCloser(buffer) + _, err = c.MultipartForm() + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + runtime.ReadMemStats(&m) + c.JSON(http.StatusOK, gin.H{ + "md5": fmt.Sprintf("%x", hash.Sum(nil)), + "startMem": fmt.Sprintf("%dM", startM), + "mem": fmt.Sprintf("%dM", m.Alloc/1024/1024), + }) + }) + + /** + 1G 文件测试结果 + { + "mem": "96M", + "startMem": "1M" + } + 100M 文件测试结果 + { + "mem": "96M", + "startMem": "1M" + } + */ + r.GET("/hash3", func(c *gin.Context) { + m := runtime.MemStats{} + runtime.ReadMemStats(&m) + startM := m.Alloc / 1024 / 1024 + _, err := c.MultipartForm() + if err != nil { + c.AbortWithError(http.StatusInternalServerError, err) + return + } + runtime.ReadMemStats(&m) + c.JSON(http.StatusOK, gin.H{ + "startMem": fmt.Sprintf("%dM", startM), + "mem": fmt.Sprintf("%dM", m.Alloc/1024/1024), + }) + }) + r.Run(":8088") +} diff --git a/archive/go/cache/cache.go b/archive/go/cache/cache.go new file mode 100644 index 0000000..7c1a330 --- /dev/null +++ b/archive/go/cache/cache.go @@ -0,0 +1,278 @@ +package main + +import ( + "sort" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" +) + +type Cache interface { + SetMaxMemory(size string) bool + Set(key string, val interface{}, expire time.Duration) + Get(key string) (interface{}, bool) + Del(key string) bool + Exists(key string) bool + Flush() bool + Keys() int64 +} + +type cache struct { + maxMemory int64 + memory int64 + // 过期使用惰性删除,num实际上可能不准确 + num int64 + capacity int64 + + rehashs struct { + sync.Mutex + enable int32 + index int + } + + hashtable [2]*hashtable + + // 淘汰池 + evictionPool struct { + sync.Mutex + e []*entry + } +} + +func NewCache() Cache { + return newCache(1024) +} + +func newCache(cap int64) *cache { + c := &cache{ + capacity: cap, + hashtable: [2]*hashtable{newHashtable(cap)}, + evictionPool: struct { + sync.Mutex + e []*entry + }{e: make([]*entry, 0, 20)}, + rehashs: struct { + sync.Mutex + enable int32 + index int + }{enable: 0, index: 0}, + } + c.SetMaxMemory("1GB") + return c +} + +func (c *cache) SetMaxMemory(size string) bool { + if len(size) < 3 { + return false + } + num := size[:len(size)-2] + unit := size[len(size)-2:] + maxMemory, err := strconv.ParseInt(num, 10, 64) + if err != nil { + return false + } + if maxMemory == 0 { + return false + } + switch strings.ToUpper(unit) { + case "KB": + c.maxMemory = maxMemory << 10 + case "MB": + c.maxMemory = maxMemory << 20 + case "GB": + c.maxMemory = maxMemory << 30 + default: + return false + } + return true +} + +func (c *cache) Set(key string, val interface{}, expire time.Duration) { + c.rehashs.Lock() + defer c.rehashs.Unlock() + if c.rehashs.enable == 0 { + if float64(c.num)/float64(c.capacity) > 0.75 { + // 扩容一倍,渐进式rehash + atomic.AddInt64(&c.capacity, c.capacity) + c.hashtable[1] = newHashtable(c.capacity) + atomic.StoreInt32(&c.rehashs.enable, 1) + c.hashtable[1].Set(key, val, expire) + } else { + c.hashtable[0].Set(key, val, expire) + } + } else { + if c.rehashs.enable == 0 { + c.Set(key, val, expire) + return + } + c.hashtable[1].Set(key, val, expire) + c.rehash() + } + atomic.AddInt64(&c.num, 1) + atomic.AddInt64(&c.memory, int64(sizeof(val))) + for c.memory > c.maxMemory && c.num > 1 { + //清理内存 + c.lru() + if len(c.evictionPool.e) == 0 { + break + } + } +} + +func (c *cache) rehash() { + // rehash的时候使用锁 + e, comple := c.hashtable[0].index(c.rehashs.index) + if comple { + //完成 + c.hashtable[0], c.hashtable[1] = c.hashtable[1], nil + c.rehashs.enable = 0 + c.rehashs.index = 0 + return + } + c.rehashs.index++ + if e == nil { + c.rehash() + return + } + for e != nil { + if e.expired() { + // 过期删除,但是这里没有对实际内存删除 + atomic.AddInt64(&c.num, -1) + atomic.AddInt64(&c.memory, -int64(sizeof(e.value))) + } else { + c.hashtable[1].SetExpireTime(e.key, e.value, e.expireTime) + } + e, e.next = e.next, nil + } +} + +// 近似lru清理内存 +func (c *cache) lru() { + c.evictionPool.Lock() + defer c.evictionPool.Unlock() + if c.rehashs.enable == 0 { + // 取样20个 + if len(c.evictionPool.e) <= 15 { + m := make(map[string]struct{}) + for _, v := range c.evictionPool.e { + m[v.key] = struct{}{} + } + e := c.hashtable[0].random(5, -1) + for _, v := range e { + if _, ok := m[v.key]; ok { + continue + } + c.evictionPool.e = append(c.evictionPool.e, v) + } + sort.Slice(c.evictionPool.e, func(i, j int) bool { + return c.evictionPool.e[i].operateTime.Before(c.evictionPool.e[j].operateTime) + }) + } + e := c.evictionPool.e[0] + c.Del(e.key) + c.evictionPool.e = c.evictionPool.e[1:] + if len(c.evictionPool.e) == 0 { + return + } + } else { + // TODO: 扩容中进行 + // 好像有点麻烦,需要根据rehash的进度,从未rehash的地方进行取样,这样就得加锁,为了get读等其它的性能又不想加锁 + // 或者只有set操作的时候才进行清理,(set加了一个rehash锁) + } +} + +func (c *cache) Get(key string) (interface{}, bool) { + if c.rehashs.enable == 0 { + val, err := c.hashtable[0].Get(key) + if err != nil { + if err == ExpiredErr { + // 过期删除 + atomic.AddInt64(&c.num, -1) + atomic.AddInt64(&c.memory, -int64(sizeof(val))) + } + return nil, false + } + return val, true + } else { + c.rehashs.Lock() + defer c.rehashs.Unlock() + if c.rehashs.enable == 0 { + return c.Get(key) + } + // rehash中 先从1中查,未查到再从0查 + val, err := c.hashtable[1].Get(key) + if err != nil { + if err == ExpiredErr { + // 过期删除 + atomic.AddInt64(&c.num, -1) + atomic.AddInt64(&c.memory, -int64(sizeof(val))) + return nil, false + } + val, err = c.hashtable[0].Get(key) + if err != nil { + if err == ExpiredErr { + // 过期删除 + atomic.AddInt64(&c.num, -1) + atomic.AddInt64(&c.memory, -int64(sizeof(val))) + } + return nil, false + } + } + c.rehash() + return val, true + } +} + +func (c *cache) Del(key string) bool { + if c.rehashs.enable == 0 { + val, ok := c.hashtable[0].Del(key) + if !ok { + return false + } + atomic.AddInt64(&c.memory, -int64(sizeof(val))) + atomic.AddInt64(&c.num, -1) + return true + } else { + // rehash中 + c.rehashs.Lock() + defer c.rehashs.Unlock() + if c.rehashs.enable == 0 { + return c.Del(key) + } + val, ok := c.hashtable[0].Del(key) + if !ok { + val, ok = c.hashtable[1].Del(key) + if !ok { + return false + } + } + atomic.AddInt64(&c.memory, -int64(sizeof(val))) + atomic.AddInt64(&c.num, -1) + return true + } +} + +func (c *cache) Exists(key string) bool { + _, ok := c.Get(key) + return ok +} + +func (c *cache) Flush() bool { + if c.rehashs.enable == 0 { + c.hashtable[0].flush(&c.memory, &c.num) + } else { + // rehash中 + c.rehashs.Lock() + defer c.rehashs.Unlock() + c.hashtable[0].flush(&c.memory, &c.num) + c.hashtable[1].flush(&c.memory, &c.num) + } + return true +} + +// Keys 过期使用惰性删除,keys可能并不准确 +func (c *cache) Keys() int64 { + return c.num +} diff --git a/archive/go/cache/cache_bench_test.go b/archive/go/cache/cache_bench_test.go new file mode 100644 index 0000000..049c20e --- /dev/null +++ b/archive/go/cache/cache_bench_test.go @@ -0,0 +1,60 @@ +package main + +import ( + "strconv" + "testing" + "time" + + "github.com/allegro/bigcache/v3" +) + +func BenchmarkMapSet(b *testing.B) { + m := make(map[string]int, b.N) + for i := 0; i < b.N; i++ { + m[strconv.Itoa(i)] = i + } +} + +func BenchmarkMapGetSet(b *testing.B) { + m := make(map[string]int, b.N) + for i := 0; i < 1000; i++ { + m[strconv.Itoa(i)] = i + } + for i := 0; i < b.N; i++ { + _, _ = m[strconv.Itoa(i%1000)] + } +} + +func BenchmarkCacheSet(b *testing.B) { + cache := NewCache() + for i := 0; i < b.N; i++ { + cache.Set(strconv.Itoa(i), i, 0) + } +} + +func BenchmarkCacheSetGet(b *testing.B) { + cache := NewCache() + for i := 0; i < 1000; i++ { + cache.Set(strconv.Itoa(i), i, 0) + } + for i := 0; i < b.N; i++ { + cache.Get(strconv.Itoa(i % 1000)) + } +} + +func BenchmarkBigCacheSet(b *testing.B) { + cache, _ := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute)) + for i := 0; i < b.N; i++ { + cache.Set(strconv.Itoa(i), []byte(strconv.Itoa(i))) + } +} + +func BenchmarkBigCacheSetGet(b *testing.B) { + cache, _ := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute)) + for i := 0; i < 1000; i++ { + cache.Set(strconv.Itoa(i), []byte(strconv.Itoa(i))) + } + for i := 0; i < b.N; i++ { + cache.Get(strconv.Itoa(i % 1000)) + } +} diff --git a/archive/go/cache/cache_test.go b/archive/go/cache/cache_test.go new file mode 100644 index 0000000..402f32b --- /dev/null +++ b/archive/go/cache/cache_test.go @@ -0,0 +1,217 @@ +package main + +import ( + "fmt" + "sync" + "sync/atomic" + "testing" + "time" +) +import "github.com/stretchr/testify/assert" + +func Test_cache_SetMaxMemory(t *testing.T) { + tests := []struct { + name string + args string + maxMemory int64 + want bool + }{ + {"case1", "1KB", 1024, true}, + {"case2", "1MB", 1024 * 1024, true}, + {"case3", "1GB", 1024 * 1024 * 1024, true}, + {"case4", "10G", 0, false}, + {"case5", "0", 0, false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &cache{} + if got := c.SetMaxMemory(tt.args); got != tt.want || c.maxMemory != tt.maxMemory { + t.Errorf("SetMaxMemory() = %v,maxMemory = %v, want %v,%v", got, c.maxMemory, tt.want, tt.maxMemory) + } + }) + } +} + +func TestCache(t *testing.T) { + cache := newCache(1024) + cache.SetMaxMemory("100MB") + assert.Equal(t, int64(1024*1024*100), cache.maxMemory) + cache.Set("int", 1, 0) + assert.Equal(t, int64(8), cache.memory) + v, ok := cache.Get("int") + assert.True(t, ok) + assert.Equal(t, 1, v) + cache.Del("int") + _, ok = cache.Get("int") + assert.False(t, ok) + + cache.Set("str", "ok", time.Microsecond) + v, ok = cache.Get("str") + assert.True(t, ok) + assert.Equal(t, "ok", v) + assert.Equal(t, int64(1), cache.Keys()) + time.Sleep(time.Microsecond) + assert.Equal(t, int64(1), cache.Keys()) + assert.Equal(t, int64(16), cache.memory) + + v, ok = cache.Get("str") + assert.False(t, ok) + assert.Equal(t, int64(0), cache.Keys()) + assert.Equal(t, int64(0), cache.memory) + + cache.Flush() + cache.Keys() +} + +func TestClean(t *testing.T) { + cache := newCache(1024) + cache.SetMaxMemory("1KB") + cache.Set("test1", 1, 0) + cache.Set("test2", 10, 0) + cache.Set("test3", 100, 0) + cache.Set("test4", 1000, 0) + + time.Sleep(time.Microsecond) + cache.Set("bigkey", [1024]int{0}, 0) + assert.Equal(t, int64(1), cache.Keys()) + + _, ok := cache.Get("test1") + assert.False(t, ok) + v, ok := cache.Get("bigkey") + assert.Equal(t, [1024]int{0}, v) + assert.True(t, ok) + + time.Sleep(time.Microsecond) + cache.Set("test1", 1, 0) + cache.Set("test2", 10, 0) + cache.Set("test3", 100, 0) + assert.Equal(t, int64(3), cache.Keys()) + + v, ok = cache.Get("test3") + assert.True(t, ok) + assert.Equal(t, 100, v) + v, ok = cache.Get("bigkey") + assert.False(t, ok) + assert.Nil(t, v) + +} + +// 测试扩容 +func TestExpansion(t *testing.T) { + cache := newCache(1024) + cache.SetMaxMemory("1GB") + for i := 0; i < 10000; i++ { + cache.Set(fmt.Sprintf("%d", i), i, 0) + } + for i := 0; i < 10000; i++ { + v, ok := cache.Get(fmt.Sprintf("%d", i)) + assert.True(t, ok) + assert.Equal(t, i, v) + } + assert.Equal(t, int64(80000), cache.memory) + assert.Equal(t, int64(10000), cache.num) + cache.Flush() + assert.Equal(t, int64(0), cache.memory) + assert.Equal(t, int64(0), cache.num) +} + +// 并发读写测试 +func TestSetGet(t *testing.T) { + var rn int64 + maxNum := int64(100000) + cache := newCache(1024) + cache.SetMaxMemory("1GB") + var n int64 = -1 + wg := sync.WaitGroup{} + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + i := atomic.AddInt64(&n, 1) + if i > maxNum { + break + } + cache.Set(fmt.Sprintf("%d", i), i, 0) + } + }() + } + wg.Wait() + n = -1 + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + i := atomic.AddInt64(&n, 1) + if i > maxNum { + break + } + v, ok := cache.Get(fmt.Sprintf("%d", i)) + assert.True(t, ok) + assert.Equal(t, i, v) + atomic.AddInt64(&rn, 1) + } + }() + } + wg.Wait() + assert.Equal(t, maxNum+1, rn) + rn = 0 + cache.Flush() + assert.Equal(t, int64(0), cache.memory) + assert.Equal(t, int64(0), cache.num) + // Flush 不会缩容,另外新建一个测试 + cache = newCache(1024) + cache.SetMaxMemory("1GB") + // 一边写 一边读 + c := make(chan int64, 100) + n = -1 + wwg := sync.WaitGroup{} + for i := 0; i < 100; i++ { + wwg.Add(1) + go func() { + defer wwg.Done() + for { + i := atomic.AddInt64(&n, 1) + if i > maxNum { + break + } + cache.Set(fmt.Sprintf("%d", i), i, 0) + c <- i + } + }() + } + go func() { + wwg.Wait() + close(c) + }() + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + i, ok := <-c + if !ok { + break + } + v, ok := cache.Get(fmt.Sprintf("%d", i)) + assert.True(t, ok) + atomic.AddInt64(&rn, 1) + assert.Equal(t, i, v) + } + }() + } + wg.Wait() + assert.Equal(t, maxNum+1, rn) +} + +// 测试清理 +func TestLru(t *testing.T) { + cache := newCache(2048) + cache.SetMaxMemory("1KB") + for i := 0; i < 100; i++ { + cache.Set(fmt.Sprintf("%d", i), [...]int{1, 2, 3, 4, 5, 6, 7, 8}, 0) + assert.True(t, cache.memory <= cache.maxMemory) + } + +} diff --git a/archive/go/cache/hashtable.go b/archive/go/cache/hashtable.go new file mode 100644 index 0000000..afce6fe --- /dev/null +++ b/archive/go/cache/hashtable.go @@ -0,0 +1,283 @@ +package main + +import ( + "errors" + "hash/fnv" + "math/rand" + "sync" + "sync/atomic" + "time" +) + +type entry struct { + key string + value interface{} + expireTime time.Time + operateTime time.Time + next *entry +} + +var ExpiredErr = errors.New("key过期") + +func (v *entry) expired() bool { + return time.Now().After(v.expireTime) +} + +// 过期也会返回value,用于计算内存占用大小 +func (v *entry) val() (interface{}, error) { + if !v.expired() { + return v.value, nil + } + return v.value, ExpiredErr +} + +// 拉链法实现hashtable +type hashtable struct { + //maxMemory int64 + //memory int64 + // + //cap int64 + //num int64 + + // 分段锁提高性能 + bucket []*bucket +} + +func newHashtable(cap int64) *hashtable { + ht := &hashtable{ + //maxMemory: maxMemory, memory: memory, cap: cap, num: num, + bucket: make([]*bucket, 0, cap/1024), + } + for i := int64(0); i < (cap / 1024); i++ { + ht.bucket = append(ht.bucket, &bucket{}) + } + return ht +} + +// 计算key 返回桶位置和数组位置 +func (h *hashtable) hash(key string) (int, int) { + hash := fnv.New64() + hash.Write([]byte(key)) + nk := int(hash.Sum64()) + if nk < 0 { + nk = -nk + } + return nk % len(h.bucket), nk % 1024 +} + +func (h *hashtable) Get(key string) (interface{}, error) { + b, n := h.hash(key) + return h.bucket[b].get(key, n) +} + +func (h *hashtable) Set(key string, val interface{}, expire time.Duration) { + b, n := h.hash(key) + h.bucket[b].set(key, n, val, expire) +} + +func (h *hashtable) SetExpireTime(key string, val interface{}, expireTime time.Time) { + b, n := h.hash(key) + h.bucket[b].setExpireTime(key, n, val, expireTime) +} + +func (h *hashtable) Del(key string) (interface{}, bool) { + b, n := h.hash(key) + val, ok := h.bucket[b].del(key, n) + return val, ok +} + +// flush 不在hashtab层加锁,循环桶清空 +func (h *hashtable) flush(mem, num *int64) { + for _, v := range h.bucket { + v.flush(mem, num) + } +} + +func (h *hashtable) index(index int) (*entry, bool) { + b, n := index/1024, index%1024 + if index >= len(h.bucket)*1024 { + return nil, true + } + return h.bucket[b].getAndDel(n), false +} + +//从某个位置开始随机取值,-1为随机所有key +func (h *hashtable) random(count, start int) []*entry { + if start == -1 { + start = rand.Intn(len(h.bucket) * 1024) + } + startBucket := start / 1024 + randomBucket := startBucket + rand.Intn(len(h.bucket)-startBucket) + startIndex := 0 + if randomBucket == startBucket { + startIndex = start % 1024 + startIndex = startIndex + rand.Intn(1024-startIndex) + } else { + startBucket = randomBucket + startIndex = rand.Intn(1024) + } + ret := make([]*entry, 0, count) + for i := 0; i < 1024; i++ { + var e *entry + if startIndex+i >= 1024 { + // 跨过桶了 + b := h.bucket[(startBucket+1)%len(h.bucket)] + e = b.index((startIndex + i) % 1024) + } else { + e = h.bucket[startBucket].index(startIndex + i) + } + if e == nil { + continue + } + for { + ret = append(ret, e) + if e.next == nil || len(ret) >= count { + break + } + e = e.next + } + if len(ret) >= count { + break + } + } + return ret +} + +type bucket struct { + sync.RWMutex + kv [1024]*entry + // 桶内也对内存 num进行统计,另外一个优化思路,定时对桶内的内存和数量进行统计 然后进行内存释放和扩容 + mem int64 + num int64 +} + +// 清理,对总的内存和数量进行计算 +func (b *bucket) flush(mem, num *int64) { + b.Lock() + defer b.Unlock() + b.kv = [1024]*entry{} + atomic.AddInt64(mem, -b.mem) + atomic.AddInt64(num, -b.num) + b.mem = 0 + b.num = 0 +} + +func (b *bucket) getAndDel(n int) (v *entry) { + b.Lock() + defer b.Unlock() + v, b.kv[n] = b.kv[n], nil + return +} + +// 获取指针 +func (b *bucket) getP(key string, n int) (*entry, *entry) { + v := b.kv[n] + prev := v + for v != nil { + if v.key == key { + return v, prev + } + prev = v + v = v.next + } + return nil, nil +} + +func (b *bucket) index(n int) *entry { + b.RLock() + defer b.RUnlock() + return b.kv[n] +} + +func (b *bucket) get(key string, n int) (interface{}, error) { + b.RLock() + v, prev := b.getP(key, n) + if v == nil { + b.RUnlock() + return nil, errors.New("key不存在") + } + val, err := v.val() + if err != nil { + b.RUnlock() + b.Lock() + defer b.Unlock() + b.mem -= int64(sizeof(val)) + b.num-- + // 过期删除 + if prev == v { + b.kv[n] = nil + } else { + prev.next = v.next + } + return val, err + } + v.operateTime = time.Now() + b.RUnlock() + return val, nil +} + +func (b *bucket) setExpireTime(key string, n int, val interface{}, expireTime time.Time) { + b.Lock() + defer b.Unlock() + v := b.kv[n] + b.mem += int64(sizeof(val)) + b.num++ + if v == nil { + b.kv[n] = &entry{ + key: key, + value: val, + expireTime: expireTime, + operateTime: time.Now(), + next: nil, + } + return + } + for v != nil { + if v.key == key { + v.value = val + v.expireTime = expireTime + v.operateTime = time.Now() + return + } + if v.next == nil { + break + } + v = v.next + } + v.next = &entry{ + key: key, + value: val, + expireTime: expireTime, + operateTime: time.Now(), + next: nil, + } +} + +func (b *bucket) set(key string, n int, val interface{}, expire time.Duration) { + expireTime := time.Now() + if expire == 0 { + // 直接设置一个超大的时间 + expireTime = expireTime.Add(time.Hour * 24 * 365 * 10) + } else { + expireTime = expireTime.Add(expire) + } + b.setExpireTime(key, n, val, expireTime) +} + +// 删除并返回删除的值 +func (b *bucket) del(key string, n int) (interface{}, bool) { + b.Lock() + defer b.Unlock() + v, prev := b.getP(key, n) + if v == nil { + return nil, false + } + b.mem -= int64(sizeof(v.value)) + b.num-- + if prev == v { + b.kv[n] = nil + } else { + prev.next = v.next + } + return v.value, true +} diff --git a/archive/go/cache/main.go b/archive/go/cache/main.go new file mode 100644 index 0000000..517d0a8 --- /dev/null +++ b/archive/go/cache/main.go @@ -0,0 +1,13 @@ +package main + +func main() { + cache := NewCache() + cache.SetMaxMemory("100MB") + cache.Set("int", 1, 0) + cache.Set("bool", false, 0) + cache.Set("data", map[string]interface{}{"a": 1}, 0) + cache.Get("int") + cache.Del("int") + cache.Flush() + cache.Keys() +} diff --git a/archive/go/cache/simple.go b/archive/go/cache/simple.go new file mode 100644 index 0000000..5fa7d21 --- /dev/null +++ b/archive/go/cache/simple.go @@ -0,0 +1,310 @@ +package main + +import ( + "hash/fnv" + "strconv" + "strings" + "sync" + "time" +) + +type lru struct { + prev *lru + next *lru + key string +} + +type simpleCache struct { + sync.Mutex + + maxMemory int + memory int + + hashtable []*entry + + lruhead, lrutail *lru + lruHash map[string]*lru + + num int + cap int +} + +func NewSimpleCache() Cache { + return newSimpleCache() +} + +func newSimpleCache() *simpleCache { + c := &simpleCache{ + hashtable: make([]*entry, 1024), + cap: 1024, + lruhead: &lru{}, + lrutail: &lru{}, + lruHash: map[string]*lru{}, + } + c.lruhead.next = c.lrutail + c.lrutail.prev = c.lruhead + go func() { + // 扫描过期 + for { + time.Sleep(time.Minute) + c.Lock() + for n, p := range c.hashtable { + prev := p + for p != nil { + if p.expired() { + if p == c.hashtable[n] { + c.hashtable[n] = p.next + } else { + prev.next = p.next + } + c.num-- + c.memory -= sizeof(p.value) + } + prev = p + p = p.next + } + } + c.Unlock() + } + }() + return c +} + +func (c *simpleCache) SetMaxMemory(size string) bool { + if len(size) < 3 { + return false + } + num := size[:len(size)-2] + unit := size[len(size)-2:] + maxMemory, err := strconv.Atoi(num) + if err != nil { + return false + } + if maxMemory == 0 { + return false + } + switch strings.ToUpper(unit) { + case "KB": + c.maxMemory = maxMemory << 10 + case "MB": + c.maxMemory = maxMemory << 20 + case "GB": + c.maxMemory = maxMemory << 30 + default: + return false + } + return true +} + +func (c *simpleCache) hash(key string) int { + hash := fnv.New64() + hash.Write([]byte(key)) + nk := int(hash.Sum64()) + if nk < 0 { + nk = -nk + } + return nk % c.cap +} + +func (c *simpleCache) rehashkey(cap int, key string) int { + hash := fnv.New64() + hash.Write([]byte(key)) + nk := int(hash.Sum64()) + if nk < 0 { + nk = -nk + } + return nk % cap +} + +func (c *simpleCache) rehash() { + //扩容 + newCap := c.cap * 2 + tmpHashtable := make([]*entry, newCap) + for _, p := range c.hashtable { + for p != nil { + n := c.rehashkey(newCap, p.key) + nv := tmpHashtable[n] + nk := &entry{ + key: p.key, + value: p.value, + expireTime: p.expireTime, + operateTime: p.operateTime, + next: nil, + } + if nv == nil { + tmpHashtable[n] = nk + } else { + for nv.next != nil { + nv = nv.next + } + nv.next = nk + } + p = p.next + } + } + c.cap = newCap + c.hashtable = tmpHashtable +} + +func (c *simpleCache) Set(key string, val interface{}, expire time.Duration) { + c.Lock() + defer c.Unlock() + defer c.lru(key) + + c.memory += sizeof(val) + + if float32(c.num)/float32(c.cap) > 0.75 { + c.rehash() + } + + n := c.hash(key) + expireTime := time.Now() + if expire == 0 { + // 设置一个很大的时间 + expireTime = expireTime.Add(time.Hour * 24 * 365 * 10) + } else { + expireTime = expireTime.Add(expire) + } + p := c.hashtable[n] + e := &entry{ + key: key, + value: val, + expireTime: expireTime, + next: nil, + } + if p == nil { + c.hashtable[n] = e + c.num++ + return + } + prev := p + for p != nil { + if p.key == key { + p.value = val + p.expireTime = expireTime + return + } + prev = p + p = p.next + } + prev.next = e + c.num++ +} + +func (c *simpleCache) lru(key string) { + l := c.lruHash[key] + if l == nil { + // 插入头 + nl := &lru{prev: c.lruhead, next: c.lruhead.next, key: key} + c.lruhead.next.prev = nl + c.lruhead.next = nl + c.lruHash[key] = nl + } else { + // 移动到头 + l.prev.next = l.next + l.next.prev = l.prev + l.prev = c.lruhead + l.next = c.lruhead.next + c.lruhead.next.prev = l + c.lruhead.next = l + } + // 清理内存 + for c.memory > c.maxMemory && c.num > 1 { + if c.lrutail.prev == c.lruhead { + return + } + rmk := c.lrutail.prev + c.lrutail.prev.next = c.lrutail + c.lrutail.prev = c.lrutail.prev.prev + c.del(rmk.key) + } +} + +func (c *simpleCache) delLru(key string) { + l := c.lruHash[key] + if l != nil { + l.prev.next = l.next + l.next.prev = l.prev + delete(c.lruHash, key) + } +} + +func (c *simpleCache) Get(key string) (interface{}, bool) { + c.Lock() + defer c.Unlock() + n := c.hash(key) + p := c.hashtable[n] + prev := p + for p != nil { + if p.key == key { + // 过期删除 + if p.expired() { + c.delLru(key) + if c.hashtable[n] == p { + c.hashtable[n] = p.next + } else { + prev.next = p.next + } + c.num-- + c.memory -= sizeof(p.value) + return nil, false + } + c.lru(key) + return p.value, true + } + prev = p + p = p.next + } + return nil, false +} + +func (c *simpleCache) Del(key string) bool { + c.Lock() + defer c.Unlock() + return c.del(key) +} + +func (c *simpleCache) del(key string) bool { + n := c.hash(key) + p := c.hashtable[n] + prev := p + for p != nil { + if p.key == key { + c.delLru(key) + if c.hashtable[n] == p { + c.hashtable[n] = p.next + } else { + prev.next = p.next + } + c.num-- + c.memory -= sizeof(p.value) + return true + } + prev = p + p = p.next + } + return false +} + +func (c *simpleCache) Exists(key string) bool { + _, ok := c.Get(key) + return ok +} + +func (c *simpleCache) Flush() bool { + c.Lock() + defer c.Unlock() + c.num = 0 + c.memory = 0 + c.hashtable = make([]*entry, c.cap) + c.lruhead = &lru{} + c.lrutail = &lru{} + c.lruHash = map[string]*lru{} + c.lruhead.next = c.lrutail + c.lrutail.prev = c.lruhead + return true +} + +func (c *simpleCache) Keys() int64 { + return int64(c.num) +} diff --git a/archive/go/cache/simple_test.go b/archive/go/cache/simple_test.go new file mode 100644 index 0000000..910df91 --- /dev/null +++ b/archive/go/cache/simple_test.go @@ -0,0 +1,213 @@ +package main + +import ( + "fmt" + "sync" + "sync/atomic" + "testing" + "time" +) +import "github.com/stretchr/testify/assert" + +func TestSimple_cache_SetMaxMemory(t *testing.T) { + tests := []struct { + name string + args string + maxMemory int + want bool + }{ + {"case1", "1KB", 1024, true}, + {"case2", "1MB", 1024 * 1024, true}, + {"case3", "1GB", 1024 * 1024 * 1024, true}, + {"case4", "10G", 0, false}, + {"case5", "0", 0, false}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := newSimpleCache() + if got := c.SetMaxMemory(tt.args); got != tt.want || c.maxMemory != tt.maxMemory { + t.Errorf("SetMaxMemory() = %v,maxMemory = %v, want %v,%v", got, c.maxMemory, tt.want, tt.maxMemory) + } + }) + } +} + +func TestSimpleCache(t *testing.T) { + cache := newSimpleCache() + cache.SetMaxMemory("100MB") + assert.Equal(t, 1024*1024*100, cache.maxMemory) + cache.Set("int", 1, 0) + assert.Equal(t, 8, cache.memory) + v, ok := cache.Get("int") + assert.True(t, ok) + assert.Equal(t, 1, v) + cache.Del("int") + _, ok = cache.Get("int") + assert.False(t, ok) + + cache.Set("str", "ok", time.Microsecond) + v, ok = cache.Get("str") + assert.True(t, ok) + assert.Equal(t, "ok", v) + assert.Equal(t, int64(1), cache.Keys()) + time.Sleep(time.Microsecond) + assert.Equal(t, int64(1), cache.Keys()) + assert.Equal(t, 16, cache.memory) + + v, ok = cache.Get("str") + assert.False(t, ok) + assert.Equal(t, int64(0), cache.Keys()) + assert.Equal(t, 0, cache.memory) + + cache.Flush() + cache.Keys() +} + +func TestSimpleClean(t *testing.T) { + cache := newSimpleCache() + cache.SetMaxMemory("1KB") + cache.Set("test1", 1, 0) + cache.Set("test2", 10, 0) + cache.Set("test3", 100, 0) + cache.Set("test4", 1000, 0) + + cache.Set("bigkey", [1024]int{0}, 0) + assert.Equal(t, int64(1), cache.Keys()) + _, ok := cache.Get("test1") + assert.False(t, ok) + v, ok := cache.Get("bigkey") + assert.Equal(t, [1024]int{0}, v) + assert.True(t, ok) + + cache.Set("test1", 1, 0) + cache.Set("test2", 10, 0) + cache.Set("test3", 100, 0) + assert.Equal(t, int64(3), cache.Keys()) + + v, ok = cache.Get("test3") + assert.True(t, ok) + assert.Equal(t, 100, v) + v, ok = cache.Get("bigkey") + assert.False(t, ok) + assert.Nil(t, v) + +} + +// 测试扩容 +func TestSimpleExpansion(t *testing.T) { + cache := newSimpleCache() + cache.SetMaxMemory("1GB") + for i := 0; i < 10000; i++ { + cache.Set(fmt.Sprintf("%d", i), i, 0) + } + for i := 0; i < 10000; i++ { + v, ok := cache.Get(fmt.Sprintf("%d", i)) + assert.True(t, ok) + assert.Equal(t, i, v) + } + assert.Equal(t, 80000, cache.memory) + assert.Equal(t, 10000, cache.num) + cache.Flush() + assert.Equal(t, 0, cache.memory) + assert.Equal(t, 0, cache.num) +} + +// 并发读写测试 +func TestSimpleSetGet(t *testing.T) { + var rn int64 + maxNum := int64(100000) + cache := newSimpleCache() + cache.SetMaxMemory("1GB") + var n int64 = -1 + wg := sync.WaitGroup{} + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + i := atomic.AddInt64(&n, 1) + if i > maxNum { + break + } + cache.Set(fmt.Sprintf("%d", i), i, 0) + } + }() + } + wg.Wait() + n = -1 + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + i := atomic.AddInt64(&n, 1) + if i > maxNum { + break + } + v, ok := cache.Get(fmt.Sprintf("%d", i)) + assert.True(t, ok) + assert.Equal(t, i, v) + atomic.AddInt64(&rn, 1) + } + }() + } + wg.Wait() + assert.Equal(t, maxNum+1, rn) + rn = 0 + cache.Flush() + assert.Equal(t, 0, cache.memory) + assert.Equal(t, 0, cache.num) + // Flush 不会缩容,另外新建一个测试 + cache = newSimpleCache() + cache.SetMaxMemory("1GB") + // 一边写 一边读 + c := make(chan int64, 100) + n = -1 + wwg := sync.WaitGroup{} + for i := 0; i < 100; i++ { + wwg.Add(1) + go func() { + defer wwg.Done() + for { + i := atomic.AddInt64(&n, 1) + if i > maxNum { + break + } + cache.Set(fmt.Sprintf("%d", i), i, 0) + c <- i + } + }() + } + go func() { + wwg.Wait() + close(c) + }() + for i := 0; i < 100; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for { + i, ok := <-c + if !ok { + break + } + v, ok := cache.Get(fmt.Sprintf("%d", i)) + assert.True(t, ok) + atomic.AddInt64(&rn, 1) + assert.Equal(t, i, v) + } + }() + } + wg.Wait() + assert.Equal(t, maxNum+1, rn) +} + +// 测试清理 +func TestSimpleLru(t *testing.T) { + cache := newSimpleCache() + cache.SetMaxMemory("1KB") + for i := 0; i < 100; i++ { + cache.Set(fmt.Sprintf("%d", i), [...]int{1, 2, 3, 4, 5, 6, 7, 8}, 0) + assert.True(t, cache.memory <= cache.maxMemory) + } +} diff --git a/archive/go/cache/utils.go b/archive/go/cache/utils.go new file mode 100644 index 0000000..af2dbf2 --- /dev/null +++ b/archive/go/cache/utils.go @@ -0,0 +1,8 @@ +package main + +import "reflect" + +// 简单的计算了,对于指针、切片等有问题 +func sizeof(v interface{}) int { + return int(reflect.TypeOf(v).Size()) +} diff --git a/archive/go/class/class.go b/archive/go/class/class.go new file mode 100644 index 0000000..f3f1482 --- /dev/null +++ b/archive/go/class/class.go @@ -0,0 +1,36 @@ +package main + +import "fmt" + +type IA interface { + FuncA() + FuncB() +} + +type A struct { + IA +} + +func (a *A) FuncA() { + fmt.Println("class a,func a") +} + +type B struct { +} + +func (b *B) FuncA() { + fmt.Println("class b,func a") +} + +func (b *B) FuncB() { + fmt.Println("class b,func b") +} + +func main() { + var a IA = new(A) + a.FuncA() + // a.FuncB() //报错的 + var a2 IA = &A{IA: new(B)} + a2.FuncA() + a2.FuncB() +} diff --git a/archive/go/goroutine.go b/archive/go/goroutine.go new file mode 100644 index 0000000..cac494f --- /dev/null +++ b/archive/go/goroutine.go @@ -0,0 +1,18 @@ +package main + +import ( + "fmt" + "runtime" +) + +func main() { + var tmp string + runtime.GOMAXPROCS(1) + for i := 0; i < 10; i++ { + go func() { + for { + } + }() + } + fmt.Scanln(&tmp) +} diff --git a/archive/go/goroutine.md b/archive/go/goroutine.md new file mode 100644 index 0000000..3f8d25b --- /dev/null +++ b/archive/go/goroutine.md @@ -0,0 +1,54 @@ +## Go Goroutine(协程) +> 原来对协程有一些了解,用C实现过一个辣鸡的协程.通过上下文的切换,将io堵塞的时间切换成到其它的协程继续运行,不让cpu歇息一下 + +go中运行协程通过`go`关键词就可以运行一个协程,非常简单 + +来看一个例子: +```go +func main() { + var tmp string + for i := 0; i < 10; i++ { + go func() { + for { + } + }() + } + fmt.Scanln(&tmp) +} +``` +可以直接跑满CPU(我的电脑是4核8线程) + +然后我改改 +```go +func main() { + var tmp string + for i := 0; i < 10; i++ { + go func(i int) { + for { + fmt.Println(i) + } + }(i) + } + fmt.Scanln(&tmp) +} +``` +我电脑的CPU降到了40%,这是因为当所有的协程都堵塞住了(打印数据),给了CPU喘息的机会,而且因为达到了输出的最大限制,增加协程也不会再增加CPU了(io瓶颈) + +再来一个例子,这里用了`runtime.GOMAXPROCS(1)`这个函数,它可以设置我们的协程运行指定个数的CPU核里面,这里只用了一个核 +```go +func main() { + var tmp string + runtime.GOMAXPROCS(1) + for i := 0; i < 10; i++ { + go func() { + for { + } + }() + } + fmt.Scanln(&tmp) +} +``` +然后CPU维持再18%左右,总CPU在20%左右,我想是另外的线程占用了剩余的CPU.(然后还有超频?反正我是猜的) + +在go1.14实现了抢占式的协程,上述协程可能会无法再往下执行 + diff --git a/archive/go/hot-restart/main.go b/archive/go/hot-restart/main.go new file mode 100644 index 0000000..67fe1fd --- /dev/null +++ b/archive/go/hot-restart/main.go @@ -0,0 +1,113 @@ +package main + +import ( + "context" + "flag" + "net" + "net/http" + "os" + "os/exec" + "os/signal" + "sync" + "syscall" + "time" +) + +// 一个停止的信号量 +var ( + isStop bool + lock sync.WaitGroup + server *http.Server + listener net.Listener + isReload bool +) + +func init() { + flag.BoolVar(&isReload, "reload", false, "") + flag.Parse() +} + +// 优雅停止中间件 +func GracefulStop(handel func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request) { + return func(writer http.ResponseWriter, request *http.Request) { + lock.Add(1) + if isStop { + //不再接收新的请求 + writer.WriteHeader(400) + writer.Write([]byte("server is stop")) + } else { + handel(writer, request) + } + lock.Done() + } +} + +// 一个会耗时很长的方法 +func LongTime(writer http.ResponseWriter, request *http.Request) { + time.Sleep(time.Second * 5) + writer.Write([]byte("Hello")) +} + +func Normal(writer http.ResponseWriter, request *http.Request) { + writer.Write([]byte("Hello")) +} + +func main() { + + http.HandleFunc("/normal", Normal) + http.HandleFunc("/long-time", GracefulStop(LongTime)) + + //监听信号 + go func() { + ch := make(chan os.Signal, 1) + signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM, syscall.SIGUSR1) + for { + sign := <-ch + ctx, _ := context.WithTimeout(context.Background(), 20*time.Second) + switch sign { + case syscall.SIGINT, syscall.SIGTERM: + { + println("stop...") + //停止 + isStop = true + lock.Wait() + //结束 + signal.Stop(ch) + server.Shutdown(ctx) + println("stop") + return + } + case syscall.SIGUSR1: + { + println("reload...") + //热重启 + tl, _ := listener.(*net.TCPListener) + f, _ := tl.File() + cmd := exec.Command(os.Args[0], "--reload") + cmd.Stdout = os.Stdout + cmd.Stdin = os.Stdin + cmd.Stderr = os.Stderr + cmd.ExtraFiles = []*os.File{f} + cmd.Start() + signal.Stop(ch) + server.Shutdown(ctx) + println("father stop") + return + } + } + } + }() + if isReload { + f := os.NewFile(3, "") + listener, _ = net.FileListener(f) + println("child start") + } else { + listener, _ = net.Listen("tcp", ":8080") + } + server = &http.Server{ + Addr: ":8080", + Handler: nil, + } + + server.Serve(listener) +} diff --git a/archive/go/hot-restart/readme.md b/archive/go/hot-restart/readme.md new file mode 100644 index 0000000..db38611 --- /dev/null +++ b/archive/go/hot-restart/readme.md @@ -0,0 +1,14 @@ +# 热重启 + +可以通过nginx来实现热重启 + +这里尝试使用fork的方式实现热重启 + +某些信号量需要linux才有 + +使用`kill pid ` + +# 优雅结束 +将请求处理完之后再结束 + + diff --git a/archive/go/interface.md b/archive/go/interface.md new file mode 100644 index 0000000..46e929c --- /dev/null +++ b/archive/go/interface.md @@ -0,0 +1,50 @@ +## GO Interface(接口) +> 记哪记得住啊,不如顺便水一点博客,忘记了还能过来翻翻 + +go的接口值是由两部分组成,被称为接口的动态类型和动态值 +动态类型部分储存着数据的类型,动态值部分储存着值. + +来点栗子 +```go +type If interface { + Demo() int +} +type S struct { + a int +} +func (s *S) Demo() int { + s.a++ + return s.a +} +``` +上面是额外的定义 + +```go +func TestInterface(t *testing.T) { + var i If + s := S{} + i = &s + i.Demo() + assert.Equal(t, s.a, 1) +} +``` +值得一提的是第四行`i=&s`,这是由于声明S的Demo方法时决定的,接收器类型为`*S`,那么只有是*S类型才会有Demo方法.如果去掉`&`将会报错. + +go中接口是可以判断相等的,相等的条件是,动态类型和动态值全部相等 +```go +func TestInterfaceEqual(t *testing.T) { + var i1, i2 If + s := S{a: 2} + assert.Equal(t, i1, i2) + i1 = &s + i2 = &s + assert.Equal(t, i1, i2) + var s2 *S + i1 = s2 + i2 = nil + t.Logf("s2:%v,i1 value:%v,i2 value:%v,i1 type:%T,i2 type:%T", + s2, i1, i2, i1, i2) + assert.NotEqual(t, i1, i2) +} +``` +例如上面的例子,最后一个,虽然s2,i1,i2的值输出都是nil,但是i1,i2的type不相等,所以i1和i2是不相等的 diff --git a/archive/go/interface_test.go b/archive/go/interface_test.go new file mode 100644 index 0000000..66e6620 --- /dev/null +++ b/archive/go/interface_test.go @@ -0,0 +1,42 @@ +package main + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type If interface { + Demo() int +} + +type S struct { + a int +} + +func (s *S) Demo() int { + s.a++ + return s.a +} +func TestInterface(t *testing.T) { + s := S{} + var i If + i = &s + i.Demo() + assert.Equal(t, s.a, 1) +} + +func TestInterfaceEqual(t *testing.T) { + var i1, i2 If + s := S{a: 2} + assert.Equal(t, i1, i2) + i1 = &s + i2 = &s + assert.Equal(t, i1, i2) + var s2 *S + i1 = s2 + i2 = nil + t.Logf("s2:%v,i1 value:%v,i2 value:%v,i1 type:%T,i2 type:%T", + s2, i1, i2, i1, i2) + assert.NotEqual(t, i1, i2) +} diff --git a/archive/go/readme.md b/archive/go/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/archive/go/slice.md b/archive/go/slice.md new file mode 100644 index 0000000..f6d8376 --- /dev/null +++ b/archive/go/slice.md @@ -0,0 +1,167 @@ +## GO Slice(切片) +> 感觉切片只要知道底层是引用的一个数组对象,就挺好理解了.这里写下一些笔记,方便记忆和以后再来查找. + +### 切片和数组 + +切片由三个部分组成:指针(指向底层数组),长度(当前切片使用的长度),容量(切片能包含多少个成员) + +然后还有一句和数组相关的:当调用一个函数的时候,函数的每个调用参数将会被赋值给函数内部的参数变量,所以函数参数变量接收的是一个复制的副本,并不是原始调用的变量。(所以数组作为参数,是低效的,还需要进行一次数组的拷贝,可以使用数组指针) + +然后如果我们想要传递给一个函数一个数组,函数需要对数组进行修改,我们必须使用数组指针(用return当然也不是不行啦🤨) + +但是切片就不需要,来个例子: +```go +func Test_Func(t *testing.T) { + var arr = [...]int{1, 2, 3} + var slice = []int{1, 2, 3} + ModifyArray(arr) + ModifySlice(slice) + t.Logf("%v %v\n", arr, slice) + assert.NotEqual(t, arr[2], 1) + assert.Equal(t, slice[2], 1) +} +func ModifyArray(arr [3]int) { + println(arr) + arr[2] = 1 +} +func ModifySlice(slice []int) { + println(slice) + slice[2] = 1 +} +``` +凭啥切片就行,大家明明都长得都差不多. +前面说了,切片是由三个部分组成,然后数组传入的是数组的副本.其实我觉得go里所有的类型传入的都是对应的副本,切片也是,指针也是的(值传递). + +那都是副本拷贝,那么咋切片可以修改? +`切片是由:数组指针,长度,容量组成的`,来划一下重点. +副本传的也是上面这些东西.然后修改切片的时候呢,实际上是通过切片里面的数组指针去修改了,并没有修改切片的值(数组指针,长度,容量). + +等看完下面再写另外一个情况,在函数里面,给切片增加成员,会怎么样? + +### 切片 +定义一个数组和定义一个切片的区别是[...]和\[\](当然还有其他的定义方式) +```go +func Test_DefineSlice(t *testing.T) { + var arr = [...]int{1, 2, 3} + var slice1 = []int{1, 2, 3} + var slice2 = make([]int, 3) + var slice3 = arr[:] + fmt.Printf("arr type=%v len=%d cap=%d\n", reflect.TypeOf(arr).String(), len(arr), cap(arr)) + fmt.Printf("slice1 type=%v len=%d cap=%d\n", reflect.TypeOf(slice1).String(), len(slice1), cap(slice1)) + fmt.Printf("slice2 type=%v len=%d cap=%d\n", reflect.TypeOf(slice2).String(), len(slice2), cap(slice2)) + fmt.Printf("slice3 type=%v len=%d cap=%d\n", reflect.TypeOf(slice3).String(), len(slice3), cap(slice3)) +} +//Result: +//arr type=[3]int len=3 cap=3 +//slice1 type=[]int len=3 cap=3 +//slice2 type=[]int len=3 cap=3 +//slice3 type=[]int len=3 cap=3 +``` + +上面方法中的切片是会自动创建一个底层数组,如果切片直接引用一个创建好了的数组呢? +我的猜想是在切片里面修改值,原数组也会跟着一起变(切片指针指向的就是这一个数组) +然后我想再验证一下,如果我的切片再增加一个成员(超出数组限制),那么还会变化吗? +我的猜想是会重新分配到另外一个数组去,然后导致引用的数组不会发生改变(切片指针指向的已经是另外一个数组了) +```go +func Test_Modify(t *testing.T) { + arr := [...]int{1, 2, 3, 4, 5, 6, 7} + slice := arr[:] + slice[4] = 8 + t.Logf("arr[4]=%v,slice[4]=%v\n", arr[4], slice[4]) + assert.Equal(t, slice[4], arr[4]) + slice = append(slice, 9) + slice[5] = 10 + t.Logf("arr[4]=%v,slice[4]=%v\n", arr[4], slice[4]) + assert.Equal(t, slice[4], arr[4]) + t.Logf("arr[5]=%v,slice[5]=%v\n", arr[5], slice[5]) + assert.NotEqual(t, slice[5], arr[5]) +} +``` +验证通过^_^ + +再来试试两个切片共享一个数组 +```go +func Test_ModifyTwoSlice(t *testing.T) { + arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9} + slice1 := arr[1:5] + slice2 := arr[3:8] + slice1[2] = 8 + t.Logf("%v %v %v\n", arr, slice1, slice2) + assert.Equal(t, slice1[2], slice2[0], arr[3]) +} +``` +一样的全部一起修改成功了 + +### append +然后我们来看看append +```go +func Test_Append(t *testing.T) { + slice := []int{1, 2, 3} + println(slice) + slice = append(slice, 1) + println(slice) + slice = append(slice, 1) + println(slice) +} +// Result: +// slice type=[]int len=3 cap=3 +// [3/3]0xc00005e3e0 +// slice type=[]int len=4 cap=6 +// [4/6]0xc00008c060 +// slice type=[]int len=5 cap=6 +// [5/6]0xc00008c060 +``` +当容量够的时候切片的内存地址没有发生变化,不够的时候进行了扩容,地址改变了. + +刚刚写的时候发现了一个问题,就是每次扩容的大小,我写了一个循环来展示 +```go +func Test_Cap(t *testing.T) { + slice1 := []int{1, 2, 3} + slice2 := make([]int, 3, 3) + last := [2]int{0, 0} + for i := 0; i < 100; i++ { + slice1 = append(slice1, 1) + slice2 = append(slice2, 1) + if last[0] != cap(slice1) { + println(slice1) + last[0] = cap(slice1) + } + if last[1] != cap(slice2) { + println(slice2) + last[1] = cap(slice2) + } + } +} +``` +好吧,我以为扩容的容量,~~如果不是make的话是按照前一次容量的两倍来扩容的,是make就是每次增加的容量是固定的,事实证明我想多了~~ + +### End + +再回到最开始,在函数里面,增加切片的成员.我想应该有了答案. +```go +func ModifySlice(slice []int) { + slice[2] = 1 + slice = append(slice, 4) + slice[2] = 3 +} +``` +我把之前的`ModifySlice`方法修改了一下,然后成员没加,后面再修改回去为3也没有发生变化了. +这是因为append的时候因为容量不够扩容了,导致底层数组指针发生了改变,但是传进来的切片是外面切片的副本,修改这个切片里面的数组指针不会影响到外面的切片 + +#### 奇淫巧技 +例如这个(go圣经里面抄的233),reverse的参数是切片,但是我们需要处理的是一个数组,这里我们就可以直接用`arr[:]`把数组转化为切片进行处理 +```go +func Test_Demo(t *testing.T) { + arr := [...]int{1, 2, 3, 4} + reverse(arr[:]) + t.Logf("%v\n", arr) +} +func reverse(s []int) { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } +} +``` + + +> 暂时只想到这些,再有的话,以后继续补.如有错误希望指教. \ No newline at end of file diff --git a/archive/go/slice_test.go b/archive/go/slice_test.go new file mode 100644 index 0000000..0738785 --- /dev/null +++ b/archive/go/slice_test.go @@ -0,0 +1,105 @@ +package main + +import ( + "fmt" + "reflect" + "testing" + + "github.com/stretchr/testify/assert" +) + +func Test_Func(t *testing.T) { + var arr = [...]int{1, 2, 3} + var slice = []int{1, 2, 3} + ModifyArray(arr) + ModifySlice(slice) + t.Logf("%v %v\n", arr, slice) + assert.NotEqual(t, arr[2], 1) + assert.Equal(t, slice[2], 1) +} + +func ModifyArray(arr [3]int) { + arr[2] = 1 +} + +func ModifySlice(slice []int) { + slice[2] = 1 + slice = append(slice, 4) + slice[2] = 3 +} + +func Test_DefineSlice(t *testing.T) { + var arr = [...]int{1, 2, 3} + var slice1 = []int{1, 2, 3} + var slice2 = make([]int, 3) + var slice3 = arr[:] + t.Logf("arr type=%v len=%d cap=%d\n", reflect.TypeOf(arr).String(), len(arr), cap(arr)) + t.Logf("slice1 type=%v len=%d cap=%d\n", reflect.TypeOf(slice1).String(), len(slice1), cap(slice1)) + t.Logf("slice2 type=%v len=%d cap=%d\n", reflect.TypeOf(slice2).String(), len(slice2), cap(slice2)) + t.Logf("slice3 type=%v len=%d cap=%d\n", reflect.TypeOf(slice3).String(), len(slice3), cap(slice3)) +} + +func Test_Modify(t *testing.T) { + arr := [...]int{1, 2, 3, 4, 5, 6, 7} + slice := arr[:] + slice[4] = 8 + t.Logf("arr[4]=%v,slice[4]=%v\n", arr[4], slice[4]) + assert.Equal(t, slice[4], arr[4]) + slice = append(slice, 9) + slice[5] = 10 + t.Logf("arr[4]=%v,slice[4]=%v\n", arr[4], slice[4]) + assert.Equal(t, slice[4], arr[4]) + t.Logf("arr[5]=%v,slice[5]=%v\n", arr[5], slice[5]) + assert.NotEqual(t, slice[5], arr[5]) +} + +func Test_ModifyTwoSlice(t *testing.T) { + arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9} + slice1 := arr[1:5] + slice2 := arr[3:8] + slice1[2] = 8 + t.Logf("%v %v %v\n", arr, slice1, slice2) + assert.Equal(t, slice1[2], slice2[0], arr[3]) +} + +func Test_Append(t *testing.T) { + slice := []int{1, 2, 3} + fmt.Printf("slice type=%v len=%d cap=%d\n", reflect.TypeOf(slice).String(), len(slice), cap(slice)) + println(slice) + slice = append(slice, 1) + fmt.Printf("slice type=%v len=%d cap=%d\n", reflect.TypeOf(slice).String(), len(slice), cap(slice)) + println(slice) + slice = append(slice, 1) + fmt.Printf("slice type=%v len=%d cap=%d\n", reflect.TypeOf(slice).String(), len(slice), cap(slice)) + println(slice) +} + +func Test_Cap(t *testing.T) { + slice1 := []int{1, 2, 3} + slice2 := make([]int, 3, 3) + last := [2]int{0, 0} + for i := 0; i < 100; i++ { + slice1 = append(slice1, 1) + slice2 = append(slice2, 1) + if last[0] != cap(slice1) { + println(slice1) + last[0] = cap(slice1) + } + if last[1] != cap(slice2) { + println(slice2) + last[1] = cap(slice2) + } + } +} + +func Test_Demo(t *testing.T) { + arr := [...]int{1, 2, 3, 4} + reverse(arr[:]) + t.Logf("%v\n", arr) +} + +func reverse(s []int) { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } +} diff --git a/archive/go/test/http.go b/archive/go/test/http.go new file mode 100644 index 0000000..f13edd2 --- /dev/null +++ b/archive/go/test/http.go @@ -0,0 +1,20 @@ +package main + +import ( + "net/http" + "time" +) + +// 测试http是否会处理完请求后才结束 +// 结果,不会 + +func main() { + + http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) { + time.Sleep(time.Second * 5) + writer.Write([]byte("success")) + }) + + http.ListenAndServe(":8080", nil) + +} diff --git a/archive/img/screen/6UVI)HI6]~QXP33OMNWYSAF.png b/archive/img/screen/6UVI)HI6]~QXP33OMNWYSAF.png new file mode 100644 index 0000000..ea784c7 Binary files /dev/null and b/archive/img/screen/6UVI)HI6]~QXP33OMNWYSAF.png differ diff --git a/archive/img/screen/7AOA[T4P2V`Y9O3E9AR6~YN.png.png b/archive/img/screen/7AOA[T4P2V`Y9O3E9AR6~YN.png.png new file mode 100644 index 0000000..3b5ddc4 Binary files /dev/null and b/archive/img/screen/7AOA[T4P2V`Y9O3E9AR6~YN.png.png differ diff --git a/archive/img/screen/OH1IUV3NV(LH7U]H8N0WZ_E.png b/archive/img/screen/OH1IUV3NV(LH7U]H8N0WZ_E.png new file mode 100644 index 0000000..ccfadc6 Binary files /dev/null and b/archive/img/screen/OH1IUV3NV(LH7U]H8N0WZ_E.png differ diff --git a/archive/img/screen/VV68]}9Y0F4LGCF]I$P({6M.png b/archive/img/screen/VV68]}9Y0F4LGCF]I$P({6M.png new file mode 100644 index 0000000..0129072 Binary files /dev/null and b/archive/img/screen/VV68]}9Y0F4LGCF]I$P({6M.png differ diff --git a/archive/img/screen/}]6J69Q}FQCLI]E]}L5F$TG.png b/archive/img/screen/}]6J69Q}FQCLI]E]}L5F$TG.png new file mode 100644 index 0000000..9187dda Binary files /dev/null and b/archive/img/screen/}]6J69Q}FQCLI]E]}L5F$TG.png differ diff --git a/archive/k8s/readme.assets/1c0c5c4562e7476588c0cf2fbe1a453d.png b/archive/k8s/readme.assets/1c0c5c4562e7476588c0cf2fbe1a453d.png new file mode 100644 index 0000000..cecc263 Binary files /dev/null and b/archive/k8s/readme.assets/1c0c5c4562e7476588c0cf2fbe1a453d.png differ diff --git a/archive/k8s/readme.assets/cri-architecture.png b/archive/k8s/readme.assets/cri-architecture.png new file mode 100644 index 0000000..ca0d40b Binary files /dev/null and b/archive/k8s/readme.assets/cri-architecture.png differ diff --git a/archive/k8s/readme.assets/eb89cb969a514b2e9b2bdcf6273f31f9.png b/archive/k8s/readme.assets/eb89cb969a514b2e9b2bdcf6273f31f9.png new file mode 100644 index 0000000..d7caa47 Binary files /dev/null and b/archive/k8s/readme.assets/eb89cb969a514b2e9b2bdcf6273f31f9.png differ diff --git a/archive/k8s/readme.md b/archive/k8s/readme.md new file mode 100644 index 0000000..cd8712f --- /dev/null +++ b/archive/k8s/readme.md @@ -0,0 +1,157 @@ +## cri 容器运行时接口 + +CRI是基于gRPC的 + +这其中包含了两个 gRPC 服务: + +- **RuntimeService**:容器和 Sandbox 运行时管理。 +- **ImageService**:提供了从镜像仓库拉取、查看、和移除镜像的 RPC。 + + + +![](./readme.assets/cri-architecture.png) + +Kubelet 作为 CRI 的客户端,而容器运行时则需要实现 CRI 的服务端(即 gRPC server,通常称为 CRI shim)。容器运行时在启动 gRPC server 时需要监听在本地的 Unix Socket (Windows 使用 tcp 格式)。 + + + +### 学习资料 + +* [容器运行时接口(CRI)](https://jimmysong.io/kubernetes-handbook/concepts/cri.html) +* [运行时插件 CRI](https://feisky.gitbooks.io/kubernetes/content/plugins/CRI.html) + + + +## cni 容器网络接口 + +### 使用 + +基本的使用方法为: + +1. 首先在每个节点上配置 CNI 配置文件(/etc/cni/net.d/xxnet.conf),其中 xxnet.conf 是某一个网络配置文件的名称; +2. 安装 CNI 配置文件中所对应的二进制插件; +3. 在这个节点上创建 Pod 之后,Kubelet 就会根据 CNI 配置文件执行前两步所安装的 CNI 插件; +4. 上步执行完之后,Pod 的网络就配置完成了。 + +![1.png](./readme.assets/eb89cb969a514b2e9b2bdcf6273f31f9.png) + + + +cni插件分为三种:Overlay、路由及 Underlay + +![3.png](./readme.assets/1c0c5c4562e7476588c0cf2fbe1a453d.png) + +- **Overlay 模式**的典型特征是容器独立于主机的 IP 段,这个 IP 段进行跨主机网络通信时是通过在主机之间创建隧道的方式,将整个容器网段的包全都封装成底层的物理网络中主机之间的包。该方式的好处在于它不依赖于底层网络; +- **路由模式**中主机和容器也分属不同的网段,它与 Overlay 模式的主要区别在于它的跨主机通信是通过路由打通,无需在不同主机之间做一个隧道封包。但路由打通就需要部分依赖于底层网络,比如说要求底层网络有二层可达的一个能力; +- **Underlay 模式**中容器和宿主机位于同一层网络,两者拥有相同的地位。容器之间网络的打通主要依靠于底层网络。因此该模式是强依赖于底层能力的。 + + + +### flannel + +#### Flannel 工作模式 +支持3种实现:UDP、VxLAN、host-gw, + +* UDP 模式:使用设备 flannel.0 进行封包解包,不是内核原生支持,频繁地内核态用户态切换,性能非常差; +* VxLAN 模式:使用 flannel.1 进行封包解包,内核原生支持,性能较强; +* host-gw 模式:无需 flannel.1 这样的中间设备,直接宿主机当作子网的下一跳地址,性能最强; + +### 学习资料 + +* [从零开始入门 K8s | 理解 CNI 和 CNI 插件](https://www.kubernetes.org.cn/6908.html) +* [循序渐进理解CNI机制与Flannel工作原理](https://blog.yingchi.io/posts/2020/8/k8s-flannel.html) +* [cni容器网络](https://github.com/containernetworking/cni) +* [cni网络实现](https://github.com/containernetworking/plugins/tree/master/plugins) + + + + + + +## k8s CustomResourceDefinition(CRD 自定义资源) + +自定义资源实际上是为了扩展 Kubernetes 的 API,向 Kubernetes API 中增加新类型,可以使用以下两种方式: + +* 修改 Kubernetes 的源码,显然难度比较高,也不太合适 +* 创建自定义 API server 并聚合到 API 中 + +创建一个api版本为:`stable.example.com/v1` Kind为:`CronTab` 的CRD: + +```yaml +apiVersion: apiextensions.k8s.io/v1beta1 +kind: CustomResourceDefinition +metadata: + # 名称必须符合下面的格式:. + name: crontabs.stable.example.com +spec: + # REST API 使用的组名称:/apis// + group: stable.example.com + # REST API 使用的版本号:/apis// + version: v1 + # Namespaced 或 Cluster + scope: Namespaced + names: + # URL 中使用的复数名称: /apis/// + plural: crontabs + # CLI 中使用的单数名称 + singular: crontab + # CamelCased 格式的单数类型。在清单文件中使用 + kind: CronTab + # CLI 中使用的资源简称 + shortNames: + - ct + +# cmd +# kubectl create -f resourcedefinition.yaml +``` + +使用: +```yaml +apiVersion: "stable.example.com/v1" +kind: CronTab +metadata: + name: my-new-cron-object +spec: + cronSpec: "* * * * /5" + image: my-awesome-cron-image + +# cmd +# kubectl apply -f cron.yaml +# kubectl get crontab +# kubectl get ct -o yaml +``` + +单纯的定义crd资源没有什么用,需要自己写好控制台来执行实际的操作,于是有了下面的[k8s operator](# k8s operator),Operator=CRD+Controller。 + +### 学习资料 + +* [使用CRD扩展Kubernetes API](https://jimmysong.io/kubernetes-handbook/concepts/crd.html) +* [Extend the Kubernetes API with CustomResourceDefinitions](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) +* [如何从零开始编写一个Kubernetes CRD](https://www.servicemesher.com/blog/kubernetes-crd-quick-start/) + +## k8s operator +> Operator=CRD+Controller 可以提高k8s的扩展性,定义自己的controller + +简单来说就是通过CRD定义自己的控制器,然后Controller通过监听CRD的CRUD事件来执行一些操作。 + +例如:创建一个AppService的CRD资源对象,然后快速部署Deployment、Service等资源。 + +```yaml +apiVersion: app.example.com/v1 +kind: AppService +metadata: + name: nginx-app +spec: + size: 2 + image: nginx:1.7.9 + ports: + - port: 80 + targetPort: 80 + nodePort: 30002 +``` + +### 学习资料 + +* [Kubernetes Operator 快速入门教程](https://www.qikqiak.com/post/k8s-operator-101/) +* [sample-controller](https://github.com/kubernetes/sample-controller) + diff --git a/archive/other/gateway/docker-compose.yaml b/archive/other/gateway/docker-compose.yaml new file mode 100644 index 0000000..6e34914 --- /dev/null +++ b/archive/other/gateway/docker-compose.yaml @@ -0,0 +1,103 @@ + +# this file is only for local docker + +version: '3' + +services: + + kong_migrations: # 构建kong数据库,这个镜像和下面的镜像是一样的 + image: kong + container_name: micro_kong_migrations + command: kong migrations bootstrap + depends_on: + - kong_database + environment: + - KONG_DATABASE=postgres + - KONG_PG_HOST=kong_database + - KONG_PG_DATABASE=kong + - KONG_PG_PASSWORD=kong + networks: + - micro + + kong: # kong网关服务 + image: kong + hostname: kong + container_name: micro_kong + environment: + - KONG_DATABASE=postgres + - KONG_PG_HOST=172.28.1.4 + - KONG_PG_DATABASE=kong + - KONG_PG_PASSWORD=kong + - KONG_DNS_RESOLVER=172.28.1.3:8600 + - KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl + depends_on: + - kong_migrations + - kong_database + ports: + - "8000:8000" + - "8443:8443" + - "8001:8001" + - "8444:8444" + networks: + - micro + + kong_dashboard: # kong管理面板 + image: pantsel/konga + container_name: kong_dashboard + environment: + - TOKEN_SECRET=micro + - NODE_ENV=development + - DB_ADAPTER=postgres + - DB_HOST=kong_database + - DB_USER=kong + - DB_PASSWORD=kong + - DB_DATABASE=kong + depends_on: + - kong + ports: + - 1337:1337 + networks: + - micro + + kong_database: # kong数据库 采用的postgres + image: postgres + hostname: kong_database + container_name: micro_kong_database + environment: + - POSTGRES_USER=kong + - POSTGRES_DB=kong + - POSTGRES_PASSWORD=kong + ports: + - 5432:5432 + volumes: + - pgdata:/var/lib/postgresql/data + networks: + micro: + ipv4_address: 172.28.1.4 + + reverse-proxy: + image: traefik # The official Traefik docker image + command: --api --docker # Enables the web UI and tells Traefik to listen to docker + ports: + - "8081:80" # The HTTP port + - "8080:8080" # The Web UI (enabled by --api) + volumes: + - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events + networks: + - micro + whoami: + image: containous/whoami + labels: + - "traefik.frontend.rule=Host:whoami.docker.localhost" + networks: + - micro + +networks: + micro: + ipam: + driver: default + config: + - subnet: 172.28.0.0/16 + +volumes: + pgdata: \ No newline at end of file diff --git a/archive/other/ssocket/.gitignore b/archive/other/ssocket/.gitignore new file mode 100644 index 0000000..c2ac9dd --- /dev/null +++ b/archive/other/ssocket/.gitignore @@ -0,0 +1,24 @@ +/.idea +/.vscode +*.o +*.log + +# executable file +/src/main +/test/client + +# automake +/autom4te.cache +.deps +stamp-h1 +Makefile +aclocal.m4 +/config.* +configure +Makefile.in +install-sh +compile +depcomp +missing +/cmake-build-debug + diff --git a/archive/other/ssocket/CMakeLists.txt b/archive/other/ssocket/CMakeLists.txt new file mode 100644 index 0000000..bd1f4e0 --- /dev/null +++ b/archive/other/ssocket/CMakeLists.txt @@ -0,0 +1,12 @@ +# 主要用于clion的cmake配置 + +cmake_minimum_required(VERSION 3.2) +project(ssocket) + +include_directories(/usr/include) + +add_executable(main src/main.c) + +add_executable(client test/client.c) + +TARGET_LINK_LIBRARIES(main pthread aio) diff --git a/archive/other/ssocket/Makefile.am b/archive/other/ssocket/Makefile.am new file mode 100644 index 0000000..8b56575 --- /dev/null +++ b/archive/other/ssocket/Makefile.am @@ -0,0 +1,2 @@ +AUTOMAKE_OPTIONS=foreign +SUBDIRS=src/ test/ diff --git a/archive/other/ssocket/autogen.sh b/archive/other/ssocket/autogen.sh new file mode 100644 index 0000000..4be826a --- /dev/null +++ b/archive/other/ssocket/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +autoreconf --install --force \ No newline at end of file diff --git a/archive/other/ssocket/configure.ac b/archive/other/ssocket/configure.ac new file mode 100644 index 0000000..123d76c --- /dev/null +++ b/archive/other/ssocket/configure.ac @@ -0,0 +1,20 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT(ssocket, 1.0, love@xloli.top) +AC_CONFIG_SRCDIR([src/main.c]) +AC_CONFIG_HEADERS([config.h]) +AM_INIT_AUTOMAKE(ssocket,1.0) +# Checks for programs. +AC_PROG_CC + +# Checks for libraries. + +# Checks for header files. + +# Checks for typedefs, structures, and compiler characteristics. + +# Checks for library functions. + +AC_OUTPUT([Makefile src/Makefile test/Makefile]) diff --git a/archive/other/ssocket/readme.md b/archive/other/ssocket/readme.md new file mode 100644 index 0000000..68c3106 --- /dev/null +++ b/archive/other/ssocket/readme.md @@ -0,0 +1,9 @@ +> 学习Linux c 挖坑 + +## build + +```bash +./autogen.sh && ./configure +make +``` + diff --git a/archive/other/ssocket/src/Makefile.am b/archive/other/ssocket/src/Makefile.am new file mode 100644 index 0000000..823428d --- /dev/null +++ b/archive/other/ssocket/src/Makefile.am @@ -0,0 +1,5 @@ +AUTOMAKE_OPTIONS=foreign +bin_PROGRAMS=main +LIBS=-laio +main_LDFLAGS=-pthread +main_SOURCES=main.c diff --git a/archive/other/ssocket/src/main.c b/archive/other/ssocket/src/main.c new file mode 100644 index 0000000..da3c71a --- /dev/null +++ b/archive/other/ssocket/src/main.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include + +int main() { + sem_t sem_id; + sem_init(&sem_id, 1654, 1); + int shm = shmget(0, sizeof(int), 0666 | IPC_CREAT); + int *a = shmat(shm, 0, 0); + *a = 0; + for (int i = 0; i < 100; i++) { + int pid = fork(); + if (pid == 0) { + int *b = shmat(shm, 0, 0); + while (true) { + sem_wait(&sem_id); + *b = *b + 1; + if (*b > 10000) { + sem_post(&sem_id); + break; + } + printf("pid:%d,%d\n", getpid(), *b); + sem_post(&sem_id); + } + return 0; + } + } + sleep(4); + sem_destroy(&sem_id); + shmctl(shm, IPC_CREAT, 0); + return 0; +} diff --git a/archive/other/ssocket/src/study/aio.c b/archive/other/ssocket/src/study/aio.c new file mode 100644 index 0000000..bf4f8af --- /dev/null +++ b/archive/other/ssocket/src/study/aio.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include + +#define MAX_EVENT 10 +#define BUF_LEN 1024 + +void callback(io_context_t ctx, struct iocb *iocb, long res, long res2) { + printf("test call\n"); + printf("%s\n", iocb->u.c.buf); +} + +int main() { + int fd = open("/home/huanl/client.ovpn", O_RDONLY, 0); + io_context_t io_context; + struct iocb io, *p = &io; + struct io_event event[MAX_EVENT]; + char *buf = malloc(BUF_LEN); + memset(buf, 0, BUF_LEN); + memset(&io_context, 0, sizeof(io_context)); + + if (io_setup(10, &io_context)) { + printf("io_setup error"); + return 0; + } + if (fd < 0) { + printf("open file error"); + return 0; + } + io_prep_pread(&io, fd, buf, BUF_LEN, 0); + io_set_callback(&io, callback); + if (io_submit(io_context, 1, &p) < 0) { + printf("io_submit error"); + return 0; + } + + int num = io_getevents(io_context, 1, MAX_EVENT, event, NULL); + for (int i = 0; i < num; i++) { + io_callback_t io_callback = event[i].data; + io_callback(io_context, event[i].obj, event[i].res, event[i].res2); + } + + return 0; +} diff --git a/archive/other/ssocket/src/study/coroutine.c b/archive/other/ssocket/src/study/coroutine.c new file mode 100644 index 0000000..3f64804 --- /dev/null +++ b/archive/other/ssocket/src/study/coroutine.c @@ -0,0 +1,79 @@ +#include +#include +#include + +#define STACK_SIZE 1024*128 +#define CO_RUN 1 +#define CO_HANG 2 +#define CO_OVER 3 + +typedef void (*co_func)(struct coroutine *co); + +struct coroutine { + char stack[STACK_SIZE];//栈 + ucontext_t ctx;//ucp + ucontext_t ucp; + char status;//协程状态 +}; + +void co_main(struct coroutine *co, co_func func) { + func(co); + co->status = CO_OVER; +} + +void co_create(struct coroutine *co, co_func func) { + getcontext(&co->ucp); + co->ctx = co->ucp; + co->ctx.uc_stack.ss_sp = co->stack; + co->ctx.uc_stack.ss_size = STACK_SIZE; + co->ctx.uc_stack.ss_flags = 0; + co->ctx.uc_link = &co->ucp; + co->status = CO_RUN; + makecontext(&co->ctx, co_main, 2, co, func); + swapcontext(&co->ucp, &co->ctx); +} + +void co_yield(struct coroutine *co) { + if (co->status == CO_OVER) { + return; + } + co->status = CO_HANG; + swapcontext(&co->ctx, &co->ucp); +} + +void co_resume(struct coroutine *co) { + if (co->status == CO_OVER) { + return; + } + co->status = CO_RUN; + swapcontext(&co->ucp, &co->ctx); +} + +int co_status(struct coroutine *co) { + return co->status; +} + +void print1(struct coroutine *co) { + for (int i = 0; i < 50; i++) { + printf("1号协程:%d\n", i); + co_yield(co); + } +} + +void print2(struct coroutine *co) { + for (int i = 100; i < 200; i++) { + printf("2号协程:%d\n", i); + co_yield(co); + } +} + +int main() { + struct coroutine co1, co2; + co_create(&co1, print1); + co_create(&co2, print2); + while (co_status(&co1) != CO_OVER || co_status(&co2) != CO_OVER) { + co_resume(&co1); + co_resume(&co2); + } + return 0; +} \ No newline at end of file diff --git a/archive/other/ssocket/src/study/epoll.c b/archive/other/ssocket/src/study/epoll.c new file mode 100644 index 0000000..eebf55d --- /dev/null +++ b/archive/other/ssocket/src/study/epoll.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_EVENT 20 +#define BUFF_LEN 1024 + +void log(const char *str) { + printf("%s\n", str); +} + +int main() { + int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (fd == -1) { + log("socket create error"); + return 0; + } + //设置为非阻塞,因为ET模式的原因,一次accept可能会接收多个用户 + int flag = fcntl(fd, F_GETFL, 0); + fcntl(fd, F_SETFL, flag | O_NONBLOCK); + + struct sockaddr_in server_sockaddr; + server_sockaddr.sin_family = AF_INET; + server_sockaddr.sin_port = htons(1234); + server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); + if (bind(fd, (const struct sockaddr *) &server_sockaddr, sizeof(struct sockaddr_in)) == -1) { + log("bind socket error"); + return 0; + } + listen(fd, SOMAXCONN); + struct sockaddr_in client_sockaddr; + int size = 0, client_fd = 0, fd_num = 0; + int epfd = epoll_create(1); + size_t ret_size; + char *buf = malloc(BUFF_LEN); + + struct epoll_event ev, evs[MAX_EVENT]; + ev.data.fd = fd; + ev.events = EPOLLIN | EPOLLET; + epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev); + int count = 0; + while (1) { + fd_num = epoll_wait(epfd, evs, MAX_EVENT, -1); + printf("fd_num:%d\n", fd_num); + for (int i = 0; i < fd_num; i++) { + if (evs[i].data.fd == fd) { + //server 收到链接,非阻塞循环accept,直到-1 + while ((client_fd = accept(fd, + (struct sockaddr *) &client_sockaddr, + (socklen_t *) &size)) != -1) { + ev.data.fd = client_fd; + ev.events = EPOLLIN | EPOLLET; + printf("connect:%d\n", client_fd); + epoll_ctl(epfd, EPOLL_CTL_ADD, client_fd, &ev); + } + if (errno != EAGAIN) { + printf("accept error\n"); + return 0; + } + } else if (evs[i].events) { + count++; + //应该是客户端了 + client_fd = evs[i].data.fd; + memset(buf, 0, BUFF_LEN); + ret_size = (size_t) recv(client_fd, buf, BUFF_LEN, 0); + printf("fd:%d,ret:%d,count:%d,recv\n", client_fd, ret_size, count); + ret_size = send(client_fd, "hello", 5, 0); + close(client_fd); + ret_size = epoll_ctl(epfd, EPOLL_CTL_DEL, client_fd, &ev); + } + } + } + return 0; +} diff --git a/archive/other/ssocket/src/study/mutex.c b/archive/other/ssocket/src/study/mutex.c new file mode 100644 index 0000000..e65493d --- /dev/null +++ b/archive/other/ssocket/src/study/mutex.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include + +int main() { + int shm = shmget(0, sizeof(int), 0666 | IPC_CREAT); + int *a = shmat(shm, 0, 0); + *a = 0; + pthread_mutex_t mutex; + pthread_mutexattr_t mutexattr; + //配置选项 + pthread_mutexattr_init(&mutexattr); + pthread_mutexattr_setpshared(&mutexattr, PTHREAD_PROCESS_SHARED);//比较重要的一步,进程间共享 + pthread_mutex_init(&mutex, &mutexattr); + for (int i = 0; i < 100; i++) { + int pid = fork(); + if (pid == 0) { + int *b = shmat(shm, 0, 0); + while (true) { + int ret = pthread_mutex_lock(&mutex); + if (*b >= 10000) { + pthread_mutex_unlock(&mutex); + break; + } + *b = *b + 1; + printf("pid:%d,%d,%d\n", getpid(), *b, ret); + pthread_mutex_unlock(&mutex); + } + return 0; + } + } + sleep(4); + shmctl(shm, IPC_CREAT, 0); + pthread_mutexattr_destroy(&mutexattr); + pthread_mutex_destroy(&mutex); + return 0; +} diff --git a/archive/other/ssocket/src/study/select.c b/archive/other/ssocket/src/study/select.c new file mode 100644 index 0000000..1e0eace --- /dev/null +++ b/archive/other/ssocket/src/study/select.c @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include + +#define MAX_CLIENT 1023 +#define BUFF_LEN 1024 + +void log(const char *str) { + printf("%s\n", str); +} + +int main() { + int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + int on = 1; + setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + if (fd == -1) { + log("socket create error"); + return 0; + } + struct sockaddr_in server_sockaddr; + server_sockaddr.sin_family = AF_INET; + server_sockaddr.sin_port = htons(1234); + server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY); + if (bind(fd, (const struct sockaddr *) &server_sockaddr, sizeof(struct sockaddr_in)) == -1) { + log("bind socket error"); + return 0; + } + listen(fd, 20); + struct sockaddr_in client_sockaddr; + int client_fd[MAX_CLIENT] = {-1}, size; + memset(client_fd, -1, MAX_CLIENT * sizeof(int)); + char *buf = malloc(BUFF_LEN); + + //select + fd_set allset; + struct timeval timeout; + timeout.tv_sec = 2; + timeout.tv_usec = 0; + FD_ZERO(&allset); + FD_SET(fd, &allset); + fd_set tmp_set; + int maxfd = fd; + int count = 0; + while (1) { + tmp_set = allset; + int ret = select(maxfd + 1, &tmp_set, NULL, NULL, NULL); + if (ret > 0) { + //大于0判断是否有数据进入了 + if (FD_ISSET(fd, &tmp_set)) { + //如果是fd这个,那么代表有新链接进入 + int tmp_client_fd = accept(fd, (struct sockaddr *) &client_sockaddr, &size); + //将客户fd存入数组 + int i = 0; + for (i = 0; i < MAX_CLIENT; i++) { + if (client_fd[i] == -1) {//就是你了 + client_fd[i] = tmp_client_fd; + break; + } + } + if (client_fd[i] != tmp_client_fd) { + //超出限制了,直接丢弃,因为select一般最多只能操作1024个文件 + //__FD_SETSIZE决定的,更多需要修改内核 + close(tmp_client_fd); + } else { + if (client_fd[i] > maxfd) { + maxfd = client_fd[i]; + } + FD_SET(client_fd[i], &allset); + } + } else { + //不是服务器的句柄,那么就是客户端的句柄咯,要遍历客户端句柄 + maxfd = fd; + for (int i = 0; i < MAX_CLIENT; i++) { + if (client_fd[i] != -1) { + if (FD_ISSET(client_fd[i], &tmp_set)) { + //是这个客户端,接受消息 + memset(buf, 0, BUFF_LEN); + count++; + ret = recv(client_fd[i], buf, BUFF_LEN, 0); + printf("fd:%d,ret:%d,count:%d,recv\n", client_fd[i], ret, count); + if (ret == 0) { + //从集合中删除 + printf("error,fd:%d,ret:%d,count:%d,recv\n", client_fd[i], ret, count); + close(client_fd[i]); + FD_CLR(client_fd[i], &allset); + client_fd[i] = -1; + continue; + } + ret = (int) send(client_fd[i], "hello", 5, 0); + //从集合中删除 + close(client_fd[i]); + FD_CLR(client_fd[i], &allset); + client_fd[i] = -1; + } + if (client_fd[i] > maxfd) { + maxfd = client_fd[i]; + } + } + } + } + } else { + break; + } + } + free(buf); + return 0; +} diff --git a/archive/other/ssocket/src/study/sem.c b/archive/other/ssocket/src/study/sem.c new file mode 100644 index 0000000..da3c71a --- /dev/null +++ b/archive/other/ssocket/src/study/sem.c @@ -0,0 +1,33 @@ +#include +#include +#include +#include + +int main() { + sem_t sem_id; + sem_init(&sem_id, 1654, 1); + int shm = shmget(0, sizeof(int), 0666 | IPC_CREAT); + int *a = shmat(shm, 0, 0); + *a = 0; + for (int i = 0; i < 100; i++) { + int pid = fork(); + if (pid == 0) { + int *b = shmat(shm, 0, 0); + while (true) { + sem_wait(&sem_id); + *b = *b + 1; + if (*b > 10000) { + sem_post(&sem_id); + break; + } + printf("pid:%d,%d\n", getpid(), *b); + sem_post(&sem_id); + } + return 0; + } + } + sleep(4); + sem_destroy(&sem_id); + shmctl(shm, IPC_CREAT, 0); + return 0; +} diff --git a/archive/other/ssocket/src/study/shm.c b/archive/other/ssocket/src/study/shm.c new file mode 100644 index 0000000..72fb186 --- /dev/null +++ b/archive/other/ssocket/src/study/shm.c @@ -0,0 +1,29 @@ +#include +#include +#include + +int main() { + int shm = shmget(0, sizeof(int), 0666 | IPC_CREAT); + int *a = shmat(shm, 0, 0); + *a = 6; + for (int i = 0; i < 2; i++) { + int pid = fork(); + if (pid == 0) { + int *b = shmat(shm, 0, 0); + printf("sub:%d,%d\n", *b, b); + if (i == 1) { + *b = 109; + printf("sub1\n"); + } + sleep(2); + printf("sub:%d,%d\n", *b, b); + return 0; + } + } + sleep(1); + *a = 10987; + printf("father:%d,%d", *a, a); + sleep(2); + shmctl(shm, IPC_CREAT, 0); + return 0; +} diff --git a/archive/other/ssocket/test/Makefile.am b/archive/other/ssocket/test/Makefile.am new file mode 100644 index 0000000..43e0f64 --- /dev/null +++ b/archive/other/ssocket/test/Makefile.am @@ -0,0 +1,4 @@ +AUTOMAKE_OPTIONS=foreign +bin_PROGRAMS=client +client_SOURCES=client.c + diff --git a/archive/other/ssocket/test/client.c b/archive/other/ssocket/test/client.c new file mode 100644 index 0000000..a831e06 --- /dev/null +++ b/archive/other/ssocket/test/client.c @@ -0,0 +1,63 @@ +#include +#include +#include +#include +#include +#include +#include + +#define FORK_NUM 10 + +int sub_pid[FORK_NUM] = {0}; + +void sigint_deal(int sig) { + for (int i = 0; i < FORK_NUM; i++) { + kill(sub_pid[i], SIGINT); + } + exit(0); +} + +int main() { + struct hostent *host = gethostbyname("127.0.0.1"); + void *buff = malloc(1024); + + signal(SIGINT, sigint_deal); + for (int i = 0; i < FORK_NUM; i++) { + int pid = fork(); + if (pid == 0) { + //子进程 + printf("in sub process\n"); + for (int j = 0; j < 100; j++) { + int fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + struct sockaddr_in server_sock; + server_sock.sin_family = AF_INET; + server_sock.sin_port = htons(1234); + server_sock.sin_addr = *((struct in_addr *) host->h_addr); + int ret = connect(fd, (const struct sockaddr *) &server_sock, sizeof(struct sockaddr_in)); + if (ret == -1) { + printf("connect error\n"); + continue; + } + ret = (int) send(fd, "test", 4, 0); + printf("pid:%d,send test:%d\n", getpid(), ret); + memset(buff, 0, 1024); + ret = (int) recv(fd, buff, 1024, 0); + printf("pid:%d,recv:%s\n", getpid(), (char *) buff); + close(fd); + } + printf("sub process over\n"); + return 0; + } else if (pid > 0) { + sub_pid[i] = pid; + printf("my father\n"); + } else { + printf("create process error\n"); + } + } + for (int i = 0; i < FORK_NUM; i++) { + wait((int *) sub_pid[i]); + } + printf("over\n"); + free(buff); + return 0; +} \ No newline at end of file diff --git a/archive/other/test.c b/archive/other/test.c new file mode 100644 index 0000000..856a4f5 --- /dev/null +++ b/archive/other/test.c @@ -0,0 +1,10 @@ +int main() +{ + int a = 0; + for (int i = 0; i < 3; i++) + { + a += i; + } +} +//gcc -g -c test.c +//objdump -d -M intel -S test.o \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..e00595d --- /dev/null +++ b/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/docs/blog.mdx b/docs/blog.mdx new file mode 100644 index 0000000..071dcce --- /dev/null +++ b/docs/blog.mdx @@ -0,0 +1,9 @@ +--- +title: BLOG +hide_title: true +sidebar_position: 1 +--- + +import README from "../README.md"; + + diff --git a/docs/dev/README.md b/docs/dev/README.md new file mode 100644 index 0000000..3b8196f --- /dev/null +++ b/docs/dev/README.md @@ -0,0 +1,6 @@ +--- +title: 开发 +sidebar_position: 1 +--- + +这里是开发相关的内容,包括编程语言、框架、开发工具、算法等等。 diff --git a/docs/dev/_category_.json b/docs/dev/_category_.json new file mode 100644 index 0000000..13d1995 --- /dev/null +++ b/docs/dev/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "开发", + "position": 1 +} diff --git a/docs/dev/golang/README.md b/docs/dev/golang/README.md new file mode 100644 index 0000000..df44994 --- /dev/null +++ b/docs/dev/golang/README.md @@ -0,0 +1,6 @@ +--- +id: golang +title: Golang +--- + +Golang diff --git a/docs/dev/golang/_category_.json b/docs/dev/golang/_category_.json new file mode 100644 index 0000000..520d3e5 --- /dev/null +++ b/docs/dev/golang/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Golang", + "position": 2 +} diff --git a/docs/dev/golang/go-slice.md b/docs/dev/golang/go-slice.md new file mode 100644 index 0000000..3da8013 --- /dev/null +++ b/docs/dev/golang/go-slice.md @@ -0,0 +1,186 @@ +--- +title: GO Slice(切片) +--- + +> 感觉切片只要知道底层是引用的一个数组对象,就挺好理解了.这里写下一些笔记,方便记忆和以后再来查找. + +### 切片和数组 + +切片由三个部分组成:指针(指向底层数组),长度(当前切片使用的长度),容量(切片能包含多少个成员) + +然后还有一句和数组相关的:当调用一个函数的时候,函数的每个调用参数将会被赋值给函数内部的参数变量,所以函数参数变量接收的是一个复制的副本,并不是原始调用的变量。(所以数组作为参数,是低效的,还需要进行一次数组的拷贝,可以使用数组指针) + +然后如果我们想要传递给一个函数一个数组,函数需要对数组进行修改,我们必须使用数组指针(用 return 当然也不是不行啦?) + +但是切片就不需要,来个例子: + +```go +func Test_Func(t *testing.T) { + var arr = [...]int{1, 2, 3} + var slice = []int{1, 2, 3} + ModifyArray(arr) + ModifySlice(slice) + t.Logf("%v %v\n", arr, slice) + assert.NotEqual(t, arr[2], 1) + assert.Equal(t, slice[2], 1) +} +func ModifyArray(arr [3]int) { + println(arr) + arr[2] = 1 +} +func ModifySlice(slice []int) { + println(slice) + slice[2] = 1 +} +``` + +凭啥切片就行,大家明明都长得都差不多. +前面说了,切片是由三个部分组成,然后数组传入的是数组的副本.其实我觉得 go 里所有的类型传入的都是对应的副本,切片也是,指针也是的(值传递). + +那都是副本拷贝,那么咋切片可以修改? +`切片是由:数组指针,长度,容量组成的`,来划一下重点. +副本传的也是上面这些东西.然后修改切片的时候呢,实际上是通过切片里面的数组指针去修改了,并没有修改切片的值(数组指针,长度,容量). + +等看完下面再写另外一个情况,在函数里面,给切片增加成员,会怎么样? + +### 切片 + +定义一个数组和定义一个切片的区别是[...]和\[\](当然还有其他的定义方式) + +```go +func Test_DefineSlice(t *testing.T) { + var arr = [...]int{1, 2, 3} + var slice1 = []int{1, 2, 3} + var slice2 = make([]int, 3) + var slice3 = arr[:] + fmt.Printf("arr type=%v len=%d cap=%d\n", reflect.TypeOf(arr).String(), len(arr), cap(arr)) + fmt.Printf("slice1 type=%v len=%d cap=%d\n", reflect.TypeOf(slice1).String(), len(slice1), cap(slice1)) + fmt.Printf("slice2 type=%v len=%d cap=%d\n", reflect.TypeOf(slice2).String(), len(slice2), cap(slice2)) + fmt.Printf("slice3 type=%v len=%d cap=%d\n", reflect.TypeOf(slice3).String(), len(slice3), cap(slice3)) +} +//Result: +//arr type=[3]int len=3 cap=3 +//slice1 type=[]int len=3 cap=3 +//slice2 type=[]int len=3 cap=3 +//slice3 type=[]int len=3 cap=3 +``` + +上面方法中的切片是会自动创建一个底层数组,如果切片直接引用一个创建好了的数组呢? +我的猜想是在切片里面修改值,原数组也会跟着一起变(切片指针指向的就是这一个数组) +然后我想再验证一下,如果我的切片再增加一个成员(超出数组限制),那么还会变化吗? +我的猜想是会重新分配到另外一个数组去,然后导致引用的数组不会发生改变(切片指针指向的已经是另外一个数组了) + +```go +func Test_Modify(t *testing.T) { + arr := [...]int{1, 2, 3, 4, 5, 6, 7} + slice := arr[:] + slice[4] = 8 + t.Logf("arr[4]=%v,slice[4]=%v\n", arr[4], slice[4]) + assert.Equal(t, slice[4], arr[4]) + slice = append(slice, 9) + slice[5] = 10 + t.Logf("arr[4]=%v,slice[4]=%v\n", arr[4], slice[4]) + assert.Equal(t, slice[4], arr[4]) + t.Logf("arr[5]=%v,slice[5]=%v\n", arr[5], slice[5]) + assert.NotEqual(t, slice[5], arr[5]) +} +``` + +验证通过^\_^ + +再来试试两个切片共享一个数组 + +```go +func Test_ModifyTwoSlice(t *testing.T) { + arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9} + slice1 := arr[1:5] + slice2 := arr[3:8] + slice1[2] = 8 + t.Logf("%v %v %v\n", arr, slice1, slice2) + assert.Equal(t, slice1[2], slice2[0], arr[3]) +} +``` + +一样的全部一起修改成功了 + +### append + +然后我们来看看 append + +```go +func Test_Append(t *testing.T) { + slice := []int{1, 2, 3} + println(slice) + slice = append(slice, 1) + println(slice) + slice = append(slice, 1) + println(slice) +} +// Result: +// slice type=[]int len=3 cap=3 +// [3/3]0xc00005e3e0 +// slice type=[]int len=4 cap=6 +// [4/6]0xc00008c060 +// slice type=[]int len=5 cap=6 +// [5/6]0xc00008c060 +``` + +当容量够的时候切片的内存地址没有发生变化,不够的时候进行了扩容,地址改变了. + +刚刚写的时候发现了一个问题,就是每次扩容的大小,我写了一个循环来展示 + +```go +func Test_Cap(t *testing.T) { + slice1 := []int{1, 2, 3} + slice2 := make([]int, 3, 3) + last := [2]int{0, 0} + for i := 0; i < 100; i++ { + slice1 = append(slice1, 1) + slice2 = append(slice2, 1) + if last[0] != cap(slice1) { + println(slice1) + last[0] = cap(slice1) + } + if last[1] != cap(slice2) { + println(slice2) + last[1] = cap(slice2) + } + } +} +``` + +好吧,我以为扩容的容量,~~如果不是 make 的话是按照前一次容量的两倍来扩容的,是 make 就是每次增加的容量是固定的,事实证明我想多了~~ + +### End + +再回到最开始,在函数里面,增加切片的成员.我想应该有了答案. + +```go +func ModifySlice(slice []int) { + slice[2] = 1 + slice = append(slice, 4) + slice[2] = 3 +} +``` + +我把之前的`ModifySlice`方法修改了一下,然后成员没加,后面再修改回去为 3 也没有发生变化了. +这是因为 append 的时候因为容量不够扩容了,导致底层数组指针发生了改变,但是传进来的切片是外面切片的副本,修改这个切片里面的数组指针不会影响到外面的切片 + +#### 奇淫巧技 + +例如这个(go 圣经里面抄的 233),reverse 的参数是切片,但是我们需要处理的是一个数组,这里我们就可以直接用`arr[:]`把数组转化为切片进行处理 + +```go +func Test_Demo(t *testing.T) { + arr := [...]int{1, 2, 3, 4} + reverse(arr[:]) + t.Logf("%v\n", arr) +} +func reverse(s []int) { + for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { + s[i], s[j] = s[j], s[i] + } +} +``` + +> 暂时只想到这些,再有的话,以后继续补.如有错误希望指教. diff --git a/docs/dev/linux/_category_.json b/docs/dev/linux/_category_.json new file mode 100644 index 0000000..4438f30 --- /dev/null +++ b/docs/dev/linux/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Linux", + "position": 4 +} diff --git a/docs/dev/linux/解决Linux下webpack的watch模式不生效.md b/docs/dev/linux/解决Linux下webpack的watch模式不生效.md new file mode 100644 index 0000000..55a19db --- /dev/null +++ b/docs/dev/linux/解决Linux下webpack的watch模式不生效.md @@ -0,0 +1,31 @@ +> 最近在使用 webpack 打包工具的时候,使用 watch 模式不管用,最开始以为是配置的问题,将就着写者,后面同一个项目在 windows 上可以,但是我用我的 ubuntu 运行 watch 模式怎么也不管用,通过 google 找到了解决方案。 + +## 解决方案 + +Debian,RedHat 或其他类似的 Linux 发行版 + +```shell +echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p +``` + +Arch Linux + +```shell +echo fs.inotify.max_user_watches=524288 | sudo tee /etc/sysctl.d/40-max-user-watches.conf && sudo sysctl --system +``` + +在终端中输入上面的命令 + +## Why? + +这是因为在 Linux 下监控的文件有一定的限制,当我们项目的文件超过这个数量的时候,其他的文件就不会再监控,webpack 无法监测到文件的变化,所以 watch 模式就失效了 + +使用下面命令可以查看限制的数量: + +```shell +cat /proc/sys/fs/inotify/max_user_watches +``` + +## 参考 + +[https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers](https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers) diff --git a/docs/dev/后端开发/微服务架构本地尝试/01-rpc.md b/docs/dev/后端开发/微服务架构本地尝试/01-rpc.md new file mode 100644 index 0000000..b69a257 --- /dev/null +++ b/docs/dev/后端开发/微服务架构本地尝试/01-rpc.md @@ -0,0 +1,140 @@ +--- +title: 微服务架构本地尝试(一)-RPC +--- + +**本系列在 github 中更新,源码和 docker 都可在 github 项目中找到:[https://github.com/CodFrm/learnMicroService](https://github.com/CodFrm/learnMicroService)** +**GitHub 文章:[https://github.com/CodFrm/learnMicroService/blob/master/doc/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E6%9C%AC%E5%9C%B0%E5%B0%9D%E8%AF%95(%E4%B8%80)-rpc.md]()** + + + +> 微服务架构最近非常的流行,我的公司年后也准备使用微服务架构.而且之前我也很想学习接触架构层面的知识,了解一些比较前沿的东西,所以利用这个假期来尝试学习一下微服务架构. +> +> 之前我已经了解了微服务大概是一个怎么样的东西,对于一些理论的东西并不打算写太多.个人觉得微服务的技术核心在于 rpc 和服务发现/注册;思想主要是不同业务之间的拆分 +> +> 我打算尝试使用 golang 和 gRPC 框架一步一步的去摸索,带着一些问题去实践 + + + +## RPC + +RPC(Remote Procedure Call)—远程过程调用,简单来说就是,在 A 服务器上调用 B 服务器上的方法.rpc 可以通过 http 协议但不仅限于来实现.大多 rpc 框架也会支持多种协议.利用 rpc 框架可以不让我们关注 rpc 实现层,让我们调用一个远程的方法就像在本地调用一样. + +通常会将登录/注册(权限服务)拆分为一个微服务,当有一些操作(另外的微服务)需要验证某项权限时,可以通过 rpc 调用权限微服务上的方法来验证当前用户是否拥有权限.感觉像是通过 rpc 来将各个独立的微服务关联起来. + +### [gRPC](https://grpc.io/about/) + +[gRPC](https://grpc.io/about/)是 google 的一个跨语言的 rpc 框架.其实一开始是想用[rpcx](http://rpcx.site/)的,虽然中文文档挺齐全的,而且也是国人开发的,但是一搜索网上都没有什么资料,就暂时不了解了. + +### protocol buffers + +[protocol buffers](https://developers.google.com/protocol-buffers/docs/proto3)是一种轻便高效的结构化数据储存结构,这是 gRPC 默认的数据协议.我们也需要去了解一下它. + +### 开始 + +先装好 golang 环境,获取包,先用官方提供给我们的例子试一试 + +```sh +# 安装grpc +go get -u google.golang.org/grpc +# 安装Protocol Buffers v3 +go get -u github.com/golang/protobuf/protoc-gen-go +``` + +### 例子分析 + +我在 [client](https://github.com/CodFrm/learnMicroService/tree/master/examples/rpc/helloworld/greeter_client/main.go),[server](https://github.com/CodFrm/learnMicroService/tree/master/examples/rpc/helloworld/greeter_server/main.go)和[helloworld.pb.go](https://github.com/CodFrm/learnMicroService/tree/master/examples/rpc/helloworld/helloworld/helloworld.pb.go)的源码中做了一些注释,方法都可以在官方文档中看到[grpc](https://godoc.org/google.golang.org/grpc) + +```sh +# 将例子复制过来 +cp -r $GOPATH/src/google.golang.org/grpc/examples examples/rpc +# 编译例子 server和client 然后运行 +cd examples/rpc/helloworld +``` + +默认端口是 50051,我竟然不能打开,好像是被占用了,我直接就换了一个,完成. + +先运行服务端,然后运行客户端可以看到效果 + +![](img/01-rpc.assets/rpc_c_s-300x144.png) + +helloworld.pb.go 是通过的插件`protoc-gen-go`编译`helloworld.proto`生成的.虽然可以自动生成,但我还想了解一下实现的方法.然后还需要了解 proto 的语法,我们才能制作属于我们的 rpc 调用接口 + +### 定义接口 + +#### protoc + +这里就不弄太复杂了,我们可以参照例子给我们的来写,来写一个简单的,就比如权限验证,通过 token 和接口名字获取该用户信息和是否有权限使用接口. + +```sh +syntax = "proto3"; # 定义版本 +package = lms; # 包名 + +service UserAuth { # 定义服务 + # 验证token(TokenMsg),然后返回用户信息(UserMsg) + rpc isvalid(TokenMsg) returns (UserMsg) {} +} + +message TokenMsg { # 消息模型 + string token = 1; # string 字符串类型 token 名字 + string api = 2; +} + +message UserMsg { + int32 uid = 1; + bool access =2; + string name = 3; + string group = 4; +} +``` + +更复杂的消息结构还能嵌套,枚举,这里就先只用这一些 + +上面的服务定义是 单项 RPC 的形式,调用完就没了,还有 服务端流式 RPC,客户端流式 RPC 和客户端流式 RPC,具体的可以去看一下其他的文章[https://colobu.com/2017/04/06/dive-into-gRPC-streaming/](https://colobu.com/2017/04/06/dive-into-gRPC-streaming/),感觉通常单项 RPC 就可以了,其他的应该是在一些数据传输的场景使用. + +#### 生成 go 文件 + +写好 proto 文件后,我们需要用工具编译成 golang 代码.windows 需要去下载工具[https://github.com/protocolbuffers/protobuf/releases](https://github.com/protocolbuffers/protobuf/releases) + +```sh +protoc -I ./proto --go_out=plugins=grpc:./proto ./proto/learnMicroService.proto +``` + +### 编写服务 + +继续参照给我们的例子写,具体代码看我源码吧 [auth 权限验证微服务](https://github.com/CodFrm/learnMicroService/tree/master/auth/main.go) + +这里我构建了一个权限验证的微服务,然后另外构建一个发帖的,可以去看我的源码 [post 帖子微服务](https://github.com/CodFrm/learnMicroService/tree/master/post/main.go) + +主要在发帖的时候判断是否拥有权限 + +```go +ctx, cancel := context.WithTimeout(context.Background(), time.Second) +defer cancel() +userMsg, err := authService.Isvalid(ctx, µ.TokenMsg{ + Token: req.PostFormValue("token"), + Api: "post", +}) +if err != nil { + ret = "rpc调用错误" +} else if !userMsg.Access { + ret = "没有权限" +} else { + ret = userMsg.Name + "post 请求成功" + posts = append(posts, req.PostFormValue("title")) +} +``` + +我用 postman 测试: + +![](img/rpc.assets/rpc_debug_1-300x120.png) + + + + + +![](img/rpc.assets/rpc_debug_2-300x197.png) + + + +到这里,两个非常非常简陋的微服务算是完成了,一个权限验证,一个发帖 hhhh + diff --git a/docs/dev/后端开发/微服务架构本地尝试/02-api网关.md b/docs/dev/后端开发/微服务架构本地尝试/02-api网关.md new file mode 100644 index 0000000..624c9bb --- /dev/null +++ b/docs/dev/后端开发/微服务架构本地尝试/02-api网关.md @@ -0,0 +1,65 @@ +--- +title: 微服务架构本地尝试(二)-api网关 +--- + +**本系列在 github 中更新,源码和 docker 都可在 github 项目中找到:[https://github.com/CodFrm/learnMicroService](https://github.com/CodFrm/learnMicroService)** +**GitHub 文章:[https://github.com/CodFrm/learnMicroService/blob/master/doc/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E6%9C%AC%E5%9C%B0%E5%B0%9D%E8%AF%95(%E4%BA%8C)-api%E7%BD%91%E5%85%B3.md]()** + +> 上一节学习了 rpc 框架,现在有一个问题,拆开是拆开了,但是不同的服务直接对外都会提供不同的接口,上一节我只简略的为帖子服务写了接口,现在我用户要登录获取 token 了,我就得给他一个登录的接口,我现在是同一台电脑上,80 端口被帖子微服务占用了,我登录微服务难道要开 81 端口给用户服务?当然是不可能的,这时候就要用 api 网关了,当然 api 网关可不止这一个功能,授权、监控、负载均衡、缓存等都能通过 api 网关实现. +> +> 通过同一个入口,然后根据 api 的路径访问不同的微服务.顺便尝试自己做了张图,emm 感觉很差,当我们这一节结束后,我们的架构大概就是下面这样了,就像是对外一个统一的接口. + +![](img/api%E7%BD%91%E5%85%B3.assets/api_flow_chart.png) + +API 网关有很多选择,这里列举几个:[Tyk](https://tyk.io/),[Kong](https://konghq.com/),[zuul](https://github.com/Netflix/zuul)等 + +这里我选择了 Kong 来布置我的网关. + +## 开始 + +> 我本地当然是选择 Docker 安装,感觉 Docker 是真的方便,就算在 Docker 中弄错了也可以删过重来,不像在物理机上,弄错了万一还删错了东西,系统崩溃 T_T 各种毛病,而且清理起来也很方便 + +其实我尝试了几次....第一次用的 Tyk 然后发现需要收费,系统还蜜汁登陆不进去,然后就换了 Kong,然后又遇到了一个大坑,安装的版本是 1.0.2,我 Google 搜索到推荐的面板是`kong dashboard`结果这个很长没维护了,好不容易安装好了,结果最高只支持 0.15 版本=\_=,只怪当初没仔细看这些吧....我还以为这个是官方维护的项目,然后又搜到了一个面板`konga`,终于折腾好了,效果如下. + +![](img/api%E7%BD%91%E5%85%B3.assets/api_dashboard.png) + +注册一个账号,然后填好参数之后就可以进去了. + +### 安装 + +搭建请使用 Docker,我已经将 docker-compose 写好了,直接在项目根目录执行: +`docker-compose up`就可以了,这里还有一个要注意的地方就是需要先运行**kong_migrations**,生成数据库文件,如果没有那么**kong**会运行失败.我是运行之后,如果**kong**报错就手动重启**kong_migrations**容器然后再运行**kong**容器的. + +参考文档: + +- [konga 面板](https://github.com/pantsel/konga/blob/master/README.md) +- [kong docker 安装](https://docs.konghq.com/install/docker/?_ga=2.219796185.1115565600.1548736826-1002927840.1548736826) +- [konga 文档](https://pantsel.github.io/konga/) + +api 网关默认地址:[http://127.0.0.1:8000/](:http://127.0.0.1:8000/),不过现在还没添加 api,返回的是`{"message":"no Route matched with those values"}` + +面板默认地址:[http://127.0.0.1:1337/](http://127.0.0.1:1337/) + +### 使用 + +点击到`SERVICE`中,添加一个新的服务,我把我上一节的帖子服务加入进去,如图 + +![](img/api%E7%BD%91%E5%85%B3.assets/api_add_service.png) + +后面的默认就行,Url 可以为空,如果写的话可以写:http://10.0.75.1:8004/,添加后其实会自动分解成下面的选项(这里帖子服务的端口和我kong admin 的端口冲突了,所以我改成了 8004) + +10.0.75.1 是我主机的 ip 地址(在 docker 中) + +service(服务)在这里的概念可以对应我们的微服务,将我们微服务暴露的接口通过上面的步骤添加进去,配置中的 upstream server(上游服务)就是我们微服务的一些 ip 信息,协议那里是 http 或 https,不过 kong 1.0 好像已经开始支持 gRPC 了,还没去研究. + +添加完服务之后,到 service 里去查看,然后添加 route + +![](img/api%E7%BD%91%E5%85%B3.assets/api_add_route.png) + +主要是 paths 和 methods,paths 是匹配的路径,我这里写的/v1,methods 允许 GET 和 POST + +![](img/api%E7%BD%91%E5%85%B3.assets/api_kong_demo.png) + +浏览器输入[http://127.0.0.1:8000/v1/post](http://127.0.0.1:8000/v1/post)成功得到结果 + +kong 还有很多强大的功能,还可以授权,统计,负载均衡等等,也有丰富的插件,不过暂时我还用不到,先到这里,下一节预计开始研究 服务注册/发现 diff --git a/docs/dev/后端开发/微服务架构本地尝试/03-服务发现.md b/docs/dev/后端开发/微服务架构本地尝试/03-服务发现.md new file mode 100644 index 0000000..f1e2b70 --- /dev/null +++ b/docs/dev/后端开发/微服务架构本地尝试/03-服务发现.md @@ -0,0 +1,182 @@ +--- +title: 微服务架构本地尝试(三)-服务发现 +--- + +**本系列在 github 中更新,源码和 docker 都可在 github 项目中找到:[https://github.com/CodFrm/learnMicroService](https://github.com/CodFrm/learnMicroService)** +**GitHub 文章:[点我去 GitHub 看]()** + +> 上一节完成了 api 网关,这一节来了解微服务架构中的服务发现 +> +> 我们现在的微服务 rpc 调用我们是直接的填入的 ip 和端口,客户端连接服务端.但是当我们的微服务多起来,而且是集群部署那么问题就出来了,我们不可能每一个都填好 ip 和端口,这样是不方便动态扩容和部署的,而且当我们调用的时候也无法做到很好的负载均衡.关于这个有两种模式,客户端服务发现和服务端服务发现,这里我们只探讨服务端服务发现 +> +> 那么我们就需要一个服务中心,微服务进程创建的时候告诉他,我能提供 xx 服务,我的 ip 端口是 xx,然后其他的微服务或客户需要调用的时候来服务中心问,我需要 xx 服务的信息就 OK 了 + +![](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_chart.png) + +服务发现的框架常见的有 + +- zookeeper +- eureka +- etcd +- consul + +这里我们选择[Consul](https://www.consul.io/)来实现 + +## 开始 + +> 自然和之前一样,继续用我们的 docker + +docker-compose.yml 中直接加入如下,然后访问 8500 端口就可以进入面板了 + +```yml +service_center: + image: consul + hostname: service_center + container_name: micro_service_center + ports: + - 8500:8500 + - 8600:8600 + - 8300:8300 + networks: + - micro +``` + +![](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_consul.png) + +## 使用 + +### 服务注册/发现 + +[https://www.consul.io/api/agent/service.html#register-service](https://www.consul.io/api/agent/service.html#register-service) + +服务注册使用 api,发送请求,这里我用 postman 先来测试添加 + +官网给了一个例子 + +```json +PUT /agent/service/register json + +{ + "ID": "redis1",# 服务id + "Name": "redis",# 服务名 + "Tags": [# 标签 + "primary", + "v1" + ], + "Address": "127.0.0.1",# 服务地址 + "Port": 8000,# 服务端口 + "Meta": {# 服务的一些信息 + "redis_version": "4.0"#表示redis版本 + }, + "EnableTagOverride": false,# 是否开启Tag覆盖,更多细节请参考:https://www.consul.io/docs/agent/services.html#enable-tag-override-and-anti-entropy 我也看不太懂啊,hhh + "Check": {# 校验规则 + "DeregisterCriticalServiceAfter": "90m", + "Args": ["/usr/local/bin/check_redis.py"], + "HTTP": "http://localhost:5000/health", + "Interval": "10s", + "TTL": "15s" + }, + "Weights": {# 权重,应该是用于负载均衡的 + "Passing": 10, + "Warning": 1 + } +} +``` + +我先尝试自己添加几个服务,然后我的面板上就有了一个新的**post_micro**服务,点进去,虽然都挂了 emmmm 因为我现在还没开启 + +![](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_2.png) + +![](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_3.png) + +```sh +curl -X PUT \ + http://127.0.0.1:8500/v1/agent/service/register \ + -H 'Content-Type: application/json' \ + -H 'Postman-Token: b2089dbe-8ad3-487b-97e0-25217e6ee346' \ + -H 'cache-control: no-cache' \ + -d '{ + "ID": "post2", + "Name": "post_micro", + "Tags": [ + "post", + "v1" + ], + "Address": "10.0.75.1", + "Port": 8004, + "Check": { + "DeregisterCriticalServiceAfter": "90m", + "HTTP": "http://10.0.75.1:8004/post", + "Interval": "10s" + } +}' +``` + +然后 consul 也提供了服务发现(查询)的接口,来试一试,除了这种接口的方式外,还可以使用 DNS,我们只要如果配合 kong 的话需要用这种形式,等下介绍.post_micro 就是我们的服务名了 + +```sh +curl -X GET \ + http://127.0.0.1:8500/v1/catalog/service/post_micro \ + -H 'Postman-Token: ce54bd1d-c21e-46e0-ae0e-0230de9e6f8d' \ + -H 'cache-control: no-cache' +``` + +域名默认格式为 servicename.service.consul + +```sh +/ # dig @127.0.0.1 -p 8600 post_micro.service.consul SRV + +; <<>> DiG 9.11.5 <<>> @127.0.0.1 -p 8600 post_micro.service.consul SRV +; (1 server found) +;; global options: +cmd +;; Got answer: +;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25596 +;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 5 +;; WARNING: recursion requested but not available + +;; OPT PSEUDOSECTION: +; EDNS: version: 0, flags:; udp: 4096 +;; QUESTION SECTION: +;post_micro.service.consul. IN SRV + +;; ANSWER SECTION: +post_micro.service.consul. 0 IN SRV 1 1 8005 0a004b01.addr.dc1.consul. +post_micro.service.consul. 0 IN SRV 1 1 8004 0a004b01.addr.dc1.consul. + +;; ADDITIONAL SECTION: +0a004b01.addr.dc1.consul. 0 IN A 10.0.75.1 +service_center.node.dc1.consul. 0 IN TXT "consul-network-segment=" +0a004b01.addr.dc1.consul. 0 IN A 10.0.75.1 +service_center.node.dc1.consul. 0 IN TXT "consul-network-segment=" + +;; Query time: 0 msec +;; SERVER: 127.0.0.1#8600(127.0.0.1) +;; WHEN: Wed Jan 30 05:02:21 UTC 2019 +;; MSG SIZE rcvd: 266 +``` + +因为 kong 要用 consul 的 dns,整合起来,然后到这里的时候遇到个坑...首先需要 ip 地址,不能是 hostname 了...然后我是在 docker 里面...还需要 docker-compose 静态 ip,可以看我的 compose 文件的变化,然后设置了一个`KONG_DNS_RESOLVER`参数,但还不行,因为你的 dns 变了,`KONG_PG_HOST`之前是 hostname,现在我的 dns 不能解析,所以也要给数据库设置一个静态 ip(设置静态 ip 主要是防止变化后不能使用).之前的容器最好 down 掉,network 也删除,重新来一遍 + +成功之后在 konga 面板的 info 中可以看到 dns_resolver 是我们设置的值了 + +![](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_4.png) + +### 接入网关 + +然后和前一节一样,添加 service,因为我重新构建了,所以之前的数据是没了的,也没关系,重新来 + +![添加service](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_5.png) + +![添加route](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_6.png) + +有没有发现我前面是添加了两个不同的端口,然后这里没有添加端口了,是的,consul 帮你自动匹配了,负载均衡了解一下,你就当我这俩是集群好了,效果的话,我故意的文件改了一下,刷新出来的页面不同(我只是为了演示效果,实际是绝对不行的...) + +![](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/service_7.png) + +## End + +这一节感觉还不算完全完成,注册和发现的代码我们还没写呢 + +![](img/03-%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0.assets/bqb_1.jpg) + +留到下一节好了,今天几乎是配置了一天的环境,下一节预计就要开始容器化微服务了,然后等下吧文章搬到博客去,之前没直接放博客的原因主要是怕半途弃坑,多丢人,2333 diff --git a/docs/dev/后端开发/微服务架构本地尝试/04-容器.md b/docs/dev/后端开发/微服务架构本地尝试/04-容器.md new file mode 100644 index 0000000..4ee5367 --- /dev/null +++ b/docs/dev/后端开发/微服务架构本地尝试/04-容器.md @@ -0,0 +1,90 @@ +--- +title: 微服务架构本地尝试(四)-容器 +--- + +> 容器的好处就不多说了,一次构建到处运行.对于微服务来说,需要将各个微服务部署到多个主机上,而且所需要的环境还不一定相同,甚至冲突,那么容器就很好的解决了这个问题,容器所占用的资源比虚拟机小多了.而且容器部署起来很是方便.然后 go 和 docker 也是很配的一对,go 编译之后可以直接的放入容器中运行,而不需要依赖环境. +> +> 这一节的话我们还需要在代码里面种加入服务发现和注册的功能,以便在容器中能够动态扩容. + +![](img/04-%E5%AE%B9%E5%99%A8.assets/4_1.png) + +## 服务注册 + +先获取开发包 + +```shell +go get -u github.com/hashicorp/consul +# 其实好像不要-u...我习惯加上然后帮我编译了... +``` + +我另外封装了一下,可以去看我的代码[consul](https://github.com/CodFrm/learnMicroService/blob/master/common/consul.go) + +这里另外说一下,consul 的 tag,我们解析的时候可以带上 tag + +例如我这里的发帖微服务,一个是对外的 restful,一个是内部的 rpc,我们可以注册两个相同名字的服务,然后给他们打上 tag,解析的时候 tag 可以放最前面,例如:restful.post_micro.service.consul + +Demo: + +```go +//注册服务 + rpcService := consul.Service{ + Name: "auth_micro", + Tags: []string{"rpc"}, + Address: consul.LocalIP(), + Port: 5000, + } + defer rpcService.Deregister() + err = rpcService.Register() + +//使用 + rpcService := consul.Service{ + Name: "auth_micro", + Tags: []string{"rpc"}, + } + rpcConn, err = rpcService.GetRPCService() +``` + +## Dockerfile + +go 的话我们可以多阶段构建,第一阶段编译,第二阶段运行,这样可以减小我们最终的镜像大小.我们可以先把 golang 的镜像 pull 下来`docker pull golang`然后基于这个镜像来编译,然后再吧编译好的放到第二阶段中运行,我们可以选择最小的 alpine 来运行 + +> 这里又遇到坑,我要获取一些被墙了的包...然而我容器里面又没有工具...后面只好再装一个镜像来折腾了,然而不支持 google.golang.org...只能 git clone 了,我有点遭不住 +> +> ![](img/04-%E5%AE%B9%E5%99%A8.assets/bqb_2.jpg) +> +> 为了做好这个镜像,还用了个奇淫巧技...在后面加入`;exit 0`防止报错停止构建 + +emmmm 上面放弃了,git clone 下来还有些依赖,依赖又需要去 clone,太复杂了,然后我灵机一动...好像可以直接用我的代理...真香... + +```sh +ENV HTTP_PROXY=http://10.0.75.1:1080/ \ + HTTPS_PROXY=http://10.0.75.1:1080/ +``` + +折腾了挺久....算是吧 dockerfile 写好了,然后在 docker-compose 里面添加两个服务,post 端口暴露出来,我就可以直接试试能不能访问了 + +```yaml +post_1: + image: post:latest + container_name: micro_post_micro_1 + ports: + - 8004:8004 + networks: + - micro + +auth_1: + image: auth:latest + container_name: micro_auth_microo_1 + networks: + - micro +``` + +![](img/04-%E5%AE%B9%E5%99%A8.assets/4_2.png) + +直接运行 compose,一次成功,很是欣慰 + +![](img/04-%E5%AE%B9%E5%99%A8.assets/4_3.png) + +右边那个就是我们容器中运行的了,有一个报错的,没有自动清理掉,consul 好像不能自动清理,可以在健康监测那里添加一个`DeregisterCriticalServiceAfter`参数,到期删除,不知道能不能设置一个比较短的时间,然后每隔一段时间就重新注册一次服务,刷新有效期这样达到自动清理的效果.或者结束的时候调用注销方法(但是在容器里面每次都是强制结束...没有调用到注销的方法) + +到这里的时候我们已经可以将我们的微服务集群动态扩容了,但是还缺少很多东西这一节就到这里了....然后还需要用到数据库重写一下服务,或者选一个 web 框架,后面还有难点要整. diff --git a/docs/dev/后端开发/微服务架构本地尝试/05-数据库拆分.md b/docs/dev/后端开发/微服务架构本地尝试/05-数据库拆分.md new file mode 100644 index 0000000..b2cfa16 --- /dev/null +++ b/docs/dev/后端开发/微服务架构本地尝试/05-数据库拆分.md @@ -0,0 +1,64 @@ +--- +title: 微服务架构本地尝试(五)-数据库拆分 +--- + +> 原本打算是用 k8s 的,但是这么一弄感觉越来越往运维方向走了.现在的网关和服务中心已经够用了.所以只写了一部分,作为附录,如果以后有时间会继续填坑. +> +> 这一节的话,主要是数据库拆分和我们之前分开的两个微服务(权限和发帖)接上数据库(主要是代码). + +## 未拆分前 + +![](img/05-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8B%86%E5%88%86.assets/5_db_1.png) + +未拆分前,我们的架构大概是这样的,所有的微服务从同一个数据库中请求,这样的好处是简单,但是微服务之间的关系又觉得没有区分开来,微服务架构的一个非常明显的功能就是一个服务所拥有的数据只能通过这个服务的 API 来访问. + +## 拆分后 + +![](img/05-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8B%86%E5%88%86.assets/5_db_2.png) + +拆分后大概是上图这样,一个微服务对应一个数据库,这样更容易微服务的扩展,而且微服务的独立性更强,其中一个数据库蹦了之后也不会互相影响.看起来是有点像分库分表,拆分后的好处明显,但是带来的困难也很明显.分布式事务,跨服务查询等等一些问题.后面就要去解决这些问题. + +在本地,我使用 compose 搭建了两个容器来模拟这种情况 + +```yaml +post_db: + image: mysql + hostname: post_db + container_name: micro_post_db + environment: + - MYSQL_USER=post + - MYSQL_ROOT_PASSWORD=micro_db_pwd + - MYSQL_DATABASE=post + ports: + - 3308:3306 + networks: + - micro + +auth_db: + image: mysql + hostname: auth_db + container_name: micro_auth_db + environment: + - MYSQL_USER=auth + - MYSQL_ROOT_PASSWORD=micro_db_pwd + - MYSQL_DATABASE=auth + ports: + - 3307:3306 + networks: + - micro +``` + +名字也能看出一个是帖子的数据库一个是用户的数据库,然后在代码中,数据库连接那里的 ip 要更改成对应的`hostname`. + +```go +//连接数据库 +err = db.Connect("127.0.0.1", 3306, "root", "", "test") +//查询帖子列表 +rows, err := db.Query("select a.id,b.user,a.title from posts as a join user as b on a.uid=b.uid") +``` + +之前是使用的本地 ip,不过更改完后,我们的帖子服务中的 GET 请求获取帖子列表是无法使用的.因为用到了 join 查询用户表中的用户名,现在我们已经将数据库拆分开来了,物理上帖子数据库中是没有用户数据的.然后报出如下错误 + +![](img/05-%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8B%86%E5%88%86.assets/5_post.png) + +这一节主要就是将代码进行了修改使用了数据库,然后用 compose 搭建了两个数据库.后面几节将解决拆分分库之后出现的一些问题. diff --git a/docs/dev/后端开发/微服务架构本地尝试/06-聚合数据.md b/docs/dev/后端开发/微服务架构本地尝试/06-聚合数据.md new file mode 100644 index 0000000..146709f --- /dev/null +++ b/docs/dev/后端开发/微服务架构本地尝试/06-聚合数据.md @@ -0,0 +1,165 @@ +--- +title: 微服务架构本地尝试(六)-聚合数据 +--- + +> 微服务架构中,每个微服务所拥有的数据对当前微服务来说是私有的,只能通过其提供的 API 进行访问.我们需要实现业务的事务在多个服务之间保持一致性,还有就是不同服务中数据的数据聚合. +> +> 最终我选择了尝试领域驱动设计和 CQRS,可以从 git 看到我对本节有不少改变=\_=,尝试一下,希望不要误人子弟,对于理论的知识我也不会在本文中写太多,我会贴我觉得不错的一些文章. + +## 方案 + +这一节将来探究不同的微服务之间,不同服务中数据的数据聚合.我将列出几种方法. + +### 字段冗余 + +这一种方法是在查询的表中增加一些字段存储另外一些表的数据,这种方法实现起来比较方便,但是需要改变表结构,而且如果所需要的字段比较多,这又会出现不少问题. + +### 业务中合并 + +通过调用所需要的微服务接口得到数据,使用代码将数据合并起来,达到 join 的效果.这种方法虽然对数据库没有什么影响,而且也符合微服务的思想,但是性能损耗过大. + +### 数据库 FEDERATED 引擎 + +MySQL 数据库能够使用 FEDERATED 引擎映射所需要的表,有点像复制但并不是的,然后可以使用 join 查询达到我们想要的效果.这个也许是一个不错的解决方案,但是不符合我们微服务的设计思想,不易于独立交付,对方微服务表结构修改之后可能会出现问题. + +### 共享数据库 + +将需要 join 的数据表放在同一个数据库上,其余的还是作为独立的数据库.感觉优缺点和上面差不多. + +### CQRS 架构 + +命令查询的责任分离 Command Query Responsibility Segregation (简称 CQRS)模式是一种架构体系模式,能够使改变模型的状态的命令和模型状态的查询实现分离。这是微服务跨数据库查询的一个比较流行的解决方案,具体怎么样我也不细说了,怕误人子弟 + +![](img/06-%E8%81%9A%E5%90%88%E6%95%B0%E6%8D%AE.assets/bqb_3.jpg) + +### 事件驱动架构(EDA) + +CQRS 使用了 EDA 的思想,所以感觉起来非常的相似,CQRS 的 C 可以是同步实现,也可以为异步.EDA 则是异步,也没有 Event Store 的要求. + +## CQRS+DDD(领域驱动设计) + +### DDD + +对于领域驱动设计,我觉得不要去考虑数据库,当做数据库不存在去创建我们的模型,不然很难脱离原来的设计方式.应该是数据库来迎合我们,而不是去迎合数据库.我们的数据都是存储在内存当中,也就是内存保存到数据库. + +然后对于领域模型存储到数据库中可以使用一个中间件转换,而不是将 sql 写在领域模型中. + +实体和值对象: + +> 引用于:[https://www.cnblogs.com/youxin/archive/2013/05/25/3099175.html](https://www.cnblogs.com/youxin/archive/2013/05/25/3099175.html) + +- 实体核心是用唯一的标识符来定义,而不是通过属性来定义。即即使属性完全相同也可能是两个不同的对象。同时实体本身有状态的,实体又演进的生命周期,实体本身会体现出相关的业务行为,业务行为会实体属性或状态造成影响和改变。 +- 值对象 Value Object,它用于描述领域的某个方面本身没有概念标识的对象,值对象被实例化后只是提供值或叫设计元素,我们只关心这些设计元素是什么?而不关心这些设计元素是谁。书里面谈到颜色,数字是常见的值对象。这种对象无状态,本身不产生行为,不存在生命周期演进。 + +### 思路 + +> 之前我认为是使用 CQRS 维护物化视图,实际我们所维护的物化视图就是我们的数据库(因为之前我认为物化视图只是展示给用户看的一个表,数据库中还需要在原来的表中存储一次数据),我的思想还是停留在迎合数据库上,虽然这看上去并没有什么区别. + +我现在的思路是这样的(现在我们的发帖和权限两个微服务来说),使用 kafka 作为消息中间件,发布事件. + +这个版本,我加入一个积分的微服务,当发送一条帖子时,增加积分.这只是一个小功能,我偷懒的将它和认证服务放在了一起. + +用户改名的时候发布一条 user_update_msg 消息,然后订阅这个消息,修改用户名.(我认为如果在业务中用户名是不允许修改的话,可以将其作为值对象,如果允许修改且要随之变化的话,应该将用户作为一个实体,也需要实现这一消息,这些都是对于发帖微服务来说的) + +~~然后关于发帖或者回帖时发布一个 post_msg/post_reply_msg 消息,对于这个看上去感觉是没有必要发送消息的,让系统变得更复杂,我们可以直接的写入 Q 端数据库.不过加入事件也有好处,假设当我们再加入一个积分微服务的时候,我们就不需要再改代码了,直接订阅该消息.~~ + +我放弃了回帖功能- -...改为积分功能,积分微服务订阅事件,进行处理 + +如果之前的数据迁移的话,我想的是创建数据库的时候,使用微服务 api(或者直接将数据复制过来进行操作),在代码中聚合数据,按照符合现在结构的方式插入,不知道这是不是一个可行的方法. + +这一切都是一个菜鸡的尝试...如果不正确希望能够得到指教. + +## 实现 + +### kafka + +> Event Store 和 MQ 我们使用 Kafka,虽然用 Kafka 作为事件溯源不一定是好的,但是它能用啊. + +依旧使用 docker 来搭建我们的环境,由于 Kafka 的基于集群的高可用特性是建基于 Zookeeper(称 zk)之上的,因此构建可用的 Kafka 镜像,是需要依赖于 zk 基础的. + +```yaml +zookeeper: + image: wurstmeister/zookeeper + hostname: zookeeper + container_name: micro_zookeeper + ports: + - 2181:2181 + networks: + - micro + +kafka_mq: + image: wurstmeister/kafka + hostname: kafka_mq + container_name: micro_kafka_mq + environment: + - KAFKA_ADVERTISED_HOST_NAME=10.0.75.1 + - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 + ports: + - 9092:9092 + networks: + - micro + +kafka_manager: + image: sheepkiller/kafka-manager + container_name: micro_kafka_manager + depends_on: + - zookeeper + environment: + - ZK_HOSTS=zookeeper + ports: + - 9000:9000 + networks: + - micro +``` + +9000 端口是 kafka 的一个 web 管理,后来感觉不好用...可以考虑去掉,我用了一个桌面的程序,kafka tools + +kafka 还有挺多概念的,这里的话我就不细说了.我在 examples 下写了一个 demo,大家可以去看看,效果如下,大概模拟的多个微服务(群组 1 和群组 2 为两个微服务)消费一条事件(不能重复消费,然后分布到不同的微服务实例上) + +![](img/06-%E8%81%9A%E5%90%88%E6%95%B0%E6%8D%AE.assets/6_1.png) + + + +### CQRS + +![](img/06-%E8%81%9A%E5%90%88%E6%95%B0%E6%8D%AE.assets/cqrs.jpg) + + + +我创建了一个 ddd 的目录,里面包括了下面这些文件夹: + +- commands 命令事件以及命令处理(图中的 Command Bus 和 Command Handler) +- events 领域事件和事件处理器 +- domain 领域模型(放置聚合根之类) +- repository 领域模型持久化仓库 +- services 领域服务 + +command 由 user interface(Controller 之类的)生成然后分配到 command bus,然后由 command bus 分配给 command handler 处理,之后给 domain services 处理业务逻辑 + +我们将原来的代码进行大量修改,主要是之前服务注册,连接数据库什么的都一股脑写在了 main 函数里面....现在我们进行了一些分层,使用写配置的方式来启动,有些地方也可以使用 IoC 来进行解耦 + +现在启动方式变成了这样,docker 和 docker-compose 也进行了修改,其中有对 postgres 数据库进行了一些修改(主要是因为 windows10 下的 docker 有个 bug,不能持久化数据) + +这里因为 kafka 的原因...启动之后微服务可能会出现 kafka 连接不成功的问题,因为 kafka 容器启动之后不一定端口那些服务也启动了...所以可能需要手动启动一下微服务,我使用的 vscode + +![](img/06-%E8%81%9A%E5%90%88%E6%95%B0%E6%8D%AE.assets/6_2.png) + +```shell +go run auth #启动auth微服务 +go run post #启动post微服务 +``` + +![](img/06-%E8%81%9A%E5%90%88%E6%95%B0%E6%8D%AE.assets/6_3.png) + +效果暂时就是现在这样- -... + +下一节开始学习分布式事务 + +## 参考 + +- [https://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html](https://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html) +- [https://juejin.im/entry/58a15a4e0ce4630056440166](https://juejin.im/entry/58a15a4e0ce4630056440166) +- [https://www.jianshu.com/p/d4ca2133875c](https://www.jianshu.com/p/d4ca2133875c) +- [https://www.cnblogs.com/daoqidelv/p/7499662.html](https://www.cnblogs.com/daoqidelv/p/7499662.html) +- [https://www.cnblogs.com/KendoCross/p/9480955.html](https://www.cnblogs.com/KendoCross/p/9480955.html) +- [https://www.cnblogs.com/netfocus/archive/2012/02/12/2347938.html](https://www.cnblogs.com/netfocus/archive/2012/02/12/2347938.html) diff --git a/docs/dev/后端开发/微服务架构本地尝试/07-分布式事务.md b/docs/dev/后端开发/微服务架构本地尝试/07-分布式事务.md new file mode 100644 index 0000000..b746d2c --- /dev/null +++ b/docs/dev/后端开发/微服务架构本地尝试/07-分布式事务.md @@ -0,0 +1,172 @@ +--- +title: 微服务架构本地尝试(七)-分布式事务 +--- + +> 来了解一下分布式事务,事务简单来说就是:"要么什么都不做,要么做全套" + +## 本地事务 + +平常我们的事务都是在同一个数据库中执行. + +举个栗子:当你发帖的时候,需要发表帖子存入数据库,然后再给这个发帖的用户增加积分.如果帖子存入数据库失败,那么就不再往下执行;但是你增加积分失败了,然而你的帖子已经发布出去了,总不可能再去删除刚刚发的那条帖子吧.如果你使用了事务的话,那么可以在一项失败的时候,回滚事务,一切就像没有发生一样. + +### ACID 模型 + +说到事务就不得不说 A(原子性)C(一致性)I(隔离性)D(持久性),来贴一下百科说明. + +- Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。 +- Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。 +- Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 +- Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 + +## 分布式事务 + +像上面一样的场景,但是这个时候我们是微服务架构啦.帖子数据库和积分数据库不在一起,他们分别在两个不同的数据库上面. + +如果发帖失败,我们可以选择不再往下走,增加积分(我就当发帖先执行,积分增加后执行).但是如果发帖成功了,但是积分增加失败,这样就导致了数据的不一致.这种情况还算好,但是如果订单下成功了,钱没扣,造成的损失就大了不是. + +于是我们需要通过一些手段,实现不同数据库之间的事务,这就是分布式事务了. + +还有一些分库分表的应用也会用到分布式事务. + +### CAP 定理 + +CAP 定理指的是在分布式**系统**中最多只能满足 C,A,P 中的两个需求. + +#### 一致性(Consistency) + +一致性指的在不同的服务器中,数据都是一致的.在分库分表的环境下,这个一致指的是 A 库中的 A 表和 B 库中的 A 表里面的数据是一模一样的;在我们上面所说的场景中指的是,发帖应得到的积分,和我们实际的积分数量应该是一致的.(为什么说这些,因为我感觉好多地方说的一致都是指的前者,我这个理解应该没错吧 hhh) + +一致性也可以分为下面 3 类 + +- 强一致性:执行完成后,后面不管什么时候读取,数据都是更新完毕后的.比如发完贴之后,我立刻就可以看到我的积分增加. +- 弱一致性:执行完成后,不能保证数据会更新,多久会更新.比如发完贴之后,过了很久很久,我的积分都不一定变化了.(感觉是不是失败了...可能是某些场景下的吧) +- 最终一致性:执行完后,一段时间内,数据更新.比如发帖完之后,过了一两秒,我就能看到我的积分变化了.这个是弱一致性的一种特殊情况,大多数分布式系统也是采用这种模式. + +#### 可用性(Availability) + +每一次请求,都能得到服务器的非错响应. + +可用性好理解,就是系统能否使用呗.能够访问帖子数据也能够访问积分数据库,这就算可用了,但是中间一项宕机那么这个系统就是不可用了(因为完成不了这个操作). + +#### 分区容错性(Partition tolerance) + +因为网络或者机器故障等影响,数据可能无法送达,还要保证系统能够继续正常运行,这时候我们需要在 CA 中做出选择. + +又拿我上面的场景举个栗子: + +我发帖服务器的数据无法传达给积分数据库. + +如果我选择 A 可用性,那就是不理会积分数据库宕机,就会导致 C 不一致;如果我选择 C 一致性,那就回滚事务,不能够发帖成功,A 不可用. + +如果是成年人我全都要 + +![](img/07-%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1.assets/bqb_4.gif) + +我又要可用,又要一致.那我们基本就是是单机系统了,没有了 P,也就没有了网络因素,然后因为单机爆炸,一无所有. + +分布式系统的话,因为无法 100%保证数据是否到达,必定会出现分区现象,当一旦出现故障,那么就必须选择 P,如果不选的话间接造成 CA 错误(数据不回滚,还特么报错),一无所有,所以按照 CAP 理论来说,分布式 P 是必选项. + +### BASE 模型 + +BASE 模型是对 CAP 中 AP 的一个扩展. + +- Basically Available 基本可用,出现故障时,允许损失部分可用的功能,保证核心功能可用. +- Soft state 软状态,允许系统中存在中间状态,这个状态不影响系统可用性,这里指的是 CAP 中的不一致. +- Eventually consistent 最终一致,一段时间后数据达到一致. + +上一节中的 CQRS 和 EDA 就是属于这种模型,面向最终一致性. + +## 分布式事务解决方案 + +大多数情况下,我们还是遵循不用分布式事务就不用分布式事务.这里是因为我们的微服务引出分布式事务. + +下面列出一些分布式事务的解决方案. + +### CQRS/EDA + +先来说说我们上一节所用到的 CQRS,这种架构就是依赖 MQ 来保证的最终一致性 + +在本地开启一个事务,然后通过 MQ 发送一个消息,消息发送成功,完成事务,消息发送失败回滚事务.消息发送成功后就不用再考虑我们的发帖服务了,直接反馈给用户成功. + +然后再通过 MQ 将消息发送到积分服务,如果这时候积分服务是不可用的,那么这条消息就会存储在 MQ 中,当积分服务复活时,再继续吧消息推送给积分服务,直到积分服务告诉 MQ 成功了为止,达到最终一致. + +这个架构基本符合上面的 BASE 模型. + +### 2PC(两阶段提交) + +顾名思义就是两个阶段 0.0,感觉有点像五大流氓的投票,主流数据库也有相关的实现. + +首先得有一个协调者(coordinator),若干参与者(participant) + +#### 第一阶段 + +协调者:我们来商量一件事情 + +- 参与者 1:收到 +- 参与者 2:收到 +- 参与者 3:收到 + +如果有一个参与者没有收到,表示不能提交,不再继续执行. + +#### 第二阶段 + +协调者:好了,都商量好了,执行吧 + +- 参与者 1:收到 +- 参与者 2:收到 +- 参与者 3:收到 + +如果有一个参与者,不干(执行失败之类的),那么协调者就会通知其他参与者算了不干了(回滚) + +这个方案虽然简单,主流数据库也有相关实现,但是因为单个协调者,同步堵塞的问题不太适合高并发的场景. + +### TCC(Try-Confirm-Cancel) + +- Try:对所有业务进行检查,并预留必须业务资源 +- Confirm:执行业务,不做用进行检查,只能使用 Try 阶段预留的业务资源. +- Cancel:取消业务执行,回滚事务. + +Confirm 和 Cancel 的操作要求幂等(不管执行多少次,结果都是一样的) + +假设 A 花 3 元买一瓶快乐水 + +Try 阶段:先检查 A 是否有足够的钱,水是否有足够的货;然后锁住 A 的金额和水的库存.如果全部成功进入 confirm 阶段,否则 cancel 阶段 + +Confirm 阶段:减去 A 中的钱和水的库存(只操作 Try 预留的业务资源);如果执行失败,继续进行 Confirm(所以要求幂等);直到执行成功为止. + +Cancel 阶段:取消锁,或者回滚操作;如果执行失败也继续重试 Cancel,直到成功为止. + +Confirm 和 Cancel,应该是可以异步的,适合于一些要求隔离性高,一致性强的业务. + +### Saga + +Saga 将各个事务拆分出来变成若干小事务$T_i$,每一个小事务都对应着一个回滚操作$C_i$.其中每一个操作也要求是幂等,而且$C_i$要求肯定是成功. + +Saga 的执行顺序也很好理解: + +成功顺序:$T_1>T_2>T_3>...T_n$ + +失败顺序:$T_1>T_2>...T_i>C_i>C_(i-1)...>C_2>C_1$ + +Saga 也可以不需要取消操作,但是要求 T 最终是成功的,失败重试,一直到成功为止. + +对比 TCC 来说,Saga 的隔离性没有 TCC 的强,而且撤销操作每一步都需要一个 C(虽然不需要可以重试),感觉上是 TCC 更好,但是既然存在肯定是有它所使用的场景的. + +如果再拿上面的场景举例子,就变成了下面这样: + +成功:A 扣钱->水减货 + +失败:A 扣钱->水减货失败->回滚水减货->回滚 A 扣钱 + +感觉更适合有多步操作,而不需要立刻到达最终状态的场景 + +例如购买商品: + +| 事务 | 取消 | +| -------- | -------- | +| 发起订单 | 取消订单 | +| 付款 | 退款 | +| 发货 | 回库 | +| 收货 | 退货 | +| 完成 | 打款 | diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/01-rpc.assets/rpc_c_s-300x144.png b/docs/dev/后端开发/微服务架构本地尝试/img/01-rpc.assets/rpc_c_s-300x144.png new file mode 100644 index 0000000..0c6540e Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/01-rpc.assets/rpc_c_s-300x144.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/bqb_1.jpg b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/bqb_1.jpg new file mode 100644 index 0000000..c97d7d2 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/bqb_1.jpg differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_2.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_2.png new file mode 100644 index 0000000..ed78fa7 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_2.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_3.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_3.png new file mode 100644 index 0000000..d2a8714 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_3.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_4.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_4.png new file mode 100644 index 0000000..54108b5 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_4.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_5.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_5.png new file mode 100644 index 0000000..9f8e301 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_5.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_6.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_6.png new file mode 100644 index 0000000..37d02a6 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_6.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_7.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_7.png new file mode 100644 index 0000000..16d42a7 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_7.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_chart.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_chart.png new file mode 100644 index 0000000..3638fc6 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_chart.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_consul.png b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_consul.png new file mode 100644 index 0000000..2cf206d Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/03-服务发现.assets/service_consul.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_1.png b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_1.png new file mode 100644 index 0000000..d0b2cb5 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_1.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_2.png b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_2.png new file mode 100644 index 0000000..c7c96f9 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_2.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_3.png b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_3.png new file mode 100644 index 0000000..eed8667 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/4_3.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/bqb_2.jpg b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/bqb_2.jpg new file mode 100644 index 0000000..fc1acfe Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/04-容器.assets/bqb_2.jpg differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_db_1.png b/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_db_1.png new file mode 100644 index 0000000..d6d1efa Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_db_1.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_db_2.png b/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_db_2.png new file mode 100644 index 0000000..34a0937 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_db_2.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_post.png b/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_post.png new file mode 100644 index 0000000..4cbba40 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/05-数据库拆分.assets/5_post.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_1.png b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_1.png new file mode 100644 index 0000000..6e2e312 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_1.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_2.png b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_2.png new file mode 100644 index 0000000..8075dfd Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_2.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_3.png b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_3.png new file mode 100644 index 0000000..8c46dd3 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/6_3.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/bqb_3.jpg b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/bqb_3.jpg new file mode 100644 index 0000000..c23130a Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/bqb_3.jpg differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/cqrs.jpg b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/cqrs.jpg new file mode 100644 index 0000000..6f4daa1 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/06-聚合数据.assets/cqrs.jpg differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/07-分布式事务.assets/bqb_4.gif b/docs/dev/后端开发/微服务架构本地尝试/img/07-分布式事务.assets/bqb_4.gif new file mode 100644 index 0000000..17d6ada Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/07-分布式事务.assets/bqb_4.gif differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_add_route.png b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_add_route.png new file mode 100644 index 0000000..61c090d Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_add_route.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_add_service.png b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_add_service.png new file mode 100644 index 0000000..8f34e0f Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_add_service.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_dashboard.png b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_dashboard.png new file mode 100644 index 0000000..929e274 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_dashboard.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_flow_chart.png b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_flow_chart.png new file mode 100644 index 0000000..fc15d8b Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_flow_chart.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_kong_demo.png b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_kong_demo.png new file mode 100644 index 0000000..2db214c Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/api网关.assets/api_kong_demo.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/rpc.assets/rpc_debug_1-300x120.png b/docs/dev/后端开发/微服务架构本地尝试/img/rpc.assets/rpc_debug_1-300x120.png new file mode 100644 index 0000000..9b7a040 Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/rpc.assets/rpc_debug_1-300x120.png differ diff --git a/docs/dev/后端开发/微服务架构本地尝试/img/rpc.assets/rpc_debug_2-300x197.png b/docs/dev/后端开发/微服务架构本地尝试/img/rpc.assets/rpc_debug_2-300x197.png new file mode 100644 index 0000000..8dc217a Binary files /dev/null and b/docs/dev/后端开发/微服务架构本地尝试/img/rpc.assets/rpc_debug_2-300x197.png differ diff --git a/docs/dev/开发工具/Git命令总结.md b/docs/dev/开发工具/Git命令总结.md new file mode 100644 index 0000000..1b2d21c --- /dev/null +++ b/docs/dev/开发工具/Git命令总结.md @@ -0,0 +1,224 @@ +--- +title: Git命令总结 +--- + +> Git 是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。[1] Git 的读音为/gɪt/。 +> Git 是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。[2] Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 +> +> 学习了一下 git,但是很多命令暂时都还没记住,于是将现在所学到的 git 命令记录下来,方便查询 +> +> 至于它们的作用,可以从下面的链接去学习 +> +> [GIT 教程跳转](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) + +![img](img/Git命令总结.assets/0.jpg) + +## 初始配置 + +配置用户名 + +git config --global user.name "CodFrm" + +配置邮箱 + +git config --global user.email "yz@ggnb.top" + +--global 表示全局 在整个 git 里生效 + +## Git 仓库命令 + +初始化 git 仓库 + +git init + +将文件加入 git 仓库 + +git add -f file1 file2 + +-f 表示强制添加 + +将文件提交到仓库 + +git commit -m “提交说明” + +查看仓库状态 + +git status + +查看上一次文件变动 + +git diff + +查看指定文件变动 + +git diff -- file + +文件删除 + +git rm file + +跳转到其他版本,如果是老的版本,使用 git log 将看不到之前的新版本,使用 git reflog + +git reset --hard HEAD^ + +HEAD^表示上一个版本 HEAD^^表示上两个 HEAD~10 表示上 10 个 + +HEAD^ 也可以用 commit_id 表示想要跳转到的版本 + +### 分支 + +创建并切换分支 + +git checkout -b 分支名字 + +创建分支 + +git branch 分支 + +切换分支 + +git checkout 分支 + +查看分支,当前分支有\* + +git branch + +删除分支 + +git branch -d 分支 + +-D 强制删除 + +合并分支到当前分支 + +git merge 分支 + +### 日志 + +提交历史,查看每个版本的信息 + +git log + +显示比较简单的信息 --pretty=oneline + +显示分支合并图 --graph + +命令历史,查看每个命令的信息 + +git reflog + +撤销修改,回到该版本最初样式 + +git checkout -- file + +将暂存区的文件撤回 + +git reset HEAD file + +## 远程仓库 + +创建 SSH KEY + +ssh-keygen -t rsa -C "code.farmer@qq.com" + +关联远程库 + +git remote add origin git@github.com:CodFrm/StudyGit.git + +克隆远程仓库 + +git clone git@github.com:CodFrm/StudyGit.git + +克隆分支到本地 + +git checkout -b 本地分支名 origin/远程分支名 + +查看远程库的信息 + +git remote + +git remote -v 显示更详细的信息 + +推送分支 + +git push origin 分支名字 + +第一次请加上-u 参数 git push -u origin 分支名字 + +从远程库获取新版本然后合并 + +git pull origin master + +从远程库获取最新的分支版本 + +git fetch origin master + +pull 和 fetch 理解还真有点困难....最好实践一下 + +fetch 是从远程拉取新加入的版本,要用 reset 跳转到这个新的版本上去才行,否则只是拉取 + +pull 就是从远程拉取了这些新的版本,然后将最新的和现在的合并 + +相当于 fetch 然后再 merge + +### 暂存现场 + +储存现场 + +git stash + +查看现场 + +git stash list + +还原现场 + +git stash apply + +删除现场 + +git stash drop + +还原并删除现场 + +git stash pop + +### 标签 + +设置标签 + +git tag 标签名字 commit_id + +commit_id 可选 + +删除标签 + +git tag -d 标签名字 + +推送标签,推送标签到远程仓库 + +git push origin 标签名 + +git push origin --tags 推送所有标签 + +查看标签 + +git tag + +查看标签信息 + +git show 标签名字 + +给标签说明 + +git tag -a 标签名字 -m "说明" commit_id + +删除远程标签 + +git push origin :refs/tags/标签名字 + +## 其他 + +给 git 命令设置别名 + +git config --global alias.别名 命令 diff --git a/docs/dev/开发工具/github不完全指南.md b/docs/dev/开发工具/github不完全指南.md new file mode 100644 index 0000000..145fc0f --- /dev/null +++ b/docs/dev/开发工具/github不完全指南.md @@ -0,0 +1,187 @@ +## git 和 github + +> git 和 github 其实并不是同一样东西 + +### git + +git 是由`Linus Torvalds`(没错,就是写 linux 内核的那个大佬)开发的一个分布式版本管理系统,主要用于代码的版本控制. +最简单的功能比如:你可以查看你之前的代码提交,与现在的代码进行比较,查看修改了什么内容,如果这个版本出现了 bug,你也可以找到写这个 bug 的罪魁祸首. + +还有相同功能的软件:svn. + +工具的下载地址:[https://git-scm.com/download/win](https://git-scm.com/download/win) linux 平台可以使用相关包管理工具安装,例如 Ubuntu:`apt install git`.本篇没有对 git 使用说明,可以去看我之前的文章:[Git 命令总结](./Git命令总结) + +如果你觉得命令麻烦,也可以去下载 gui 工具,例如:[SourceTree](https://www.sourcetreeapp.com/) + +### github + +而 github 是一个面向开源软件源码托管的平台,也可以在 github 上建立自己的 git 私有仓库.也是一个大型的同性交友平台(雾) + +如果你关注计算机方面的内容,那你应该听过`github万星xxx`. + +当然不止软件了,也有很多奇奇怪怪的项目在 github 上收到欢迎.(女装仓库,地球今天毁灭了吗?) + +与此相关的平台还有 gitlab(用法和 github 差不多,并且可以自己部署平台) + +## 来一个 github 账号 + +github 账号注册的门槛是很低的,直接访问:[https://github.com/](https://github.com/,),在对话框中输入你的账号就可以了. + +![](img/github不完全指南.assets/5e3f60abfef2b1e1e26e817cd087a671-20240316210151748.png) + +## 主页 + +> 可以看我的图,应该是很详细了,我的主页是:[https://github.com/CodFrm](https://github.com/CodFrm),欢迎关注和点星星 ⭐? + +![](img/github不完全指南.assets/663363614eb8c06fd44646fe8b215911-20240316210211762.png) + +对于想了解你的人来说,第一眼看的应该是 contributions,如果你下方越绿,证明你提交的次数越多,第一映像也会很好(对求职来说),不过也会有一些很无聊的人,提交一些无用的信息去刷 commit. + +最下方的贡献图还有一张表情包 + +![](img/github不完全指南.assets/776dfe3817e22477f0821137c024d803.png) + +所以也是你努力的一种证明啦. + +中间的项目,是可以自己选择的,一般都是选自己比较自信的项目放在主页,展示给别人看,如果你给其它项目提交过 pr(pull request,后面会说).你也可以将它展示在你的主页(哪怕你只提交了一行,甚至是给它删了 n 行![](img/github不完全指南.assets/90f33163cdebfabfbefa8b9768136d36.png)) + +## 仓库 + +### 创建仓库 + +你可以在最右上角找到这个,点击就可以进行创建的步骤了 + +![](img/github不完全指南.assets/32ec450ca5a75898cd0c88ff28745ad0.png) + +Owner 是仓库的所有者,你可以给自己的账号创建,也可以在组织中创建(有权限的话),public 和 private 表示公有仓库和私有仓库. +`Initialize this repository with a README`是创建一个`README`的文档,以`README`作为文件名的文件,会作为仓库的一个说明文档,显示在你项目主页的下方. + +.gitignore 是 git 提交时忽略的文件列表,license 是项目的开源协议(一般都不需要勾选) + +![](img/github不完全指南.assets/bf7d05eafb73055e49307be39d8d43a4.png) + +创建完之后会有一些命令引导,提交仓库 + +![](img/github不完全指南.assets/2c1181a13665c1f2617b7970f408ca10.png) + +### 提交 + +#### 添加密钥到 github + +提交之前,我们需要安装`git for windows`(如果你是 windows 系统的话),然后打开`Git Bash`,生成密钥添加到 github(因为这里我推荐是使用 ssh 模式,不推荐 https 模式),步骤如下 + +![](img/github不完全指南.assets/88c26ecc9d3884421657ebb9ed6772c0.png) + +执行`ssh-keygen -t rsa -C "youremail@example.com"`命令就开源了,邮箱为你的注册邮箱,然后输入`cat ~/.ssh/id_rsa.pub`(命令含义就是将你**用户**目录下的.ssh/id_rsa.pub 输出到窗口),会输出一大串字母,这就是你的公钥了,将它复制提交到 github(git bash 要右键,copy,不能 ctrl+c) + +![](img/github不完全指南.assets/cbce7865f88401dec815fb2eef0196f1.png) + +setting->SSH and GPG keys->New ssh key + +![](img/github不完全指南.assets/573cec1e7f6e6e50aafb331711f85d64.png) + +然后 Add ssh key 就 ok 啦,后面好像会要你输入你的密码. + +#### 提交源码到 github + +依旧是刚刚的`git bash`,如果之前没有 git 仓库,需要先初始化一次,然后绑定远程仓库(远程仓库就是你的 github 仓库啦) + +```bash +git init +git remote add origin git@github.com:CodFrm/test.git +``` + +如果已经有远程仓库了,那么执行第二行就可以了. +然后开始你的代码编写或者加点文件进去....ing +完成后: +命令含义你可以看我的另外一篇博文:[Git 命令总结](./Git命令总结) + +```bash +git add * +git commit -m "我添加了一个文件" +git push origin master +``` + +然后刷新看看 github 上面的仓库主页: + +![](img/github不完全指南.assets/7ef3511b2fba244c1e778d0f50af1417.png) + +这里我推荐一个插件:[Octotree](https://chrome.google.com/webstore/detail/octotree/bkhaagjahfmjljalopjnoealnfndnagc?hl=en),可以用来看仓库文件,是一个很方便的插件 + +### 一些常见的东西 + +#### star + +这就是我们常说的星星 ⭐ 了,大概相对于我们的赞吧,越多代表你的项目越受欢迎.(所以快给我点个吧:[https://github.com/scriptscat/scriptcat](https://github.com/scriptscat/scriptcat)?) + +#### Watch + +你项目的关注人数,当你关注的时候,项目发生更新(新的 issue,pr 等)的时候都会通知你 + +#### fork + +相对于复制一份你的项目,fork 之后,别人就可以帮你修改你的代码. + +#### issues + +有点像论坛,你的代码出现 bug/问题询问/意见反馈,其他人都可以在这里开一个帖子. + +#### pull request + +简称 pr,如果你看 issue,你可能会看到仓库作者说,`提个pr`,意思就这个啦.其他人 fork 了你的仓库后,在他自己的仓库对你的代码进行修改,修改好之后,就可以在你的项目里面提交一个`pull request`,你可以将他的修改合并到你的代码里面,当然也可以拒绝. + +#### Action + +是 github 最近推出的一项 CI/CD 服务, 具体可以去看我原来的文章:[github action 入门](../../ops/CI&CD/github-actions-入门) + +#### project + +是当前窗口的工作薄,将做些什么内容(不过好像大部分人都没用) + +#### wiki + +顾名思义,仓库的文章(不过也好像没啥人用...) + +#### commit + +仓库的提交数量,点进去也可以看到详细的提交内容 + +#### branch + +仓库的分支,点进去可以看到分支详细内容 + +#### release + +当前仓库发布的版本,一般都是可以稳定使用的版本,点进去可以进行下载. + +#### contributions + +贡献人数,你可以点进去看看有那些大佬为这个仓库做了贡献,然后 follow 他 + +![](img/github不完全指南.assets/3XKDB6V81@6UOPTK3739-300x257.png) + +#### 其它 + +如果你不想用 git,你也可以在网页上进行一些简单的操作 + +![](img/github不完全指南.assets/09c82b870a00634bd45e69726c20264f.png) + +## 首页 + +![](img/github不完全指南.assets/78417ee77ecceffbfe15bcd586b32f87.png) + +首页其实也没啥,我最主要的用处就是,看那些关注了的大佬的动向,看大佬又 star 了什么厉害的项目,大佬又有什么新的动作了,然后就是一些 github 的新闻之类了 + +## End + +> 推荐几个项目 + +github 不仅仅是一个程序员的平台,在上面还有漂亮的小哥哥:[https://github.com/komeiji-satori/Dress](https://github.com/komeiji-satori/Dress),帅气的小姐姐:[https://github.com/greenaway07/GirlDress](https://github.com/greenaway07/GirlDress),教你使用 github 的一些基本操作,也有教你炒股买房的教程:[https://github.com/houshanren/hangzhou_house_knowledge](https://github.com/houshanren/hangzhou_house_knowledge).如果你遇到什么需要的东西,也可以去 github 先去搜一搜 + +![](img/github不完全指南.assets/0b880e9274128c9631e0f2520974d295.png) + +不皮了,安利几个正经的项目: + +- [https://github.com/ruanyf/weekly](https://github.com/ruanyf/weekly) 科技爱好者周刊,每周五发布,建议 watch,每天看新报 +- [https://github.com/sindresorhus/awesome](https://github.com/sindresorhus/awesome) 各种计算机很棒的资料 +- [https://github.com/ruanyf/free-books](https://github.com/ruanyf/free-books) 互联网上的免费书籍 diff --git a/docs/dev/开发工具/img/Git命令总结.assets/0.jpg b/docs/dev/开发工具/img/Git命令总结.assets/0.jpg new file mode 100644 index 0000000..8d4f775 Binary files /dev/null and b/docs/dev/开发工具/img/Git命令总结.assets/0.jpg differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/09c82b870a00634bd45e69726c20264f.png b/docs/dev/开发工具/img/github不完全指南.assets/09c82b870a00634bd45e69726c20264f.png new file mode 100644 index 0000000..a593f6b Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/09c82b870a00634bd45e69726c20264f.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/0b880e9274128c9631e0f2520974d295.png b/docs/dev/开发工具/img/github不完全指南.assets/0b880e9274128c9631e0f2520974d295.png new file mode 100644 index 0000000..019276b Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/0b880e9274128c9631e0f2520974d295.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/2c1181a13665c1f2617b7970f408ca10.png b/docs/dev/开发工具/img/github不完全指南.assets/2c1181a13665c1f2617b7970f408ca10.png new file mode 100644 index 0000000..8941b69 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/2c1181a13665c1f2617b7970f408ca10.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/32ec450ca5a75898cd0c88ff28745ad0.png b/docs/dev/开发工具/img/github不完全指南.assets/32ec450ca5a75898cd0c88ff28745ad0.png new file mode 100644 index 0000000..8f3ceb8 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/32ec450ca5a75898cd0c88ff28745ad0.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/3XKDB6V81@6UOPTK3739-300x257.png b/docs/dev/开发工具/img/github不完全指南.assets/3XKDB6V81@6UOPTK3739-300x257.png new file mode 100644 index 0000000..49fa248 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/3XKDB6V81@6UOPTK3739-300x257.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/573cec1e7f6e6e50aafb331711f85d64.png b/docs/dev/开发工具/img/github不完全指南.assets/573cec1e7f6e6e50aafb331711f85d64.png new file mode 100644 index 0000000..f36e904 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/573cec1e7f6e6e50aafb331711f85d64.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/5e3f60abfef2b1e1e26e817cd087a671-20240316210151748.png b/docs/dev/开发工具/img/github不完全指南.assets/5e3f60abfef2b1e1e26e817cd087a671-20240316210151748.png new file mode 100644 index 0000000..46adbe6 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/5e3f60abfef2b1e1e26e817cd087a671-20240316210151748.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/663363614eb8c06fd44646fe8b215911-20240316210211762.png b/docs/dev/开发工具/img/github不完全指南.assets/663363614eb8c06fd44646fe8b215911-20240316210211762.png new file mode 100644 index 0000000..6907cb9 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/663363614eb8c06fd44646fe8b215911-20240316210211762.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/776dfe3817e22477f0821137c024d803.png b/docs/dev/开发工具/img/github不完全指南.assets/776dfe3817e22477f0821137c024d803.png new file mode 100644 index 0000000..2041fab Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/776dfe3817e22477f0821137c024d803.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/78417ee77ecceffbfe15bcd586b32f87.png b/docs/dev/开发工具/img/github不完全指南.assets/78417ee77ecceffbfe15bcd586b32f87.png new file mode 100644 index 0000000..0ee9939 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/78417ee77ecceffbfe15bcd586b32f87.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/7ef3511b2fba244c1e778d0f50af1417.png b/docs/dev/开发工具/img/github不完全指南.assets/7ef3511b2fba244c1e778d0f50af1417.png new file mode 100644 index 0000000..0a8f09e Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/7ef3511b2fba244c1e778d0f50af1417.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/88c26ecc9d3884421657ebb9ed6772c0.png b/docs/dev/开发工具/img/github不完全指南.assets/88c26ecc9d3884421657ebb9ed6772c0.png new file mode 100644 index 0000000..520cf6b Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/88c26ecc9d3884421657ebb9ed6772c0.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/90f33163cdebfabfbefa8b9768136d36.png b/docs/dev/开发工具/img/github不完全指南.assets/90f33163cdebfabfbefa8b9768136d36.png new file mode 100644 index 0000000..14fcf5e Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/90f33163cdebfabfbefa8b9768136d36.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/bf7d05eafb73055e49307be39d8d43a4.png b/docs/dev/开发工具/img/github不完全指南.assets/bf7d05eafb73055e49307be39d8d43a4.png new file mode 100644 index 0000000..5bfa1b7 Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/bf7d05eafb73055e49307be39d8d43a4.png differ diff --git a/docs/dev/开发工具/img/github不完全指南.assets/cbce7865f88401dec815fb2eef0196f1.png b/docs/dev/开发工具/img/github不完全指南.assets/cbce7865f88401dec815fb2eef0196f1.png new file mode 100644 index 0000000..377656f Binary files /dev/null and b/docs/dev/开发工具/img/github不完全指南.assets/cbce7865f88401dec815fb2eef0196f1.png differ diff --git a/docs/note/README.md b/docs/note/README.md new file mode 100644 index 0000000..7ede593 --- /dev/null +++ b/docs/note/README.md @@ -0,0 +1,6 @@ +--- +title: 笔记 +sidebar_position: 0 +--- + +这里是笔记记录相关的内容,包括学习笔记、工具资源、日常生活等等。 diff --git a/docs/note/_category_.json b/docs/note/_category_.json new file mode 100644 index 0000000..3af3080 --- /dev/null +++ b/docs/note/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "笔记", + "position": 5 +} diff --git a/docs/note/为什么换掉Wordpress.md b/docs/note/为什么换掉Wordpress.md new file mode 100644 index 0000000..1dbcf56 --- /dev/null +++ b/docs/note/为什么换掉Wordpress.md @@ -0,0 +1,54 @@ +--- +title: 我为什么换掉Wordpress而选择Docusaurus? +--- + +在此之前,我一直使用 Wordpress 来做我的博客,最近准备重新开始写,为什么决定换掉它呢? + +首先 Wordpress 很强大,完全符合我的所有需求:评论、统计、SEO、主题、插件等等,但是我还是决定换掉它,原因主要有以下几点: + +- 维护成本高:Wordpress 需要配置 PHP、Mysql、Nginx 等环境,而且插件、主题、Wordpress 本身都需要定期更新,这些都需要花费时间。我很久没有更新了,结果代码高亮插件出了问题,可能是兼容性问题,也可能是我自己的配置问题,并且后台总是能看到告警之类的信息,总之,我不想花时间去解决了。 +- 迁移成本高:在之前我换过好几次服务器环境,每次都需要重新配置环境,迁移数据库,迁移文件,这些都需要花费时间;虽然现在应该很少会迁移了。 +- 资源占用高:Wordpress 占用资源较高,虽然并没有对我产生什么压力,但是我还是希望能够用更少的资源来跑我的博客。 +- 编辑模式不友好:Wordpress 的编辑模式不够友好,虽然可以安装 Markdown 编辑器,但是我更喜欢使用本地的 Markdown 编辑器。 + +其实最主要的原因还是编辑模式的问题,我更喜欢使用本地的 Markdown 编辑器,然后通过 Git 来管理我的文章,这样我可以更方便的查看历史版本,也可以更方便的进行版本控制。 + +## 为什么选择了 Docuasaurus + +在选择新的博客程序的时候我也考虑了很多,比如:Typecho、Hexo、VitePress、Hugo、docsify 等等。 + +我主要是从下面几个方面来考虑的,你也可以作为参考: + +- 界面美观 +- 本地 Markdown 编辑 +- SSG(静态站点生成) +- 使用 git 管理文章 + +SSG 是希望能够生成静态站点,这样就不需要配置 PHP、Mysql、Nginx 等环境了,也不需要担心安全问题,而且可以更快的访问速度。 +然后就是 git 管理和本地 Markdown 编写,这样对于博客程序的选择影响就不会太大了,如果用得不喜欢可以很方便的切换,博客程序出了问题,使用 git 也可以很方便的回滚。 + +这么筛选下来,其实还是有很多选择的,Hexo 和 Hugo 都是很不错的,他们也是很流行的 BLOG 程序,并且有丰富的主题, +相反 VitePress、docsify、Docusaurus 它们更适合文档程序,主题相对较少,界面相对简洁。 + +但是我很快就否决的 Hexo 和 Hugo,因为他们的界面不够美观,我更喜欢简洁的界面,而且我也不需要那么多的主题,很多主题都比较花哨。 +并且我看见了很多大佬也是用 VitePress、docsify、Docusaurus 来写博客的,他们的首页都是很简洁的,我也很喜欢。 + +最开始其实是有些想使用 VitePress 的,和 Docuasaurus 的官网首页相比,我更喜欢 VitePress 的界面。 +但是我主要是使用 React 进行开发的,然后看到了一些使用 Docuasaurus 的博客,他们都进行了一些定制,界面也是很不错的,于是我也就选择了 Docuasaurus,并且参考了他们的博客,写了一下我的首页。 + +如果没有开发能力的话,我还是很推荐使用 Hugo、Hexo 的,他们的主题很多,界面也很美观,而且也很流行,有很多人使用,遇到问题也比较容易找到解决方案。 + +## Docusaurus 的定制 + +Docusaurus 是有 blog 功能的,但是 blog 不能支持左侧的目录树,然后 docs 又不支持文章时间,于是我写了一个 docs 时间生成的插件。 +然后 Docuasaurus 也只是一个静态站点生成器,不支持评论、统计等等功能,需要一些外部依赖来实现。我主要改造如下,你也可以进入我的博客仓库查看: + +- 修改首页 +- 增加 Docs 文章时间排序 +- 接入 giscus 评论 +- 接入 Google Analytics 统计 +- 增加了 Markdown lint + +在以后或许还会用 golang 写一个提供服务的后端,来实现其他更多的功能。 + +总之不同的博客程序都有不同的优势,也有不同的劣势,选择适合自己的就好。 diff --git a/docs/note/学习笔记/PHP扩展开发/01-骨架.md b/docs/note/学习笔记/PHP扩展开发/01-骨架.md new file mode 100644 index 0000000..044b303 --- /dev/null +++ b/docs/note/学习笔记/PHP扩展开发/01-骨架.md @@ -0,0 +1,144 @@ +--- +title: PHP 扩展开发(一)-骨架 +--- + +> 学习了这么久的 php,还一直停留在 CURD 也太捞了,来接触一下扩展开发 +> 官方的文档:[http://php.net/manual/zh/internals2.php](http://php.net/manual/zh/internals2.php) 可以 mark 一下 + +## 环境 + +- php7.2 +- ubuntu18.04 +- gcc 7.3.0 +- make 4.1 + +## 开始 + +### ext_skel + +> [http://php.net/manual/zh/internals2.buildsys.skeleton.php](http://php.net/manual/zh/internals2.buildsys.skeleton.php) + +首先我们要利用 php 给我们提供的 ext_skel 脚本工具生成我们扩展的骨架,这个文件一般在 php 的源码的 ext 目录下面 + +这里我弄一个扩展名字为**study**的扩展 --extname 这个参数为扩展名字,还有其他的参数可以在上面的链接文档中看到 + +```shell +huanl@huanl-CN15S:/www/server/php/72/src/ext$ sudo ./ext_skel --extname=study +Creating directory study +Creating basic files: config.m4 config.w32 .gitignore study.c php_study.h CREDITS EXPERIMENTAL tests/001.phpt study.php [done]. + +To use your new extension, you will have to execute the following steps: + +1. $ cd .. +2. $ vi ext/study/config.m4 +3. $ ./buildconf +4. $ ./configure --[with|enable]-study +5. $ make +6. $ ./sapi/cli/php -f ext/study/study.php +7. $ vi ext/study/study.c +8. $ make + +Repeat steps 3-6 until you are satisfied with ext/study/config.m4 and +step 6 confirms that your module is compiled into PHP. Then, start writing +code and repeat the last two steps as often as necessary. + +``` + +这里创建完成之后,就多了一个 study 的目录,我们可以进入这个扩展目录,进行一些操作,这里的话,因为我的用户没有权限,所以我直接的给了 777 权限 + +```shell +huanl@huanl-CN15S:/www/server/php/72/src/ext$ sudo chmod -R 777 study/ +``` + +### 编译安装 + +#### 目录结构 + +之后我们进入这个扩展目录,有这些文件,官方的文档:[http://php.net/manual/zh/internals2.structure.files.php](http://php.net/manual/zh/internals2.structure.files.php) + +```shell +huanl@huanl-CN15S:/www/server/php/72/src/ext$ cd study/ +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ ls +config.m4 CREDITS php_study.h study.php +config.w32 EXPERIMENTAL study.c tests +``` + +等下我们需要修改**config.m4**文件,这相当于是一个编译配置的文档,是 Unix 下的,还有一个**config.w32**看名字就知道是 Windows 下的 + +**study.c**和**php_study.h**这是依照我们的扩展名称来帮我们生成的两个源文件,包括了一些宏的定义和函数声明等等 + +**study.php**可以用 php cli 来测试我们的扩展是否安装成功 + +#### config.m4 + +> [http://php.net/manual/zh/internals2.buildsys.configunix.php](http://php.net/manual/zh/internals2.buildsys.configunix.php) + +要进行一下修改,是动态编译成 so 库还是静态编译进 php 里面,这里我们扩展开发自然是动态编译成 so 库,不然还得重新编译 php + +去掉前面的 dnl,例如下面这个 + +``` +dnl If your extension references something external, use with: +# 编译成so库 +PHP_ARG_WITH(study, for study support, +Make sure that the comment is aligned: +[ --with-study Include study support]) + +dnl Otherwise use enable: +# 静态编译 +dnl PHP_ARG_ENABLE(study, whether to enable study support, +dnl Make sure that the comment is aligned: +dnl [ --enable-study Enable study support]) +``` + +### 编译 + +我们需要用**phpize**生成编译的配置的文件**configure**,然后**make**,**make install**就完成了,make install 的时候注意用 sudo + +```shell +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ phpize +Configuring for: +PHP Api Version: 20170718 +Zend Module Api No: 20170718 +Zend Extension Api No: 320170718 + +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ ./configure --with-php-config=/www/server/php/72/bin/php-config +# 这里注意配置php的配置文件 + +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ make + +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ sudo make install +Installing shared extensions: /www/server/php/72/lib/php/extensions/no-debug-non-zts-20170718/ +``` + +### 配置 + +完成之后我们要在**php.ini**文件中加载扩展,不然我们运行`php study.php`的时候不会成功 + +这样可以看 ini 文件在哪里 + +```shell +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ php --ini +Configuration File (php.ini) Path: /www/server/php/72/etc +Loaded Configuration File: /www/server/php/72/etc/php.ini +Scan for additional .ini files in: (none) +Additional .ini files parsed: (none) +``` + +增加一行 + +``` +extension=study.so +``` + +## 完成 + +这时候我们执行目录下的那个`study.php` + +```shell +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ php study.php +Functions available in the test extension: +confirm_study_compiled + +Congratulations! You have successfully modified ext/study/config.m4. Module study is now compiled into PHP. +``` diff --git a/docs/note/学习笔记/PHP扩展开发/02-函数.md b/docs/note/学习笔记/PHP扩展开发/02-函数.md new file mode 100644 index 0000000..91b6e70 --- /dev/null +++ b/docs/note/学习笔记/PHP扩展开发/02-函数.md @@ -0,0 +1,237 @@ +--- +title: PHP扩展开发(二)-函数 +--- + +> 弄好骨架之后,我们得给我们的扩展增加些 php 能够调用的函数,这里我们使用 vscode 进行开发 + +## 开发环境 + +> 给我们的 vscode 装好扩展,然后配置一下 include 路径 + +![](img/02-%E5%87%BD%E6%95%B0.assets/2018-09-21-14-20-32-%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE-300x132.png) + +点击,生成一个配置文件,我的配置如下,php 的路径看自己的来定,我这里是宝塔安装的,路径为:**/www/server/php/72/include/php**,主要是自动提示 + +```json +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**", + "/www/server/php/72/include/php", + "/www/server/php/72/include/php/main", + "/www/server/php/72/include/php/Zend", + "/www/server/php/72/include/php/TSRM" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c11", + "cppStandard": "c++17", + "intelliSenseMode": "clang-x64" + } + ], + "version": 4 +} +``` + +## 开发 + +### 返回和输出 + +> 假设我这里想添加一个输出一些东西的函数 + +这里用到了三个宏,**PHP_FUNCTION**,**RETURN\_\***,**PHP_FE** + +php_printf 是 php 提供的一个输出函数 + +```c +PHP_FUNCTION(study_ext_print) { + php_printf("我是输出到页面的内容\n"); + RETURN_STRING("学习PHP扩展开发~~"); +} + +/* }}} */ +/* {{{ study_functions[] + * + * Every user visible function must have an entry in study_functions[]. + */ +const zend_function_entry study_functions[] = { + PHP_FE(confirm_study_compiled, NULL) /* For testing, remove later. */ + PHP_FE(study_ext_print, NULL) /* 学习插件输出 */ + PHP_FE_END /* Must be the last line in study_functions[] */ +}; +/* }}} */ +``` + +然后再 make,sudo make install + +#### 调试跑一次 + +修改我们目录下的`study.php`,在最后写一行,我们刚刚编写的这个函数 + +```php +echo study_ext_print()."\n"; +``` + +输出,成功 + +``` +huanl@huanl-CN15S:/www/server/php/72/src/ext/study$ php study.php +Functions available in the test extension: +confirm_study_compiled +study_ext_print + +Congratulations! You have successfully modified ext/study/config.m4. Module study is now compiled into PHP. +我是输出到页面的内容 +学习PHP扩展开发~~ +``` + +#### 这里再说下这三个宏 + +##### PHP_FUNCTION + +使用这个宏会将我们的函数最终定义成如下的形式 + +```cpp +void zif_study_ext_print(zend_execute_data *execute_data, zval *return_value) +``` + +~~官网上的是 php5.3 的版本,我这里是 php7,所以是这样,如果有什么错误,还望指出~~ +然后因为这里的返回值是 void,所以在我们写函数的时候`return`不能带值 + +##### RETURN\_\* + +这个宏一看就知道是 php 给我们的返回值,除了我上面所写的`RETURN_STR`外还有其他的类型 + +```c +#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; } +#define RETURN_NULL() { RETVAL_NULL(); return;} +#define RETURN_LONG(l) { RETVAL_LONG(l); return; } +#define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; } +#define RETURN_STR(s) { RETVAL_STR(s); return; } +#define RETURN_INTERNED_STR(s) { RETVAL_INTERNED_STR(s); return; } +#define RETURN_NEW_STR(s) { RETVAL_NEW_STR(s); return; } +#define RETURN_STR_COPY(s) { RETVAL_STR_COPY(s); return; } +#define RETURN_STRING(s) { RETVAL_STRING(s); return; } +#define RETURN_STRINGL(s, l) { RETVAL_STRINGL(s, l); return; } +#define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; } +#define RETURN_RES(r) { RETVAL_RES(r); return; } +#define RETURN_ARR(r) { RETVAL_ARR(r); return; } +#define RETURN_OBJ(r) { RETVAL_OBJ(r); return; } +#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; } +#define RETURN_FALSE { RETVAL_FALSE; return; } +#define RETURN_TRUE { RETVAL_TRUE; return; } +``` + +##### PHP_FE + +这个宏帮助我们生成一个和 php 函数相关的结构体 + +```c +//宏如下,PHP_替换成了ZEND_ +#define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags }, +#define ZEND_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0) +//感觉就是帮我们省事了,不需要我们去重写结构体,上面那些结构体也是 +typedef struct _zend_function_entry { + const char *fname;//我们的php函数名 + zif_handler handler;//相当于再调用一次PHP_FUNCTION,c中函数的指针 + const struct _zend_internal_arg_info *arg_info;//参数的信息,就上一个函数来说,我们是NULL + uint32_t num_args;//参数个数 + uint32_t flags;//flags这里是0 +} zend_function_entry; +``` + +### 参数 + +> 假设来一个两数相加的函数,这时候我们就需要传送参数了 +> 参考:[https://wiki.php.net/rfc/fast_zpp](https://wiki.php.net/rfc/fast_zpp) + +我的 c 代码如下 + +```cpp +//定义参数结构 +ZEND_BEGIN_ARG_INFO(add_param,0) +ZEND_ARG_INFO(0,num1) +ZEND_ARG_INFO(0,num2) +ZEND_END_ARG_INFO() + +//函数 +PHP_FUNCTION(study_add) +{ + long long num1=0,num2=0; + if(zend_parse_parameters(ZEND_NUM_ARGS() , "ll", &num1,&num2)==FAILURE){ + RETURN_LONG(-1) + } + RETURN_LONG(num1+num2) +} + +/* }}} */ +/* {{{ study_functions[] + * + * Every user visible function must have an entry in study_functions[]. + */ +const zend_function_entry study_functions[] = { + PHP_FE(confirm_study_compiled, NULL) /* For testing, remove later. */ + PHP_FE(study_ext_print, NULL) /* 学习插件输出 */ + PHP_FE(study_add, add_param) /* 两数相加 */ + PHP_FE_END /* Must be the last line in study_functions[] */ +}; +``` + +```php +echo "study_add:".study_add(10,123456); +``` + +#### 宏 + +##### ZEND_BEGIN_ARG_INFO,ZEND_ARG_INFO,ZEND_END_ARG_INFO + +定义参数,我把源码贴上来 + +```cpp +#define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args) \ + static const zend_internal_arg_info name[] = { \ + { (const char*)(zend_uintptr_t)(required_num_args), 0, return_reference, 0 }, +#define ZEND_BEGIN_ARG_INFO(name, _unused) \ + ZEND_BEGIN_ARG_INFO_EX(name, 0, ZEND_RETURN_VALUE, -1) +#define ZEND_END_ARG_INFO() }; + +#define ZEND_ARG_INFO(pass_by_ref, name) { #name, 0, pass_by_ref, 0}, +``` + +那么通过这些宏的转换,变成了这样 + +```cpp +static const zend_internal_arg_info add_param[] = { + { (const char*)(zend_uintptr_t)(-1), 0, 0, 0 }, + { "num1", 0, 0, 0}, + { "num2", 0, 0, 0}, +}; +``` + +#### zend_parse_parameters + +获取参数 + +```cpp +//声明 +ZEND_API int zend_parse_parameters(int num_args, const char *type_spec, ...); +``` + +第一个参数是我们要获取的参数的个数,第二个是 参数的格式化字符串,后面的是变量指针 + +| 数据类型 | 字符 | c 对应类型 | +| -------- | ---- | ----------- | +| Boolean | b | zend_bool | +| Long | l | long | +| Double | d | double | +| String | s | char\*, int | +| Resource | r | zval\* | +| Array | a | zval\* | +| Object | o | zval\* | +| zval | z | zval\* | + +#### ZEND_NUM_ARGS + +参数个数,一般这样填就好了 diff --git a/docs/note/学习笔记/PHP扩展开发/03-类.md b/docs/note/学习笔记/PHP扩展开发/03-类.md new file mode 100644 index 0000000..88d6afc --- /dev/null +++ b/docs/note/学习笔记/PHP扩展开发/03-类.md @@ -0,0 +1,385 @@ +--- +title: PHP扩展开发(三)---类 +--- + +> 前面已经了解了函数和参数,今天来了解一下类 + +## 例子 + +定义了一个 **study_ext_class** 类,里面只有一个 **print** 方法 + +类使用 **PHP_ME**和**PHP_METHOD** 宏,与方法最大的不同的地方是类需要注册 + +这里我写了一个 **init_class** 方法,**PHP_MINIT_FUNCTION**中调用,主要是需要注册类 + +```c +/* {{{ PHP_MINIT_FUNCTION + */ +PHP_MINIT_FUNCTION(study) +{ + /* If you have INI entries, uncomment these lines + REGISTER_INI_ENTRIES(); + */ + init_class(); + return SUCCESS; +} +/* }}} */ + +PHP_METHOD(study_ext_class,print) +{ + php_printf("你调用了study_ext_class的print方法\n"); +} + +/* }}} */ + +const zend_function_entry study_class_method[]={ + PHP_ME(study_ext_class,print,NULL,ZEND_ACC_PUBLIC)/* study_ext_class的print方法 */ + PHP_FE_END +}; + +zend_class_entry *study_ce; +void init_class(){ + zend_class_entry ce; + INIT_CLASS_ENTRY(ce, "study_ext_class" , study_class_method); + study_ce = zend_register_internal_class(&ce); +} +``` + +### PHP_MINIT_FUNCTION + +这是我们扩展启动时会执行的一个函数,所以在这里注册类 + +```c +#define ZEND_MODULE_STARTUP_N(module) zm_startup_##module + +#define INIT_FUNC_ARGS int type, int module_number + +#define ZEND_MODULE_STARTUP_D(module) int ZEND_MODULE_STARTUP_N(module)(INIT_FUNC_ARGS) +//之后 +int zm_startup_study(int type, int module_number); +``` + +### PHP_METHOD + +这两个宏和我们前面函数哪里的 **PHP_FE** ,**PHP_FUNCTION** 差不多 + +```c +#define ZEND_MN(name) zim_##name +#define ZEND_METHOD(classname, name) ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name)) + +//PHP_METHOD 最终定义成了这样 +void zim_study_ext_class_print(zend_execute_data *execute_data, zval *return_value); +``` + +### PHP_ME + +**PHP_ME** 相比原来的 **PHP_FE** 多了几个参数,主要是方法的属性和类名 + +```c +#define ZEND_ME(classname, name, arg_info, flags) ZEND_FENTRY(name, ZEND_MN(classname##_##name), arg_info, flags) +``` + +flags 是方法的属性,我们可以用 **|** 连接它们 + +```c +/* method flags (types)方法类型 */ +#define ZEND_ACC_STATIC 0x01 +#define ZEND_ACC_ABSTRACT 0x02 +#define ZEND_ACC_FINAL 0x04 +#define ZEND_ACC_IMPLEMENTED_ABSTRACT 0x08 + +/* method flags (visibility)访问属性 */ +/* The order of those must be kept - public < protected < private */ +#define ZEND_ACC_PUBLIC 0x100 +#define ZEND_ACC_PROTECTED 0x200 +#define ZEND_ACC_PRIVATE 0x400 +#define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) + +#define ZEND_ACC_CHANGED 0x800 +#define ZEND_ACC_IMPLICIT_PUBLIC 0x1000 + +/* method flags (special method detection)构造函数和析构 */ +#define ZEND_ACC_CTOR 0x2000 +#define ZEND_ACC_DTOR 0x4000 + +/* method flag used by Closure::__invoke() */ +#define ZEND_ACC_USER_ARG_INFO 0x80 + +/* method flag (bc only), any method that has this flag can be used statically and non statically. */ +#define ZEND_ACC_ALLOW_STATIC 0x10000 +``` + +### 类注册 + +完成了上面的,编译&安装,实例化我们的类是是会报错的,因为 php 不知道你有那些类 + +方法的话,在最后面通过 **ZEND_GET_MODULE** 生成了一个 **get_module** 的接口将方法进行了返回 + +```c +zend_class_entry *study_ce; +void init_class(){ + zend_class_entry ce; + INIT_CLASS_ENTRY(ce, "study_ext_class" , study_class_method); + study_ce = zend_register_internal_class(&ce); +} +``` + +#### INIT_CLASS_ENTRY + +这一个宏的作用是生成这个类的结构,包括类的名称,方法,然后返回在 ce 这个变量中 + +```c +//太长了,就只贴了一部分 +#define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \ + INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, sizeof(class_name)-1, functions, handle_fcall, handle_propget, handle_propset, NULL, NULL) + +#define INIT_CLASS_ENTRY(class_container, class_name, functions) \ + INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, NULL, NULL, NULL) +``` + +#### zend_register_internal_class + +显而易见的是将我们的类的信息告诉 php,注册进去,还有一个 **zend_register_internal_class_ex** 的函数,可以指定父类,然后这个函数返回我们的这个类的指针 + +## 构造和析构 + +函数列表哪里标记一下 **ZEND_ACC_CTOR** 或者 **ZEND_ACC_DTOR** 就好了 + +```c +PHP_METHOD(study_ext_class,__construct) +{ + php_printf("study_ext_class构造函数\n"); +} +PHP_METHOD(study_ext_class,__destruct) +{ + php_printf("study_ext_class析构函数\n"); +} +const zend_function_entry study_class_method[]={ + PHP_ME(study_ext_class,__construct,NULL,ZEND_ACC_CTOR)/* 构造 */ + PHP_ME(study_ext_class,__destruct,NULL,ZEND_ACC_DTOR)/* 析构 */ + PHP_ME(study_ext_class,print,NULL,ZEND_ACC_PUBLIC)/* study_ext_class的print方法 */ + PHP_FE_END +}; +``` + +## 类属性 + +在初始化注册类的时候,使用 **zend*declare_property*\*** 给我们的类添加属性,还可以给他们赋予默认值 + +```c +void init_class(){ + zend_class_entry ce; + INIT_CLASS_ENTRY(ce, "study_ext_class" , study_class_method); + study_ce = zend_register_internal_class(&ce); + zend_declare_property_null(study_ce,"attr",sizeof("attr")-1,ZEND_ACC_PUBLIC); + zend_declare_property_long(study_ce,"num",sizeof("num")-1,100,ZEND_ACC_STATIC|ZEND_ACC_PUBLIC); +} +``` + +```php +$a->attr="2333s"; +echo '静态属性:study_ext_class::$num:'.study_ext_class::$num."\n"; +echo '属性:study_ext_class::$attr:'.$a->attr."\n"; +``` + +输出 + +``` +静态属性:study_ext_class::$num:100 +属性:study_ext_class::$attr:2333s +``` + +### 类指针和属性读取 + +上面写了怎么去定义属性,但是如果是在类里面要怎么使用属性呢?我们需要用一个 **getThis** 的宏来获取当前这个类的指针,我就偷懒直接在原来的 **print** 中添加了 + +```c + zval *attr; + attr=zend_read_property(Z_OBJCE_P(getThis()),getThis(),"attr",sizeof("attr")-1,0,NULL); + php_var_dump(attr, 1); + if(Z_TYPE_P(attr)==IS_STRING){ + php_printf("attr的值为:%s\n",attr->value.str->val); + } +``` + +#### zend_read_property + +这个函数用于获取属性,还有`zend_read_static_property`,用法相同,不过这个是获取静态的属性,关于更新属性可以使用`zend_update_property` + +```c +ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, const char *name, size_t name_length, zend_bool silent, zval *rv); +``` + +第一个参数 **scope** 是这个类的指针,在之前的`study_ce = zend_register_internal_class(&ce);`获取,不过也可以这样获取`Z_OBJCE_P(getThis())` + +第二个参数 **object** 是当前的对象,我们可以用`getThis`这个宏获取 + +第三个参数和第四个参数分别是 属性的名称和属性的长度 + +第五个参数 **silent** 用于是假设属性不存在的情况下是否报错 + +最后一个参数 **rv** 为魔术方法所返回的,如果不是魔术方法所返回的是一个**NULL**值,可以看我下面这个例子 + +```c + zval *attr,*rv=NULL; + attr=zend_read_property(study_ce,getThis(),"attr",sizeof("attr")-1,0,rv); + if(Z_TYPE_P(attr)==IS_STRING){ + php_printf("attr的值为:%s,%d\n",attr->value.str->val,rv); + } +``` + +#### getThis + +获取对象指针,不多说了 + +```c +#define EX(element) ((execute_data)->element) + +#define getThis() ((Z_TYPE(EX(This)) == IS_OBJECT) ? &EX(This) : NULL) + +``` + +### 类参数 + +其实和函数的参数一样,还有一个类似的`zend_parse_method_parameters`我用的时候总是错误,还没明白这个函数是干什么的,而且找不到说明的资料=\_=,后面附上两个源码的区别再看看 + +```c +PHP_METHOD(study_ext_class,sum) +{ + zend_long parma_num=0; + zval* this=getThis(); + zval* static_num=zend_read_static_property(Z_OBJCE_P(this),"num",sizeof("num")-1,0); + if(zend_parse_parameters(ZEND_NUM_ARGS(),"l",&parma_num)==FAILURE){ + RETURN_LONG(-1) + } + if(Z_TYPE_P(static_num)==IS_LONG){ + RETURN_LONG(static_num->value.lval+parma_num) + } + RETURN_LONG(-1) +} +ZEND_BEGIN_ARG_INFO(sum_arg,0) +ZEND_ARG_INFO(0,num) +ZEND_END_ARG_INFO() +``` + +### 探究 + +如果我们的第二个参数**this_ptr**为 NULL 或者不是**OBJECT**类型的话,那么效果和**zend_parse_parameters**一样,我之前填的是 this 指针,所以跳到了 else 分支 + +else 分之第一句就是`p++;`表示字符串往后面移动一位,我填的参数是是一个单独的 **l** 然后一移动....没啦,后面还有两个 va_arg + +通过后面这两个得知,我们的两个参数,一个是 **zval** 的,一个是 **zend_class_entry\*** 我们传入的 **this_ptr** 参数会赋值给 **object** 也就是我们后面的第四个参数,第五个是我们类的指针 + +```c +object = va_arg(va, zval **); +ce = va_arg(va, zend_class_entry *); +*object = this_ptr; +``` + +看后面这一段,好像是校验类的,所以我觉得这个`zend_parse_method_parameters`和`zend_parse_parameters`的区别就在这里,method 能够对类进行校验 + +```c + if (ce && !instanceof_function(Z_OBJCE_P(this_ptr), ce)) { + zend_error_noreturn(E_CORE_ERROR, "%s::%s() must be derived from %s::%s", + ZSTR_VAL(Z_OBJCE_P(this_ptr)->name), get_active_function_name(), ZSTR_VAL(ce->name), get_active_function_name()); + } + +ZEND_API zend_bool ZEND_FASTCALL instanceof_function(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */ +{ + if (ce->ce_flags & ZEND_ACC_INTERFACE) { + return instanceof_interface(instance_ce, ce); + } else { + return instanceof_class(instance_ce, ce); + } +} + +static zend_always_inline zend_bool instanceof_class(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */ +{ + while (instance_ce) { + if (instance_ce == ce) {//会循环校验父类是否相等 + return 1; + } + instance_ce = instance_ce->parent; + } + return 0; +} +``` + +```c +ZEND_API int zend_parse_parameters(int num_args, const char *type_spec, ...) /* {{{ */ +{ + va_list va; + int retval; + int flags = 0; + + va_start(va, type_spec); + retval = zend_parse_va_args(num_args, type_spec, &va, flags); + va_end(va); + + return retval; +} +/* }}} */ + +ZEND_API int zend_parse_method_parameters(int num_args, zval *this_ptr, const char *type_spec, ...) /* {{{ */ +{ + va_list va; + int retval; + int flags = 0; + const char *p = type_spec; + zval **object; + zend_class_entry *ce; + + /* Just checking this_ptr is not enough, because fcall_common_helper does not set + * Z_OBJ(EG(This)) to NULL when calling an internal function with common.scope == NULL. + * In that case EG(This) would still be the $this from the calling code and we'd take the + * wrong branch here. */ + zend_bool is_method = EG(current_execute_data)->func->common.scope != NULL; + + if (!is_method || !this_ptr || Z_TYPE_P(this_ptr) != IS_OBJECT) { + va_start(va, type_spec); + retval = zend_parse_va_args(num_args, type_spec, &va, flags); + va_end(va); + } else { + p++; + + va_start(va, type_spec); + + object = va_arg(va, zval **); + ce = va_arg(va, zend_class_entry *); + *object = this_ptr; + + if (ce && !instanceof_function(Z_OBJCE_P(this_ptr), ce)) { + zend_error_noreturn(E_CORE_ERROR, "%s::%s() must be derived from %s::%s", + ZSTR_VAL(Z_OBJCE_P(this_ptr)->name), get_active_function_name(), ZSTR_VAL(ce->name), get_active_function_name()); + } + + retval = zend_parse_va_args(num_args, p, &va, flags); + va_end(va); + } + return retval; +} +/* }}} */ +``` + +#### 使用 + +这里的**type_spec**我还加了一个 O,因为在源码中,`p++;`这里跳过了一个字符,那么我们后面`retval = zend_parse_va_args(num_args, p, &va, flags);`的时候传入的就是 **l 了, O** 这里应该是可以乱填一个字符的 + +**&this** 又传回来了- - + +```c +PHP_METHOD(study_ext_class,sum) +{ + zend_long parma_num=0; + zval* this=getThis(); + zval* static_num=zend_read_static_property(Z_OBJCE_P(this),"num",sizeof("num")-1,0); + // zval + if(zend_parse_method_parameters(ZEND_NUM_ARGS(),this,"Ol",&this,study_ce,&parma_num)==FAILURE){ + RETURN_LONG(-1) + } + if(Z_TYPE_P(static_num)==IS_LONG){ + RETURN_LONG(static_num->value.lval+parma_num) + } + RETURN_LONG(-1) +} +``` diff --git a/docs/note/学习笔记/PHP扩展开发/img/02-函数.assets/2018-09-21-14-20-32-的屏幕截图-300x132.png b/docs/note/学习笔记/PHP扩展开发/img/02-函数.assets/2018-09-21-14-20-32-的屏幕截图-300x132.png new file mode 100644 index 0000000..860df5b Binary files /dev/null and b/docs/note/学习笔记/PHP扩展开发/img/02-函数.assets/2018-09-21-14-20-32-的屏幕截图-300x132.png differ diff --git a/docs/note/学习笔记/SMTP+SSL协议研究-PHP实现.md b/docs/note/学习笔记/SMTP+SSL协议研究-PHP实现.md new file mode 100644 index 0000000..9c24435 --- /dev/null +++ b/docs/note/学习笔记/SMTP+SSL协议研究-PHP实现.md @@ -0,0 +1,47 @@ +--- +title: SMTP+SSL协议研究-PHP实现 +--- + +> 突然的就想尝试一下实现邮件发送协议,尤其是 SMTP+SSL 之类的方式,SMTP 协议全是明文的,写起来倒是不困难,但是到现在还完全不了解+SSL 的工作方式 + +## 开头 + +github:https://github.com/huanl-php/protocol + +打算以后将实现的协议都放在这里,所以要做好规划 + +### Socket + +[php socket](http://www.php.net/sockets "php socket") + +先了解好 php 的 socket 函数,和 c 的 socket 非常像.为什么这里我们使用 socket 来实现,而不是用 swoole,因为在大多数的情况下,swoole 扩展并不一定安装了,这是非常不方便的 + +### client 类 + +> 这个是用来连接服务器的,由这一个类扩展出其他的协议,需要在这个里面写好连接和发送,接收的一些功能 + +这里不贴代码了,可以去 github 看:https://github.com/huanl-php/protocol/blob/master/src/Client.php + +### smtp + +> 这里我拿我的阿里云的邮箱测试,参考这篇文章 [邮件实现详解(二)------手工体验 smtp 和 pop3 协议](https://www.cnblogs.com/ysocean/p/7653252.html#_label0),顺便学习了一波 telnet,这篇文章是真的详细,我就不写过程了 + + + +![](img/SMTP+SSL%E5%8D%8F%E8%AE%AE%E7%A0%94%E7%A9%B6-PHP%E5%AE%9E%E7%8E%B0.assets/TIM%E6%88%AA%E5%9B%BE20180822150356-300x201.png) + + + +### 实现 + +[SMTP](https://github.com/huanl-php/protocol/blob/master/src/SMTP.php)代码在这里了- -...然后看看 SSL...的工作方式 + +## SSL + +> SSL 相当于是中间的一套层,客户端发送消息经过 SSL 层加密发送给服务器,然后经过服务器的 SSL 层又解密给服务器 + +在 php 中,ssl 套层实现非常的简单...用`stream_socket_client`连接 server,然后使用`stream_socket_enable_crypto`设置 ssl 链接,之后`fwrite`发送数据(大概这就是 linux 的哲学**万物皆文件**的体现吧),如果是这样,那么只需要在 Client 类中,重写一次 connect 和 send 那些方法就够了 + +### 源码 + +[SSLClient](https://github.com/huanl-php/protocol/blob/master/src/SSLClient.php) diff --git a/docs/note/学习笔记/SSL-TLS-client-hello.md b/docs/note/学习笔记/SSL-TLS-client-hello.md new file mode 100644 index 0000000..3533e3b --- /dev/null +++ b/docs/note/学习笔记/SSL-TLS-client-hello.md @@ -0,0 +1,136 @@ +--- +title: SSL/TLS client hello 解析 +--- + +> 摘抄:SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议 + +> 上次写了个 ssl 的 smtp 协议,但是 ssl 实现那里,php 只需要随便调用几个函数就好了,觉得不过瘾,所以这次来看一下 ssl 的实现 + +## 准备 + +我们需要一个抓包工具**Wireshark** + +![](img/SSL-TLS-client-hello.assets/TIM%E6%88%AA%E5%9B%BE20180828092927.png) + +这是我捕获到的,为了方便,我是抓的我的博客,右键刷新源码,然后就停止抓包 + +上面是过滤内容,ip 地址等于我的博客的地址,并且是 ssl 协议(tls) + +在此之前我看了不少的相关知识,但是都只是说应用和流程,好处什么的,还有说一堆算法的,老夫看不懂,老夫才不管这些什么,老夫写代码就是一把梭 + +阮老师这篇文章说得挺容易理解[图解 SSL/TLS 协议](http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html) + +但是没有找到实现,后来谷歌搜了一下,才找到了一篇[client hello](https://blog.csdn.net/leinchu/article/details/80196025)解析的(再一次吐槽百度),通过这一篇文章我才有一点头绪 + +## SSL 握手 + +> 经过了 TCP 三次握手之后,就开始 SSL 的握手 + +### 结构 + +> 先了解一下大概结构 + +我们用 Wireshark 抓到了数据,写得非常的详细,看第一个包就是**client hello**,点它,然后点**secure sockets layer**这就是我们 ssl 的数据了,然后会帮我们选中我们的数据,非常的直接,前面那些应该是 tcp 协议相关的数据 + +![](img/SSL-TLS-client-hello.assets/TIM%E6%88%AA%E5%9B%BE20180828142314.png) + +看这个,感觉大概结构应该是这样,首先是包类型版本号和长度,然后是内容 + +```cpp +struct ssl_handshake{ + char type; + short version; + short length; + char *content; +} +``` + +握手包,点开 handshake Protocol 可以看到,client hello 和 server hello,前一部分都是这样 + +```cpp +//随机数 +struct ssl_random{ + int timestamp; + char random[28]; +} +struct ssl_hello{ + char type; + char length[3]; + short version; + struct ssl_random random; +} +``` + +这个结构我写到了随机数截止,因为后面的大多是不同的且变化 + +#### session + +**session**,这个是用来复用的,我记得这个只是一个记录,并不一定需要,于是我通过其他软件访问网页,抓到了一个没有 session 的包来比对,所以我们就可以直接在后面填充一个 0,然后继续后面的 + +![](img/SSL-TLS-client-hello.assets/TIM%E6%88%AA%E5%9B%BE20180829110033.png) + + + +#### cipher suites + +**cipher suites**应该是客户端支持的秘钥类型,里面应该都是一些常量值 + +意义,例如:TLS***ECDHE*****RSA**_WITH_**AES_128_GCM**\_ **SHA256** (0xc02f) +**ECDHE**秘钥交换算法 +**RSA**身份验证算法 +**AES_128_GCM**对称加密算法 +**SHA256**摘要算法 +这样按照顺序拆分开来看.... + +值的话,我只从 RFC 里面找到了零零散散的,不过我想干脆就从我们抓到的包里面提取几个吧 + +``` +Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c) +Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f) +Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c) +``` + +#### Extension + +> 跳过了 Compression Methods,等下按照我们抓到的值填就好了 + +Extension 听名字就知道是扩展项,感觉和原来的 radius 的一样 + +```cpp +struct ssl_extension{ + short type; + short length; + char *content; +} +``` + +我想先吧他们复制一下试试能不能行(偷懒,滑稽) + +### client hello + +> 客户端先给服务端打声招呼,告诉客户端支持的加密算法 balabala,先尝试写代码,发送一个 hello 的包给服务器看看回答 + +代码如下: + +```php + public function testSSLHello() { + $str = SSL::pac_ssl_handshake(22, SSL::TLSv3, + SSL::pack_ssl_hello(1, SSL::TLSv3, SSL::pack_ssl_random(), + hex2bin('00') . SSL::pack_ciphersuites(['009c', 'c02f', '003c']) . + hex2bin('0100005800000014001200000f626c6f672e69636f6465662e636f6d000500050100000000000a00080006001d00170018000b00020100000d001400120401050102010403050302030202060106030023000000170000ff01000100') + ) + );//那一大串十六进制是我复制的扩展区 + static::$client->send($str); + static::$client->recv($buf, 2048); + } +``` + +发送之后成功接收到了服务器的应答,扩展区里面还包含了服务器的一些信息,如果换服务器可能还要修改一下`Extension: server_name` + +~~今天坑先挖到这里,明天看 server hello~~ + +## 参考 + +[https://blog.csdn.net/mrpre/article/details/77867439](https://blog.csdn.net/mrpre/article/details/77867439) +[图解 SSL/TLS 协议](http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html) +[client hello](https://blog.csdn.net/leinchu/article/details/80196025) diff --git a/docs/note/学习笔记/android-邀请链接.md b/docs/note/学习笔记/android-邀请链接.md new file mode 100644 index 0000000..ca0b6a1 --- /dev/null +++ b/docs/note/学习笔记/android-邀请链接.md @@ -0,0 +1,114 @@ +--- +title: android 邀请链接,安装apk注册自动填写邀请人 +--- + +> 今天又遇到一个 app 推广的问题,要求通过下载链接下载安装之后,注册的时候自动填写这个邀请链接的邀请人,但是又怎么吧这个邀请人的信息填入这个 apk 包呢?开始想着在文件的最后直接写入用户的 uid,结果破坏的 apk 的结构,后来发现 apk 其实就是一个 zip 包,通过网上的资料找到了思路,通过邀请链接下载的时候就修改这个 zip 包的注释将邀请者的 uid 填入 + +## ZIP 文件结构 + +随手一搜就可以找到 zip 的文件结构 + +**[官方文档](https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt) [参考文章](https://blog.csdn.net/a200710716/article/details/51644421)** 这个文章后面还拿了一个简单的文件做讲解,挺不错的 + +其他的都不管他,我只想要注释那一段的结构, + +### End of central directory record(EOCD) 目录结束标识 + +目录结束标识存在于整个归档包的结尾,用于标记压缩的目录数据的结束。每个压缩文件必须有且只有一个 EOCD 记录。 + +| Offset | Bytes | Description | 翻译 | +| ------ | ----- | ----------------------------------------------------------------------------- | ----------------------------- | +| 0 | 4 | End of central directory signature = 0x06054b50 | 核心目录结束标记(0x06054b50 | +| 4 | 2 | Number of this disk | 当前磁盘编号 | +| 6 | 2 | Number of the disk with the start of the central directory | 核心目录开始位置的磁盘编号 | +| 8 | 2 | total number of entries in the central directory on this disk | 该磁盘上所记录的核心目录数量 | +| 10 | 2 | total number of entries in the central directory | 核心目录结构总数 | +| 12 | 2 | size of central directory (bytes) | 核心目录的大小 | +| 16 | 2 | offset of start of central directory with respect to the starting disk number | 核心相对于 archive 开始的位移 | +| 20 | 2 | .ZIP file comment length(n) | 注释长度 | +| 22 | n | .ZIP Comment | 注释内容 | + +### 先用易语言测试一下 + +先打包一个文件 + +![](img/android-%E9%82%80%E8%AF%B7%E9%93%BE%E6%8E%A5.assets/TIM%E6%88%AA%E5%9B%BE20180401230107-300x194.png) + +随手一读 + +``` +.版本 2 +.支持库 spec +.局部变量 data, 字节集 +data = 读入文件 (“test.zip”) +调试输出 (取字节集中间 (data, 寻找字节集 (data, { 80, 75, 5, 6 }, ), 50)) +调试输出 (到字节集 (“test123”)) +``` + +读取出来的数据中确实有 test123 +然后看看怎么写注释进去,这回读取 apk 的 + +``` +//80,75,5,6,0,0,0,0,18,0,18,0,18,5,0,0,55,14,17,0,0,0,60,105,110,118,62,50,60,47,105,110,118,62 +//读出来这玩意,先理清楚结构 +//80,75,5,6 EOCD +//0,0 磁盘编号 +//0,0 开始位置的磁盘编号 +//18,0 磁盘上所记录的核心目录数量 +//18,0 核心目录结构总数 +//18,5,0,0 核心目录的大小 +//55,14,17,0 核心目录开始位置相对于archive开始的位移 +//0,0 注释长度 +//0,60,105,110,118,62,50,60,47,105,110,118,62未知内容,不管了,我们只需要修改注释 + +.版本 2 + +.局部变量 data, 字节集 +.局部变量 tmpByte, 字节集 +.局部变量 pos, 整数型 + +data = 读入文件 (“test.apk”) +pos = 寻找字节集 (data, { 80, 75, 5, 6 }, ) +data [pos + 20] = 8 +tmpByte = 到字节集 (“12345678”) + { 0 } + 取字节集右边 (data, 取字节集长度 (data) - pos - 21) +data = 取字节集左边 (data, 寻找字节集 (data, { 80, 75, 5, 6 }, ) + 21) +data = data + tmpByte +写到文件 (“ddd.apk”, data) + + +成功写入压缩包,看看能不能在手机上安装 +成功可以安装使用 +``` + +### PHP 下载代码 + +php 的话就和前面一下,修改注释内容,直接贴 php 的代码了 +php 的文件操作就是文本操作....十六进制要用双引号\0xff 表示 + +```php + public function download_apk($inv = 1) { + if (!userModel::existUser($inv)) {//判断用户是否存在 + $inv = 0; + } + $invStr = '' . $inv . '';//设置注释 + $data = file_get_contents('app/kana.apk');//读取apk源数据 + $pos = strpos($data, "\x50\x4b\x05\x06"); + //搜索标志位置(一般都是文件尾部,不考虑了) + $data = substr($data, 0, $pos + 20); + //取出标志+20左边,等下直接从注释长度那块合成 + $dec = dechex(strlen($invStr)); + //将长度转为十六进制,后面再将十六进制转为byte,只考虑一位,反正ff,255个长度也够了 + $data .= hex2bin(strlen($dec) <= 1 ? ('0' . $dec) : $dec) . "\x00$invStr";//合成注释 + header("Content-Type: application/octet-stream"); + header("Accept-Ranges: bytes"); + header("Accept-Length: " . strlen($data)); + header("Content-Disposition: attachment; filename=kana.apk"); + echo $data;//输出文件数据 + } +``` + +### android 读取 + +暂时空着,android 又不是我写 ┓( ´∀` )┏,贴一下思路吧 +读取本地安装的 apk 包数据,然后在里面搜索这个注释(怎么感觉和没讲一样) +总之很简单的 diff --git a/docs/note/学习笔记/automake-使用记录.md b/docs/note/学习笔记/automake-使用记录.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/note/学习笔记/c-协程.md b/docs/note/学习笔记/c-协程.md new file mode 100644 index 0000000..cb0add1 --- /dev/null +++ b/docs/note/学习笔记/c-协程.md @@ -0,0 +1,277 @@ +--- +title: c 协程 +--- + +## 前言 + +协程可以说是用同步的代码写出异步的效果,前几天还看了异步,这些都算是在高性能系统中的一部分,都是压榨我们的 cpu,将 io 堵塞的时间去做其他事情。 + +异步的解决方式是执行立刻返回,我们的代码继续往下走,当完成之后通知我们。 + +协程的方式是代码执行立刻返回,之后我们将该条协程挂起,然后这段时间去执行其他的协程,等待 io 完成后恢复这条协程继续往下执行。相比于异步,至少在代码上就不会出现那种回调地狱了。 + +和线程相比,协程更加轻量,占用资源更少,通过协作的方式利用资源(因为是在单条线程内,不会同时执行)而不是抢占(多条线程可能同时执行读取某一数据),线程是由系统进行调度,协程是用户自己进行调度。 + +## 实现 + +在 c 中有好几种协程的实现方式,这里我使用 ucontext 实现 + +- 利用 switch-case 奇淫巧技实现 +- asm 汇编实现 +- 利用 c 的 setjmp 和 longjmp 函数实现 +- ucontext 保存上下文实现 +- boost.context + +### ucontext 函数 + +先了解一下[ucontext](http://pubs.opengroup.org/onlinepubs/7908799/xsh/ucontext.h.html)的函数 + +```c +int getcontext(ucontext_t *); +int setcontext(const ucontext_t *); +void makecontext(ucontext_t *, (void *)(), int, ...); +int swapcontext(ucontext_t *, const ucontext_t *); +``` + +### get/setcontext + +[http://pubs.opengroup.org/onlinepubs/7908799/xsh/getcontext.html](http://pubs.opengroup.org/onlinepubs/7908799/xsh/getcontext.html) +用于获取当前和设置上下文 + +#### 例子 + +这个例子会一直输出 hello,和 goto 有点相似,不同的是,它可以在不同的函数之中进行跳转 + +getcontext 把当前的上下文保存到 ucp 中,后面使用 setcontext 恢复 + +```c +ucontext_t ucp; +void print() { + printf("hello\n"); + setcontext(&ucp); +} +int main() { + getcontext(&ucp); + sleep(1); + print(); + return 0; +} +``` + +### make/swapcontext + +修改 getcontext 初始化的 ucp 上下文,调用 swapcontext 或 setcontext 恢复的时候程序将调用 func,可以自己分配堆栈,**uc_link**可以指定执行完后的上下文 + +swapcontext 将当前上下文保存在 ocup 上,并将上下文设置为 ucp + +#### 例子 + +```c +void print() { + printf("hello\n"); +} + +int main() { + ucontext_t ucp, print_ucp; + getcontext(&ucp); + print_ucp = ucp; + char stack[10 * 1204]; + print_ucp.uc_stack.ss_sp = stack; + print_ucp.uc_stack.ss_size = sizeof(stack); + print_ucp.uc_stack.ss_flags = 0; + print_ucp.uc_link = &ucp; + makecontext(&print_ucp, print, 0); + + swapcontext(&ucp, &print_ucp); + printf("end\n"); + return 0; +} +``` + +### 协程 + +协程的一个关键就是上下文切换,在我们需要的时候切换至其他的协程 + +这里我只是写了一个非常简单的协程,只有创建,挂起,恢复功能 + +### 定义 + +定义了协程的状态,大小,协程函数指针,我的协程的结构体 + +**重点是我们的结构体里面,两个 ucontext_t,我们需要利用他们进行上下文的切换** + +```c +#define STACK_SIZE 1024*128 +#define CO_RUN 1 +#define CO_HANG 2 +#define CO_OVER 3 + +typedef void (*co_func)(struct coroutine *co); + +struct coroutine { + char stack[STACK_SIZE];//栈 + ucontext_t ctx;//协程上下文 + ucontext_t ucp;//主线程上下文 + char status;//协程状态 +}; +``` + +#### 创建协程 + +这里我没有直接的指向**func**因为还有一个完成状态要标记,所以我们定义了一个我们的协程主函数进行一些处理 + +我的创建协程主要是做的事情是,初始化上下文,调起函数 + +```c +void co_main(struct coroutine *co, co_func func) { + func(co); + co->status = CO_OVER; +} +void co_create(struct coroutine *co, co_func func) { + getcontext(&co->ucp); + co->ctx = co->ucp; + co->ctx.uc_stack.ss_sp = co->stack; + co->ctx.uc_stack.ss_size = STACK_SIZE; + co->ctx.uc_stack.ss_flags = 0; + co->ctx.uc_link = &co->ucp; + co->status = CO_RUN; + makecontext(&co->ctx, co_main, 2, co, func);//指向的co_main + swapcontext(&co->ucp, &co->ctx); +} +``` + +### 挂起/恢复协程 + +挂起和恢复的时候我们都用 status 判断了一下是否执行结束 + +挂起和恢复就是上下文的交换,调用的**swapcontext**,挂起时将我们协程的上下文记录,切换到线程的上下文,交给线程去进行调度,恢复则相反 + +```c +void co_yield(struct coroutine *co) { + if (co->status == CO_OVER) { + return; + } + co->status = CO_HANG; + swapcontext(&co->ctx, &co->ucp); +} + +void co_resume(struct coroutine *co) { + if (co->status == CO_OVER) { + return; + } + co->status = CO_RUN; + swapcontext(&co->ucp, &co->ctx); +} +``` + +### 完整源码 + +```c +#include +#include +#include + +#define STACK_SIZE 1024*128 +#define CO_RUN 1 +#define CO_HANG 2 +#define CO_OVER 3 + +typedef void (*co_func)(struct coroutine *co); + +struct coroutine { + char stack[STACK_SIZE];//栈 + ucontext_t ctx;//ucp + ucontext_t ucp; + char status;//协程状态 +}; + +void co_main(struct coroutine *co, co_func func) { + func(co); + co->status = CO_OVER; +} + +void co_create(struct coroutine *co, co_func func) { + getcontext(&co->ucp); + co->ctx = co->ucp; + co->ctx.uc_stack.ss_sp = co->stack; + co->ctx.uc_stack.ss_size = STACK_SIZE; + co->ctx.uc_stack.ss_flags = 0; + co->ctx.uc_link = &co->ucp; + co->status = CO_RUN; + makecontext(&co->ctx, co_main, 2, co, func); + swapcontext(&co->ucp, &co->ctx); +} + +void co_yield(struct coroutine *co) { + if (co->status == CO_OVER) { + return; + } + co->status = CO_HANG; + swapcontext(&co->ctx, &co->ucp); +} + +void co_resume(struct coroutine *co) { + if (co->status == CO_OVER) { + return; + } + co->status = CO_RUN; + swapcontext(&co->ucp, &co->ctx); +} + +int co_status(struct coroutine *co) { + return co->status; +} + +void print1(struct coroutine *co) { + for (int i = 0; i < 50; i++) { + printf("1号协程:%d\n", i); + co_yield(co); + } +} + +void print2(struct coroutine *co) { + for (int i = 100; i < 200; i++) { + printf("2号协程:%d\n", i); + co_yield(co); + } +} + +int main() { + struct coroutine co1, co2; + co_create(&co1, print1); + co_create(&co2, print2); + while (co_status(&co1) != CO_OVER || co_status(&co2) != CO_OVER) { + co_resume(&co1); + co_resume(&co2); + } + return 0; +} +``` + +### 栈 + +贴一个例子,将上面的第二个 swapcontext 那里的例子,print 换成下面这个,帮助大家理解一下栈,看输出,暂时就不写说明了 + +```c +void test() { + int a = 1, len = ((int64_t) (&stack[10 * 1024 - 1]) - (int64_t) (&a)), b = 23; + for (int i = 10 * 1024 - len - 8; i < 10 * 1024; i++) { + if (i % 20 == 0) { + printf("\n"); + } + printf("%d\t", stack[i]); + } +} + +void print() { + int a = 1, len = ((int64_t) (&stack[10 * 1024 - 1]) - (int64_t) (&a)), b = 23; + printf("hello,%ld,%ld,%d\n", &a, &stack[10 * 1024 - 1], (int64_t) (&stack[10 * 1024 - 1]) - (int64_t) (&a)); + test(); +// for (int i = 10 * 1024 - len - 8; i < 10 * 1024; i++) { +// if (i % 20 == 0) { +// printf("\n"); +// } +// printf("%d\t", stack[i]); +// } +} +``` diff --git a/docs/note/学习笔记/img/SMTP+SSL协议研究-PHP实现.assets/TIM截图20180822150356-300x201.png b/docs/note/学习笔记/img/SMTP+SSL协议研究-PHP实现.assets/TIM截图20180822150356-300x201.png new file mode 100644 index 0000000..2914799 Binary files /dev/null and b/docs/note/学习笔记/img/SMTP+SSL协议研究-PHP实现.assets/TIM截图20180822150356-300x201.png differ diff --git a/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180828092927.png b/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180828092927.png new file mode 100644 index 0000000..8f9b000 Binary files /dev/null and b/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180828092927.png differ diff --git a/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180828142314.png b/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180828142314.png new file mode 100644 index 0000000..c3fd504 Binary files /dev/null and b/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180828142314.png differ diff --git a/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180829110033.png b/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180829110033.png new file mode 100644 index 0000000..ca3f9e5 Binary files /dev/null and b/docs/note/学习笔记/img/SSL-TLS-client-hello.assets/TIM截图20180829110033.png differ diff --git a/docs/note/学习笔记/img/android-邀请链接.assets/TIM截图20180401230107-300x194.png b/docs/note/学习笔记/img/android-邀请链接.assets/TIM截图20180401230107-300x194.png new file mode 100644 index 0000000..d0347da Binary files /dev/null and b/docs/note/学习笔记/img/android-邀请链接.assets/TIM截图20180401230107-300x194.png differ diff --git a/docs/note/学习笔记/linux-aio-异步io.md b/docs/note/学习笔记/linux-aio-异步io.md new file mode 100644 index 0000000..1795274 --- /dev/null +++ b/docs/note/学习笔记/linux-aio-异步io.md @@ -0,0 +1,72 @@ +--- +title: linux aio 异步io +--- + +> linux 下的 aio 有 glibc 的和内核所提供的,glibc 是使用的多线程的模式模拟的,另外一种是真正的内核异步通知了,已经使用在了 nginx 上,前面看了一下 swoole 的实现,是类似与 glibc 那种多线程的模式。不过两种方法都有一定的毛病,多线程模拟自然是有所效率损失,然而内核不能利用系统的缓存,只能以 O_DIRECT 方式做直接 IO,所以看知乎上有一个**linux 下的异步 IO(AIO)是否已成熟?**的问题,不过那是 2014 年的事情了,不知道现在怎么样。 + +在此之前需要安装好 **libaio** + +``` +sudo apt install libaio-dev +``` + +## 函数 + +头文件:`#include ` + +## 例子 + +> 一个一步读取文件内容的例子 + +```c +#include +#include +#include +#include +#include + +#define MAX_EVENT 10 +#define BUF_LEN 1024 + +void callback(io_context_t ctx, struct iocb *iocb, long res, long res2) { + printf("test call\n"); + printf("%s\n", iocb->u.c.buf); +} + +int main() { + int fd = open("/home/huanl/client.ovpn", O_RDONLY, 0); + io_context_t io_context; + struct iocb io, *p = &io; + struct io_event event[MAX_EVENT]; + char *buf = malloc(BUF_LEN); + memset(buf, 0, BUF_LEN); + memset(&io_context, 0, sizeof(io_context)); + + if (io_setup(10, &io_context)) { + printf("io_setup error"); + return 0; + } + if (fd < 0) { + printf("open file error"); + return 0; + } + io_prep_pread(&io, fd, buf, BUF_LEN, 0); + io_set_callback(&io, callback); + if (io_submit(io_context, 1, &p) < 0) { + printf("io_submit error"); + return 0; + } + + int num = io_getevents(io_context, 1, MAX_EVENT, event, NULL); + for (int i = 0; i < num; i++) { + io_callback_t io_callback = event[i].data; + io_callback(io_context, event[i].obj, event[i].res, event[i].res2); + } + + return 0; +} +``` + +## 参考 + +[https://jin-yang.github.io/post/linux-program-aio.html](https://jin-yang.github.io/post/linux-program-aio.html) diff --git a/docs/note/学习笔记/swoole学习笔记/01-swoole环境配置.md b/docs/note/学习笔记/swoole学习笔记/01-swoole环境配置.md new file mode 100644 index 0000000..5d6c19f --- /dev/null +++ b/docs/note/学习笔记/swoole学习笔记/01-swoole环境配置.md @@ -0,0 +1,234 @@ +--- +title: swoole学习笔记(一)-swoole环境配置(树莓派安装) +--- + +> 打算开始学习 swoole 了(原来好像弄过,不过那次只是接触了一下,并未太过深入,这次重新来过 (° ー °〃) +> swoole 虽然能在 windows 上搭建,不过我觉得意义不大....需要安装 CygWin 这和在 linux 上有什么区别呢 ┑( ̄ Д  ̄)┍,刚好现在手上有一台空闲的树莓派 zero,试试在上面搭建 + +## 编译 php + +> 之所以要编译安装是因为在 swoole 编译的时候需要用到 phpize,apt-get 安装的时候没发现有 + +现在这个上面什么东西都没有,先安装 php,我选最新的 php7.2.6,zero 配置是真的好低....解压和编译 cpu 都 100%了很慢....趁这个时间去干点别的吧 + +下载,解压源码,安装依赖 + +强烈建议使用国内镜像....不然可能一些依赖 lib 按照失败,导致编译错误 + +``` +sudo -i +wget http://hk1.php.net/get/php-7.2.6.tar.gz/from/this/mirror +mv mirro php.tar.gz +tar -zxvf php.tar.gz +apt-get update +apt-get install libxml2* libbz2-dev libjpeg-dev libmcrypt-dev libssl-dev openssl libxslt1-dev libxslt1.1 libcurl4-gnutls-dev libpq-dev build-essential git make +``` + +编译配置,复制的网上的 lnmp 编译- -...去掉了和 Nginx 有关的编译项,我只需要编译出 php 就行,不需要 Nginx 那些环境,当然如果你之前已经有了这些,这一部分就可以跳过了 + +``` +cd php-7.2.6 + ./configure \ +--prefix=/usr/local/php \ +--exec-prefix=/usr/local/php \ +--bindir=/usr/local/php/bin \ +--sbindir=/usr/local/php/sbin \ +--includedir=/usr/local/php/include \ +--libdir=/usr/local/php/lib/php \ +--mandir=/usr/local/php/php/man \ +--with-config-file-path=/usr/local/php/etc \ +--with-mysql-sock=/var/lib/mysql/mysql.sock \ +--with-mcrypt=/usr/include \ +--with-mhash \ +--with-openssl \ +--with-mysql=shared,mysqlnd \ +--with-mysqli=shared,mysqlnd \ +--with-pdo-mysql=shared,mysqlnd \ +--with-gd \ +--with-iconv \ +--with-zlib \ +--enable-zip \ +--enable-inline-optimization \ +--disable-debug \ +--disable-rpath \ +--enable-shared \ +--enable-xml \ +--enable-bcmath \ +--enable-shmop \ +--enable-sysvsem \ +--enable-mbregex \ +--enable-mbstring \ +--enable-ftp \ +--enable-gd-native-ttf \ +--enable-pcntl \ +--enable-sockets \ +--with-xmlrpc \ +--enable-soap \ +--without-pear \ +--with-gettext \ +--enable-session \ +--with-curl \ +--with-freetype-dir \ +--enable-opcache \ +--enable-redis \ +--enable-fpm \ +--enable-fastcgi \ +--disable-fileinfo +``` + +![](img/01-swoole%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180619143040-300x207.png) + +CPU 100% 有点怕,树莓派 zero 性能确实是弱...编译好慢....解决了编译配置的问题后就开始编译,我是真的睡了一觉(第二天)才起来 make install + +``` +make && make install +``` + +设置一下 php.ini 文件 + +``` +cp php.ini-production /usr/local/php/etc/php.ini +//我输入php -v之后发现没反应,但是php确实是成功了,在/usr/local/php/bin里面./php -v也有反应,想到可能是没有链接到/usr/bin 目录里,用ln命令链接一下 +ln -s /usr/local/php/bin/php /usr/bin/php +//链接phpize +ln -s /usr/local/php/bin/phpize /usr/bin/phpize +``` + +成功之后,老套路 + +``` +php -v +``` + +![](img/01-swoole%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620085032-300x87.png) + +成功,终于可以下一步了,进入 swoole 编译配置 + +## swoole 编译 + +从 git 上下载源码[https://github.com/swoole/swoole-src/releases](https://github.com/swoole/swoole-src/releases),开始编译 + +``` +wget https://github.com/swoole/swoole-src/archive/v4.0.0.zip +unzip v4.0.0.zip +mv swoole-src-4.0.0/ swoole +cd swoole +phpize +``` + +这里我提示了一个错误... +Cannot find autoconf. Please check your autoconf installation and the +$PHP_AUTOCONF environment variable. Then, rerun this script. +解决办法: + +``` +apt-get install m4 autoconf +``` + +phpize 成功之后继续运行编译配置和开始编译(但愿这次不用那么久了...) + +开启一些需要的:[编译配置项](https://wiki.swoole.com/wiki/page/437.html) + +``` +./configure --with-php-config=/usr/local/php/bin/php-config --enable-sockets --enable-swoole-debug --enable-openssl --enable-mysqlnd --enable-coroutine +make && make install +``` + +![](img/01-swoole%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620095954-300x207.png) + +然后需要在 php.ini 中配置下 + +``` +vi /usr/local/php/etc/php.ini +//添加 +extension=swoole.so +``` + +然后`php -m` + +![](img/01-swoole%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620113804-300x207.png) + +有这一项就代表成啦~ + +## 测试 + +> 安装编译都完成之后,当然来试试是不是真的能用了 + +复制官方的例子,嘿嘿嘿~ + +```php +on('open', function ($ws, $request) { + var_dump($request->fd, $request->get, $request->server); + $ws->push($request->fd, "hello, welcome\n"); +}); +//监听WebSocket消息事件 +$ws->on('message', function ($ws, $frame) { + echo "Message: {$frame->data}\n"; + $ws->push($frame->fd, "server: {$frame->data}"); +}); +//监听WebSocket连接关闭事件 +$ws->on('close', function ($ws, $fd) { + echo "client-{$fd} is closed\n"; +}); +$ws->start(); +``` + +`php swoole.php` +web: + +```html + +``` + +成了~ + +![](img/01-swoole%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620114807-300x207.png) + +--- + +## 问题解决 + +### redis 扩展安装 + +> 弄完后...并没有用,然后重新编译一次成了....= =,不过还是记着 + +在 swoole 编译完成后,又遇到了一个问题.... + +``` +php: symbol lookup error: /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/swoole.so: undefined symbol: swoole_redis_coro_init +``` + +查资料后发现可能是需要给 php 安装 redis 扩展....[redis 源码下载](https://pecl.php.net/package/redis) + +``` +wget https://pecl.php.net/get/redis-4.0.2.tgz +tar -zxvf redis-4.0.2.tgz +cd redis-4.0.2 +phpize +./configure --with-php-config=/usr/local/php/bin/php-config +make && make install +``` + +然后在 php.ini 中加上`extension = redis.so`就好了,注意这个配置一定要放在 swoole 的配置的前面,因为这些扩展都是按照顺序加载的 + +--- + +**历时一天,终于搞定了 编译真的是漫长的过程=\_=** diff --git a/docs/note/学习笔记/swoole学习笔记/02-开发环境配置.md b/docs/note/学习笔记/swoole学习笔记/02-开发环境配置.md new file mode 100644 index 0000000..4874e6d --- /dev/null +++ b/docs/note/学习笔记/swoole学习笔记/02-开发环境配置.md @@ -0,0 +1,134 @@ +--- +title: swoole学习笔记(二)-开发环境配置 +--- + +> swoole 可以跑了,然后开始弄开发环境 + +> 后面的 xdebug,在协程中 tm 不能用!...有挺多问题的,不推荐配置了,写 log 吧 + +## 代码自动上传 + +我的开发环境一般是 windows,phpstorm,然而我的树莓派和 swoole 的环境又不在一起,这时候就可以用 phpstorm 的一个功能,可以自动同步代码 + +File->setting->Deployment + +添加一个,选择 sftp,然后输入 pi 的信息 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620131748-300x204.png) + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620132024-1-300x204.png) + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620132024-2-300x204.png) + +添加好服务器后,再设置 options + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620133255-300x204.png) + +自动上传就配置好了,当你保存的时候就会自动上传到服务器 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180620133409-300x96.png) + +## 代码自动提示 + +> 对于我这种百度型程序员,自动提示是必不可少的 + +### swoole-ide-helper + +https://github.com/eaglewu/swoole-ide-helper + +这是一个**Swoole 在 IDE 下自动识别类、函数、宏,自动补全函数名** + +#### 安装方法 + +##### phpstrom + +将项目 clone 或者直接下载下来,解压 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622124636-300x216.png) + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622124713-300x227.png) + +##### composer + +要是你的项目中使用了 composer,你可以直接 + +```bash +composer require --dev "eaglewu/swoole-ide-helper:dev-master" +``` + +## 远程调试配置 + +> 虽然可以通过 echo 之类的来调试,但是断点调试也是必不可少的 + +### XDebug 安装 + +[https://github.com/xdebug/xdebug](https://github.com/xdebug/xdebug) + +```bash +wget https://github.com/xdebug/xdebug/archive/2.6.0.tar.gz +tar -zxvf 2.6.0.tar.gz +cd xdebug-2.6.0/ +./configure --with-php-config=/usr/local/php/bin/php-config +make && make install +``` + +然后在 php.ini 中配置 + +```toml +zend_extension=xdebug.so +[xdebug] +xdebug.remote_enable=true +xdebug.remote_host=127.0.0.1 +xdebug.remote_port=9000 +xdebug.remote_handler=dbgp +``` + +保存之后`php -m`,出现 xdebug 就算安装成功了 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622161650-300x203.png) + +### phpstorm 配置 + +setting 中 php 配置,设置一下远程 cli + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622161818-300x204.png) + +在之前已经配置了远程自动同步的话,这里是会有服务器可以选择的 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622162052-300x107.png) + +点击 OK 之后,phpstorm 会自动获取远程的 php 信息,如下 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622162146-300x246.png) + +之后选择我们刚刚添加的(我重命名了 pi_zero php7.2) + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622162303-300x204.png) + +然后下方的 path mappings,也需要设置(我这里默认设置好了),对本地与远程的目录进行映射 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622162622-300x108.png) + +xdebug 的端口 9000,一开始就是这样的,如果你改了的话,这里注意也改一下 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622162413-300x107.png) + +这些配置好之后就可以开始配置调试选项了 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622162413-1-300x203.png) + +配置启动文件 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622162829-300x254.png) + +之后就可以开始调试了,在我们的源码下下断点,然后点击调试按钮,成功~! + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622163913-300x219.png) + +当收到信息/连接的时候: + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/TIM%E6%88%AA%E5%9B%BE20180622164021-300x238.png) + +非常舒服,嘿嘿嘿 + +![](img/02-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE.assets/1LE84QO9K@A1N9.jpg) diff --git a/docs/note/学习笔记/swoole学习笔记/03-UDP-radius协议实现.md b/docs/note/学习笔记/swoole学习笔记/03-UDP-radius协议实现.md new file mode 100644 index 0000000..08c8871 --- /dev/null +++ b/docs/note/学习笔记/swoole学习笔记/03-UDP-radius协议实现.md @@ -0,0 +1,445 @@ +--- +title: swoole学习笔记(三)-UDP radius协议实现 +--- + +> 又开新坑-swoole 作为 radius 服务器,huanlphp 写业务 [php-radius](https://github.com/CodFrm/php-radius "php-radius") 主要还是为了学习 swoole 和实验我的框架,所以这里记录一下 radius 协议的结构和使用(原来用 python 实现过一次,容易崩溃还写得垃圾),文章中只写了 auth,没有写 account 的记录,openvpn 需要 auth 和 account 才能实现连接成功,可以看我完整的实现[python 实现](https://github.com/CodFrm/stuShare/blob/master/radius/main.py) + +## 协议&工具 + +- [rfc2865 radius 身份认证](https://tools.ietf.org/html/rfc2865) +- [rfc2866 radius 计费](https://tools.ietf.org/html/rfc2866) + +测试工具我用的 NTRadPing:[http://www.winsite.com/internet/server-tools/ntradping/](http://www.winsite.com/internet/server-tools/ntradping/) + +![](img/03-UDP-radius%E5%8D%8F%E8%AE%AE%E5%AE%9E%E7%8E%B0.assets/TIM%E6%88%AA%E5%9B%BE20180622220548-300x188.png) + +## 结构 + +### pack fromat + +> 关于计费和验证的格式都是一样的 + +验证:[https://tools.ietf.org/html/rfc2865#page-13](https://tools.ietf.org/html/rfc2865#page-13) + +计费:[https://tools.ietf.org/html/rfc2866#page-5](https://tools.ietf.org/html/rfc2866#page-5) + +``` + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Code | Identifier | Length | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + | Authenticator | + | | + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Attributes ... + +-+-+-+-+-+-+-+-+-+-+-+-+- +``` + +看得有些隐晦,我将它转换成 c 的 struct 结构吧 +char 1 个字节,8bit short 两个字节,16bit + +```c +struct radius_format{ + char code;//包类型,请求类型根据这个判断 + char identifier;//鉴定码,服务器和客户端这个值需要一样 + short lenght; //本次数据包的总长度(20-4096) + char authenticator[16];//数据hash,用来校验数据是否正确,一个数据的md5码 +}; +``` + +在响应的时候 authenticator 的计算方式为:MD5(Code+ID+Length+RequestAuth+Attributes+**Secret**) 在计算中的**RequestAuth**为请求的时候的 authenticator,**Secret**记笔记,是双方的一个 key + +后面的 Attributes 长度不一定(length-20),里面包含着 **用户/NAS** 的一些信息,比如账号,密码,ip,之类的,格式看后面,这里也可以用来扩展自己的协议,带上自己的一些奇奇怪怪的值- - + +#### code 意义 + +主要就是前面 5 个了 + +``` + RADIUS Codes (decimal) are assigned as follows: + + 1 Access-Request //验证请求,一般由客户端使用 + 2 Access-Accept //验证通过,一般由服务端处理返回 + 3 Access-Reject //验证拒绝,一般由服务端处理返回 + 4 Accounting-Request //计费请求,客户端发起 + 5 Accounting-Response //计费返回,服务器发起 + 11 Access-Challeng //服务端主动请求再次验证,客户端要求必须返回 + 12 Status-Server (experimental)//服务器状态???没看到说明 + 13 Status-Client (experimental)//同上 + 255 Reserved//保留 +``` + +### Attributes + +[https://tools.ietf.org/html/rfc2865#page-22](https://tools.ietf.org/html/rfc2865#page-22) + +``` + 0 1 2 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + | Type | Length | Value ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +``` + +```c +struct radius_attr{ + char type;//类型,有不少... + char length;//type+length+value的长度 +} +``` + +value 是不固定的(长度:1-253),根据 length 来判定(就是 length-2 咯) + +#### type + +> 偷懒了,不写意义了 + +验证属性:[https://tools.ietf.org/html/rfc2865#page-24](https://tools.ietf.org/html/rfc2865#page-24) + +计费属性:[https://tools.ietf.org/html/rfc2866#page-11](https://tools.ietf.org/html/rfc2866#page-11) + +``` + This specification concerns the following values: + + 1 User-Name //登录用户名 + 2 User-Password //登录密码 + 3 CHAP-Password + 4 NAS-IP-Address //NAS的IP地址 + 5 NAS-Port //NAS的端口 + 6 Service-Type + 7 Framed-Protocol + 8 Framed-IP-Address + 9 Framed-IP-Netmask + 10 Framed-Routing + 11 Filter-Id + 12 Framed-MTU + 13 Framed-Compression + 14 Login-IP-Host + 15 Login-Service + 16 Login-TCP-Port + 17 (unassigned) + 18 Reply-Message + 19 Callback-Number + 20 Callback-Id + 21 (unassigned) + 22 Framed-Route + 23 Framed-IPX-Network + 24 State + 25 Class + 26 Vendor-Specific + 27 Session-Timeout + 28 Idle-Timeout + 29 Termination-Action + 30 Called-Station-Id + 31 Calling-Station-Id + 32 NAS-Identifier + 33 Proxy-State + 34 Login-LAT-Service + 35 Login-LAT-Node + 36 Login-LAT-Group + 37 Framed-AppleTalk-Link + 38 Framed-AppleTalk-Network + 39 Framed-AppleTalk-Zone + 40-59 (reserved for accounting)//计费的,包含流量信息和连接时间什么的 + 60 CHAP-Challenge + 61 NAS-Port-Type + 62 Port-Limit + 63 Login-LAT-Port +``` + +## 实现 + +> 利用 NTR 工具发送测试数据,使用 php-swoole 来接收和处理 + +### 解包 + +php 中使用 unpack 来解包,还是很方便的 + +```php + public function onPacket(swoole_server $serv, string $data, array $clientInfo) { + //解包 + $radius = unpack('ccode/cidentifier/nlength/a16authenticator', $data); + print_r($radius); + echo bin2hex($radius['authenticator']) . "\n"; + echo bin2hex($data); + } + +``` + +![](img/03-UDP-radius%E5%8D%8F%E8%AE%AE%E5%AE%9E%E7%8E%B0.assets/TIM%E6%88%AA%E5%9B%BE20180623221807-300x101.png) + +后面还需要处理 attr 属性,这是我解码的代码 + +```php + 'User-Name', + 2 => 'User-Password', 3 => 'CHAP-Password', 4 => 'NAS-IP-Address', 5 => 'NAS-Port', 6 => 'Service-Type', + 7 => 'Framed-Protocol', 8 => 'Framed-IP-Address', 9 => 'Framed-IP-Netmask', 10 => 'Framed-Routing', + 11 => 'Filter-Id', 12 => 'Framed-MTU', 13 => 'Framed-Compression', 14 => 'Login-IP-Host', 15 => 'Login-Service', + 16 => 'Login-TCP-Port', 17 => '(unassigned)', 18 => 'Reply-Message', 19 => 'Callback-Number', + 20 => 'Callback-Id', 21 => '(unassigned)', 22 => 'Framed-Route', 23 => 'Framed-IPX-Network', 24 => 'State', + 25 => 'Class', 26 => 'Vendor-Specific', 27 => 'Session-Timeout', 28 => 'Idle-Timeout', 29 => 'Termination-Action', + 30 => 'Called-Station-Id', 31 => 'Calling-Station-Id', 32 => 'NAS-Identifier', 33 => 'Proxy-State', + 34 => 'Login-LAT-Service', 35 => 'Login-LAT-Node', 36 => 'Login-LAT-Group', 37 => 'Framed-AppleTalk-Link', + 38 => 'Framed-AppleTalk-Network', 39 => 'Framed-AppleTalk-Zone', + 60 => 'CHAP-Challenge', 61 => 'NAS-Port-Type', 62 => 'Port-Limit', 63 => 'Login-LAT-Port']; + + /** + * 收到udp数据包 + * @param swoole_server $serv + * @param string $data + * @param array $clientInfo + */ + public function onPacket(swoole_server $serv, string $data, array $clientInfo) { + $attr = []; + $struct = $this->unpack($data, $attr); + print_r($struct); + print_r($attr); + } + + /** + * 解码radius数据包 + * @param string $bin + * @param array $attr + * @return array|bool + */ + public function unpack(string $bin, array &$attr): array { + //一个正常的radius封包长度是绝对大于等于20的 + if (strlen($bin) < 20) { + return []; + } + //解包 + $radius = unpack('ccode/cidentifier/nlength/a16authenticator', $bin); + //获取后面的属性长度,并且对数据包进行验证 + if (strlen($bin) != $radius['length']) { + return []; + } + $attr_len = $radius['length'] - 20; + //处理得到后面的Attributes,并且解包 + $attr = $this->unpack_attr(substr($bin, 20, $attr_len)); + if ($attr == []) { + return []; + } + return $radius; + } + + /** + * 处理Attributes + * @param string $bin + * @return array + */ + public function unpack_attr(string $bin): array { + $attr = []; + $offset = 0; + $len = strlen($bin); + while ($offset < $len) { + $attr_type = ord($bin[$offset]);//属性类型 + $attr_len = ord($bin[$offset + 1]);//属性长度 + $attr[static::$ATTR_TYPE[$attr_type]] = substr($bin, $offset + 2, $attr_len - 2);//属性值 + //跳到下一个 + $offset += $attr_len; + } + //判断offset和$len是否相等,不相等认为无效,抛弃这个封包 + if ($offset != $len) { + return []; + } + return $attr; + } + + + /** + * 运行服务器 + * @param int $authPort + * @param int $accountPort + */ + public function run(string $secret_key, int $authPort = 1812, int $accountPort = 1813) { + $server = new swoole_server("0.0.0.0", $authPort, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); + $server->on('Packet', array($this, 'onPacket')); + $server->start(); + $this->server = $server; + $this->secret_key = $secret_key; + } +} + +$server = new radius(); +$server->run('test123'); +``` + +![](img/03-UDP-radius%E5%8D%8F%E8%AE%AE%E5%AE%9E%E7%8E%B0.assets/TIM%E6%88%AA%E5%9B%BE20180624151246-300x156.png) + +### 密码验证 + +> 密码有两种的加密方式 `User-Password(PAP加密)`和`CHAP-Password(CHAP加密)` + +### User-Password + +[https://tools.ietf.org/html/rfc2865#page-27](https://tools.ietf.org/html/rfc2865#page-27) + +> 在传输时,密码是隐藏的。首先在密码的末尾用空值填充 16 个字节的倍数。单向 MD5 哈希是通过由共享密钥组成的八位字节流来计算的,后面是请求身份验证器。该值与密码的前 16 个八位位组段进行异或并放置在用户密码属性的字符串字段的前 16 个八位位组中。 +> +> 如果密码长度超过 16 个字符,则第二个单向 MD5 散列值将通过由共享密钥组成的八位字节流计算,然后是第一个异或结果。该散列与密码的第二个 16 位八位字节进行异或,并置于用户密码属性的字符串字段的第二个 16 位字节中。 +> +> 调用**共享密钥 S**和伪随机 128 位请求认证器**RA** 。 将密码分成 16 个八位字节块 p1,p2 等。 最后一个填充为零,最终为 16 个八位字节的边界。 调用密文块 c(1),c(2)等,我们需要中间值 b1,b2 等。 + +``` + b1 = MD5(S + RA) c(1) = p1 xor b1 + b2 = MD5(S + c(1)) c(2) = p2 xor b2 + . . + . . + . . + bi = MD5(S + c(i-1)) c(i) = pi xor bi + + The String will contain c(1)+c(2)+...+c(i) where + denotes + concatenation. +``` + +上面其实是 google 翻译来的- -...把我理解的说一下 + +当密码位数小于 16 位的时候,先计算出**md5(密钥(secret_key)+Authenticator)**的 md5,然后再与我们接收到的**User-Password**进行位运算,遇到`\x0`结尾字符串结束 + +如果超过了 16 位而且还没有遇到`\x0`那么继续和我们的**User-Password**进行位运算,但是这回的用于位运算的 md5 为**md5(密钥(secret_key)+前 16 个字符)**,这里有个坑....文档说的是加密的过程,我们需要实现的是解密,所以前 16 个字符串不是我们解密后的 16 个字符,而是加密后的 16 个字符,=\_=害我拿原文(解密后的)一直在算,不对 + +实现代码: + +```php + public function decode_user_passwd($bin, $Authenticator) { + $passwd = ''; + $S = $this->secret_key; + $len = strlen($bin); + //b1 = MD5(S + RA) + $hash_b = md5($S . $Authenticator, true); + for ($offset = 0; $offset < $len; $offset += 16) { + //每次拿16字符进行解码 + for ($i = 0; $i < 16; $i++) { + $pi = ord($bin[$offset + $i]); + $bi = ord($hash_b[$i]); + //c(i) = pi xor bi + $chr = chr($pi ^ $bi); + if ($chr == "\x0") { + //文本标志\x0结尾 + return $passwd; + } + $passwd .= $chr; + } + //判断一下是不是已经结束了,然后返回 + if ($len == $offset + 16) { + return $passwd; + } + //bi = MD5(S + c(i-1)) + $hash_b = md5($S . substr($bin, $offset, 16), true); + } + //都循环完了,还没看见结束,返回空 + return ''; + } +``` + +### CHAP-Password + +> 从上面的代码来看`User-Password`是不安全的,只要知道了**secret_key**,密码明文完全可以解密出来,CHAP 密码原文是无法解密出来的 +> +> RADIUS 服务器根据用户名查找密码,使用 MD5 在 CHAP ID 八位位组,密码和 CHAP 质询(如果存在 CHAP-Challenge 属性,否则从请求身份验证器)加密质询,以及 将该结果与 CHAP 密码进行比较。 如果它们匹配,则服务器发回一个访问接受,否则它将发回一个访问拒绝。 +> +> 此属性指示由 PPP 挑战握手认证协议(CHAP)用户响应挑战而提供的响应值。 它仅用于 Access-Request 数据包。 +> +> 如果存在于数据包中,则在 CHAP-Challenge 属性(60)中找到 CHAP 质询值,否则在请求验证器字段中找到。 + +[https://tools.ietf.org/html/rfc2865#page-8](https://tools.ietf.org/html/rfc2865#page-8) + +[https://tools.ietf.org/html/rfc2865#page-28](https://tools.ietf.org/html/rfc2865#page-28) + +CHAP-Password 的结构是这样的,中间还有一个 CHAP Ident,后面 string 是一个 16 个字节的字符串,一听就觉得是 md5 + +``` + A summary of the CHAP-Password Attribute format is shown below. The + fields are transmitted from left to right. + + 0 1 2 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- + | Type | Length | CHAP Ident | String ... + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- +``` + +感觉 CHAP 比 PAP 好写多了,直接验证**md5(chapid+passwd+CHAP-Challenge(没有则用 Authenticator))**和 String 是否相等就好了 + +```php +//调用 +echo "isPass:" . ( + $this->verify_chap_passwd($attr['CHAP-Password'], + 'qwe123', + $attr['CHAP-Challenge'] ?? $struct['authenticator'] + ) ? 'true' : 'false'); + + public function verify_chap_passwd(string $bin, string $pwd, string $chap): bool { + if (strlen($bin) != 17) return false; + $chapid = $bin[0]; + $string = substr($bin, 1); + return md5($chapid . $pwd . $chap, true) == $string; + } +``` + +### 封包 + +> 处理完后,总还得人家一个回信吧 + +[https://tools.ietf.org/html/rfc2865#page-19](https://tools.ietf.org/html/rfc2865#page-19) + +都是一样的,只是吧解包变成封包一个逆向操作,值得注意的是**Authenticator**,在接收的时候这个是随机的,发送的时候,我们需要带进去计算**MD5(Code+ID+Length+RequestAuth+Attributes+Secret)** + +```php + /** + * 封包 + * @param int $code + * @param int $identifier + * @param string $reqAuthenticator + * @param array $attr + * @return string + */ + public function pack(int $code, int $identifier, string $reqAuthenticator, array $attr = []): string { + $attr_bin = ''; + foreach ($attr as $key => $value) { + $attr_bin .= $this->pack_attr($key, $value); + } + $len = 20 + strlen($attr_bin); + //MD5(Code+ID+Length+RequestAuth+Attributes+Secret) + $send = pack('ccna16', + $code, $identifier, $len, + md5(chr($code) . chr($identifier) . pack('n', $len) . + $reqAuthenticator . $attr_bin . $this->secret_key, true) + ) . $attr_bin; + //这里实际使用的时候有错误,因为NTR工具没有校验Response Authenticator...现在已经修改了 + return $send; + } + + /** + * 封包属性 + * @param $code + * @param string $data + * @return string + */ + public function pack_attr($code, string $data): string { + return pack('cc', $code, 2 + strlen($data)) . $data; + } +``` + +![](img/03-UDP-radius%E5%8D%8F%E8%AE%AE%E5%AE%9E%E7%8E%B0.assets/TIM%E6%88%AA%E5%9B%BE20180624194116-300x147.png) + +> 完整代码中的封包有错误,请看上面的注释,在代码中修改了 + +完成,完整代码: [start.php](./img/03-UDP-radius协议实现.assets/start.zip) diff --git a/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180619143040-300x207.png b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180619143040-300x207.png new file mode 100644 index 0000000..14e2dd1 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180619143040-300x207.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620085032-300x87.png b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620085032-300x87.png new file mode 100644 index 0000000..7291882 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620085032-300x87.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620095954-300x207.png b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620095954-300x207.png new file mode 100644 index 0000000..9fbfa15 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620095954-300x207.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620113804-300x207.png b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620113804-300x207.png new file mode 100644 index 0000000..bf84726 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620113804-300x207.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620114807-300x207.png b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620114807-300x207.png new file mode 100644 index 0000000..7fa31a9 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/01-swoole环境配置.assets/TIM截图20180620114807-300x207.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/1LE84QO9K@A1N9.jpg b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/1LE84QO9K@A1N9.jpg new file mode 100644 index 0000000..38c2fe1 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/1LE84QO9K@A1N9.jpg differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620131748-300x204.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620131748-300x204.png new file mode 100644 index 0000000..9fa0552 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620131748-300x204.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620132024-1-300x204.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620132024-1-300x204.png new file mode 100644 index 0000000..cccf970 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620132024-1-300x204.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620132024-2-300x204.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620132024-2-300x204.png new file mode 100644 index 0000000..f30c65d Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620132024-2-300x204.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620133255-300x204.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620133255-300x204.png new file mode 100644 index 0000000..591c8ab Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620133255-300x204.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620133409-300x96.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620133409-300x96.png new file mode 100644 index 0000000..47a87a7 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180620133409-300x96.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622124636-300x216.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622124636-300x216.png new file mode 100644 index 0000000..bb23eb1 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622124636-300x216.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622124713-300x227.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622124713-300x227.png new file mode 100644 index 0000000..d40cf05 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622124713-300x227.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622161650-300x203.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622161650-300x203.png new file mode 100644 index 0000000..51619f1 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622161650-300x203.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622161818-300x204.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622161818-300x204.png new file mode 100644 index 0000000..ca76699 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622161818-300x204.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162052-300x107.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162052-300x107.png new file mode 100644 index 0000000..e9e8828 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162052-300x107.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162146-300x246.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162146-300x246.png new file mode 100644 index 0000000..f8e44da Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162146-300x246.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162303-300x204.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162303-300x204.png new file mode 100644 index 0000000..b67d169 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162303-300x204.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162413-1-300x203.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162413-1-300x203.png new file mode 100644 index 0000000..42231d4 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162413-1-300x203.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162413-300x107.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162413-300x107.png new file mode 100644 index 0000000..e723740 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162413-300x107.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162622-300x108.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162622-300x108.png new file mode 100644 index 0000000..02d5ffe Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162622-300x108.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162829-300x254.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162829-300x254.png new file mode 100644 index 0000000..0ba74e4 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622162829-300x254.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622163913-300x219.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622163913-300x219.png new file mode 100644 index 0000000..e2b0a19 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622163913-300x219.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622164021-300x238.png b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622164021-300x238.png new file mode 100644 index 0000000..5b5cd0d Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/02-开发环境配置.assets/TIM截图20180622164021-300x238.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180622220548-300x188.png b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180622220548-300x188.png new file mode 100644 index 0000000..c2e4814 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180622220548-300x188.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180623221807-300x101.png b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180623221807-300x101.png new file mode 100644 index 0000000..f5f339b Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180623221807-300x101.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180624151246-300x156.png b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180624151246-300x156.png new file mode 100644 index 0000000..2c88bf6 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180624151246-300x156.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180624194116-300x147.png b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180624194116-300x147.png new file mode 100644 index 0000000..4fa74d1 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/TIM截图20180624194116-300x147.png differ diff --git a/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/start.zip b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/start.zip new file mode 100644 index 0000000..8890322 Binary files /dev/null and b/docs/note/学习笔记/swoole学习笔记/img/03-UDP-radius协议实现.assets/start.zip differ diff --git a/docs/note/工具资源/Windows10 WSL2.md b/docs/note/工具资源/Windows10 WSL2.md new file mode 100644 index 0000000..f387cb7 --- /dev/null +++ b/docs/note/工具资源/Windows10 WSL2.md @@ -0,0 +1,42 @@ +--- +title: Windows10%20WSL2 安装 尝鲜 +--- + +> 2019 年 6 月 13 日,windows 发布了 Build 18917 预览版,值得一提的是,Windows Subsystem for Linux 2(WSL2)也可以使用了,在将现在的系统升级到 18917 后(需要参与预览版计划),就迫不及待的想尝试了 + +![](img/Windows10%20WSL2.assets/a16ed8dbd137815b2577650ac5e8889a.png) + +## WSL2 安装开启 + +安装 wsl2 需要开启`Virtual Machine Platform` + +![](img/Windows10%20WSL2.assets/2fd49865293c12aaa0b550b0a35ec143.png) + +或者,管理员 PowerShell 运行: +`Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform` +然后 PowerShell 管理员运行: +`wsl --set-default-version 2` 设置默认为 wsl2 +`wsl --set-version Debian 2`设置某个发行版为 wsl2(竟然可以切换,不错) +(我用的是 CMD 管理员也是可以的,官方 blog 说的是 PowerShell) + +![](img/Windows10%20WSL2.assets/89cb491e39c43528434c324ad6f1f372.png) + +![](img/Windows10%20WSL2.assets/ecb0ec1c0e6b8ea8ba3b34a23d81f6f4.png) + +之后可以使用`wsl --list --verbose`查看使用的 wsl 版本 + +然后去 Microsoft Store 找 linux 就行了 + +![](img/Windows10%20WSL2.assets/f8209cd993dd3254af22c3cfa415859c.png) + +![](img/Windows10%20WSL2.assets/b54c5fa49baa561e0942c66730c1b577.png) + +成了,等下去试试装 docker,然后我就可以抛弃现在的 desktop for docker 了 233,看外表还看不出啥 + +![](img/Windows10%20WSL2.assets/f1c6ec7ad6baee042655bb366aface0e.png) + +### 网络 + +![](img/Windows10%20WSL2.assets/806f10f788a514951054f68f01af0254.png) + +我是这样做的,ifconfig 获取 ip diff --git a/docs/note/工具资源/WindowsTerminal+PowerShell优化.md b/docs/note/工具资源/WindowsTerminal+PowerShell优化.md new file mode 100644 index 0000000..7abcde9 --- /dev/null +++ b/docs/note/工具资源/WindowsTerminal+PowerShell优化.md @@ -0,0 +1,145 @@ +--- +title: Windows装杯且实用的终端配置 - WindowsTerminal+PowerShell优化 +--- + +> 作为一名开发人员,经常需要在终端输入一些命令和连接 ssh 啥的,之前一直是使用的 git bash,作为我的默认终端,和使用 xshell 来连接 ssh.在前几日配置,我配置 wsl2+oh-my-zsh 的时候无意间看见了一个 oh-my-posh 的项目,于是就想能不能将 Windows 的终端也像 Linux 配置得那么强大. +> 本篇文章也并不是非常专业的配置,更多的是作为一个分享.现在我已经几乎不再使用 xshell 和 git bash 了. + +## Windows Terminal + +> [Windows 终端](https://docs.microsoft.com/zh-cn/windows/terminal/)是一个面向命令行工具和 shell(如命令提示符、PowerShell 和适用于 Linux 的 Windows 子系统 (WSL))用户的新式终端应用程序。 它的主要功能包括多个选项卡、窗格、Unicode 和 UTF-8 字符支持、GPU 加速文本呈现引擎,你还可用它来创建你自己的主题并自定义文本、颜色、背景和快捷方式。(来自官网介绍) + +对于这款终端这里也不做更多的介绍了,安装这款终端很方便,已经发布在了 Microsoft Store,直接搜索安装就可以了. + +然后是做一些样式的配置,虽然我觉得默认的已经挺好了,这里推荐一个 Theme 的网站,可以选一款自己喜欢的,当然也可以自己配置属于自己的主题:[Andromeda](https://windowsterminalthemes.dev/?theme=3024%20Night) + +配置片段: + +```json + "profiles": { + "defaults": { + "name": "Andromeda", + "black": "#000000", + "red": "#cd3131", + "green": "#05bc79", + "yellow": "#e5e512", + "blue": "#2472c8", + "purple": "#bc3fbc", + "cyan": "#0fa8cd", + "white": "#e5e5e5", + "brightBlack": "#666666", + "brightRed": "#cd3131", + "brightGreen": "#05bc79", + "brightYellow": "#e5e512", + "brightBlue": "#2472c8", + "brightPurple": "#bc3fbc", + "brightCyan": "#0fa8cd", + "brightWhite": "#e5e5e5", + "background": "#262a33", + "foreground": "#e5e5e5" + }, +``` + +### 连接 SSH + +对于连接 SSH,我们可以直接在 Windows Terminal 里配置一列,就像下面这样: + +```json +{ + "guid": "{3a2e18e6-ee47-ff96-582b-adb64c63bf14}", + "hidden": false, + "name": "树莓派", + "commandline": "ssh root@192.168.1.1" +} +``` + +缺点是不能记住密码,解决方案是配置公私密钥,但是我的密码足够简单且是内网访问...就暂未操作- -...对于复杂的还是使用 xshell,有时间配置免密登录,完全抛弃 xshell. + +## 优化 PowerShell + +> 分两步,使用[oh-my-posh](https://github.com/JanDeDobbeleer/oh-my-posh)做美化,然后安装一些插件增强功能.虽然还是做不到 linux 下的 zsh 那么强大,插件好少,但是至少比原来的好多了,也足够我用. + +### 安装 oh-my-posh + +也没那么难,跟着官方文档来就完事了.记得使用管理员权限打开终端. + +![](img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_d11bd59f2568cb41a8e78c968121376b.jpg) + +速度感觉很慢....耐心等待 + +```bash +Set-ExecutionPolicy Unrestricted +Import-Module PowerShellGet + +Install-Module posh-git -Scope CurrentUser +Install-Module oh-my-posh -Scope CurrentUser +``` + +输入下面命令,编辑配置 + +```bash +if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force } +notepad $PROFILE +``` + +在弹出的编辑框里面输入下面的内容,主题可以挑一个你喜欢的:[themes](https://github.com/JanDeDobbeleer/oh-my-posh#themes),然后保存 + +```bash +Import-Module posh-git +Import-Module oh-my-posh +Set-Theme Paradox +``` + +再重新打开你的终端,就完成了,但是这时候还有一些乱码,我们需要安装字体去解决:[nerd-fonts](https://github.com/ryanoasis/nerd-fonts) + +![](img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_faf324c370cf870d437c9d5b7ca03761.jpg) + +我们去 release 页面下载这个字体,当然也可以自己选择,主要是终端使用到的一些图标字符 + +![](img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_aba5c48ea60c885a43ceeebdec7a8b47.jpg) + +下载完成之后,我随便找一个,实在太多了,不知道怎么选择,也可以根据[字体项目的文档](https://github.com/ryanoasis/nerd-fonts/blob/master/readme_cn.md),全部安装下来去挑,不过个人感觉看不出太多变化,我选择了下面这个进行安装:MesloLGS Nerd Font(Meslo LG S Regular Nerd Font Complete.ttf) + +![](img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_3ac624d1db855ba8320b7f907c32136a.jpg) + +然后编辑 WindowsTerminal,使用这个字体就可以了.另外多说一句,`Azure Cloud Shell`无法删除,可以将`hidden`设置为 true 隐藏. + +![](img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_c0f8af9bb7b08cb40737aff02930f26a.jpg) + +进入一些 git 目录就有下面这种效果啦 + +![](img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_8d9c78924bc90e86f92fb981679c2aca.jpg) + +### PSReadLine + +> PS 在此之前,每次写命令,都要一个一个的打出来,装了之后输入一部分内容就可以自动提示剩余的内容,按下方向右键就可以完成命令. + +管理员模式下输入下面的命令 + +```bash +Install-module PSReadline -Scope CurrentUser +``` + +然后输入下面命令,编辑配置 + +```bash +if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force } +notepad $PROFILE +``` + +添加下面内容: + +```bash +# PSReadLine +Import-Module PSReadLine +# Enable Prediction History +Set-PSReadLineOption -PredictionSource History +# Advanced Autocompletion for arrow keys +Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward +Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward +``` + +完成: + +![](img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_722ee058838b8f7139bff303f7f91c92.jpg) + diff --git a/docs/note/工具资源/chrome-vimium.md b/docs/note/工具资源/chrome-vimium.md new file mode 100644 index 0000000..668f712 --- /dev/null +++ b/docs/note/工具资源/chrome-vimium.md @@ -0,0 +1,44 @@ +--- +title: 从根本上解决鼠标手,chrome 插件"Vimium"分享 +--- + +> 安利一个 chrome 插件,`Vimium`,全键盘上网(不用鼠标就不会出现鼠标手了啦\~),再想象一下电影里面啪啪啪啪那种敲键盘的感觉,so cool?~ + +Chrome 商店安装地址: https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb + +github 开源地址: https://github.com/philc/vimium + +## 常用命令 + +> 命令其实挺多的,我先写出我比较常用的一些命令,也能够覆盖到大部分使用场景了(全部一下子也记不住,记住了也没办法熟练的使用) + +- 页面滚动命令: h(左)j(下)k(上)l(右) +- 页面滚动命令 2: gg(滚动到最顶部) shift+g(其实就是大写的`G`,shift 大小写转换而已) u(相当于 PgUp,向上滚动) d(向下滚动).这个命令挺好用的 +- 左右切换 tab: Shift+j/J(左边 tab) shift+k/K(右边 tab) +- tab 切换命令 2: shift+t/T,会弹出一个框可以选择 tab 进行跳转 +- 前进/后退:shift+h/H(后退) shift+l/L(前进) +- 关闭/恢复页面: x(关闭当前页面) shift+x(恢复上一个关闭的页面) +- 打开新页面命令: o(当前页面打开) shift+o/O(新页面打开) b(当前页面) shift+b/B(新页面打开),o 是会在历史记录/书签栏/关键字搜索,b 是在书签栏中搜索.这个命令我也很喜欢,直接的替换了我原来的一个书签管理工具,因为记录得实在是太多了...自己都找不到. +- 点击链接: f(当前页面),shift+f/F(新页面打开).按下后会有很多链接的指示,按照指示输入字母就可以点击链接了. +- tab 切换命令 2: g0(切换到第一个 tab) g$(shift+4)(切换到最后一个 tab) ^(shift+6)(切换到上一个打开的 tab) + +## 进阶命令 + +> 还有一些命令,如果能熟练就更好了,虽然我自己也用得很少,因为有浏览器自己的快捷键(ctrl+cv,复制粘贴),或者我觉得没有鼠标习惯/方便,我也不是很熟练,还是习惯的去动鼠标- -... + +插件和 vim 一样,有很多模式,按 esc 退出当前模式,在右下角会有提示 + +- v 进入视图模式,输入之后会发现有一个地方被选中,这时按 hjkl 可以进行移动操作 +- y 复制选中的文本 +- gi 选中输入框,进行输入,按 tab 可以进行切换 +- ma 可以给当前位置做一个标记 +- \`a 可以快速翻到标记位置(小写是当前页面的标记,大写是全浏览器的标记),一个超级方便的指令! +- yy 复制当前页面的链接,也是一个很方便的指令 + +## 其它命令 + +> 如果你记住了以上命令,已经可以完全的摆脱鼠标了(但是有些地方的操作我觉得鼠标更方便一点,或许是我已经习惯鼠标了吧),剩下的就是去熟练的使用了 + +- ? 打开帮助(但是好像有些命令没有写),万一忘记了,可以看看命令记一下,也会比我这里的更全,还有 wiki:https://github.com/philc/vimium/wiki +- / 进入搜索模式(感觉鸡肋...我喜欢 ctrl+f) +- n/N 进入搜索模式后查找下/上一个 diff --git a/docs/note/工具资源/img/809d7db3ac159d37b1ca4c9f69c61808.png b/docs/note/工具资源/img/809d7db3ac159d37b1ca4c9f69c61808.png new file mode 100644 index 0000000..db5b8a0 Binary files /dev/null and b/docs/note/工具资源/img/809d7db3ac159d37b1ca4c9f69c61808.png differ diff --git a/docs/note/工具资源/img/95c8c1c596bf5a22c26096a7fed4e1db.png b/docs/note/工具资源/img/95c8c1c596bf5a22c26096a7fed4e1db.png new file mode 100644 index 0000000..b340d75 Binary files /dev/null and b/docs/note/工具资源/img/95c8c1c596bf5a22c26096a7fed4e1db.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/2fd49865293c12aaa0b550b0a35ec143.png b/docs/note/工具资源/img/Windows10 WSL2.assets/2fd49865293c12aaa0b550b0a35ec143.png new file mode 100644 index 0000000..1777e67 Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/2fd49865293c12aaa0b550b0a35ec143.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/806f10f788a514951054f68f01af0254.png b/docs/note/工具资源/img/Windows10 WSL2.assets/806f10f788a514951054f68f01af0254.png new file mode 100644 index 0000000..c830241 Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/806f10f788a514951054f68f01af0254.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/89cb491e39c43528434c324ad6f1f372.png b/docs/note/工具资源/img/Windows10 WSL2.assets/89cb491e39c43528434c324ad6f1f372.png new file mode 100644 index 0000000..984c7c0 Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/89cb491e39c43528434c324ad6f1f372.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/a16ed8dbd137815b2577650ac5e8889a.png b/docs/note/工具资源/img/Windows10 WSL2.assets/a16ed8dbd137815b2577650ac5e8889a.png new file mode 100644 index 0000000..ea9ce86 Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/a16ed8dbd137815b2577650ac5e8889a.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/b54c5fa49baa561e0942c66730c1b577.png b/docs/note/工具资源/img/Windows10 WSL2.assets/b54c5fa49baa561e0942c66730c1b577.png new file mode 100644 index 0000000..668a51b Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/b54c5fa49baa561e0942c66730c1b577.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/ecb0ec1c0e6b8ea8ba3b34a23d81f6f4.png b/docs/note/工具资源/img/Windows10 WSL2.assets/ecb0ec1c0e6b8ea8ba3b34a23d81f6f4.png new file mode 100644 index 0000000..5d8625d Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/ecb0ec1c0e6b8ea8ba3b34a23d81f6f4.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/f1c6ec7ad6baee042655bb366aface0e.png b/docs/note/工具资源/img/Windows10 WSL2.assets/f1c6ec7ad6baee042655bb366aface0e.png new file mode 100644 index 0000000..4f99a9d Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/f1c6ec7ad6baee042655bb366aface0e.png differ diff --git a/docs/note/工具资源/img/Windows10 WSL2.assets/f8209cd993dd3254af22c3cfa415859c.png b/docs/note/工具资源/img/Windows10 WSL2.assets/f8209cd993dd3254af22c3cfa415859c.png new file mode 100644 index 0000000..f8149dd Binary files /dev/null and b/docs/note/工具资源/img/Windows10 WSL2.assets/f8209cd993dd3254af22c3cfa415859c.png differ diff --git a/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_3ac624d1db855ba8320b7f907c32136a.jpg b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_3ac624d1db855ba8320b7f907c32136a.jpg new file mode 100644 index 0000000..442d619 Binary files /dev/null and b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_3ac624d1db855ba8320b7f907c32136a.jpg differ diff --git a/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_722ee058838b8f7139bff303f7f91c92.jpg b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_722ee058838b8f7139bff303f7f91c92.jpg new file mode 100644 index 0000000..c6bc774 Binary files /dev/null and b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_722ee058838b8f7139bff303f7f91c92.jpg differ diff --git a/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_8d9c78924bc90e86f92fb981679c2aca.jpg b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_8d9c78924bc90e86f92fb981679c2aca.jpg new file mode 100644 index 0000000..4002aa2 Binary files /dev/null and b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_8d9c78924bc90e86f92fb981679c2aca.jpg differ diff --git a/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_aba5c48ea60c885a43ceeebdec7a8b47.jpg b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_aba5c48ea60c885a43ceeebdec7a8b47.jpg new file mode 100644 index 0000000..760301e Binary files /dev/null and b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_aba5c48ea60c885a43ceeebdec7a8b47.jpg differ diff --git a/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_c0f8af9bb7b08cb40737aff02930f26a.jpg b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_c0f8af9bb7b08cb40737aff02930f26a.jpg new file mode 100644 index 0000000..c646fa2 Binary files /dev/null and b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_c0f8af9bb7b08cb40737aff02930f26a.jpg differ diff --git a/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_d11bd59f2568cb41a8e78c968121376b.jpg b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_d11bd59f2568cb41a8e78c968121376b.jpg new file mode 100644 index 0000000..1c9008d Binary files /dev/null and b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_d11bd59f2568cb41a8e78c968121376b.jpg differ diff --git a/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_faf324c370cf870d437c9d5b7ca03761.jpg b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_faf324c370cf870d437c9d5b7ca03761.jpg new file mode 100644 index 0000000..48b610c Binary files /dev/null and b/docs/note/工具资源/img/WindowsTerminal+PowerShell优化.assets/wp_editor_md_faf324c370cf870d437c9d5b7ca03761.jpg differ diff --git a/docs/note/工具资源/img/tWrqlGeKcOEJe0D.png b/docs/note/工具资源/img/tWrqlGeKcOEJe0D.png new file mode 100644 index 0000000..76a1122 Binary files /dev/null and b/docs/note/工具资源/img/tWrqlGeKcOEJe0D.png differ diff --git a/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708222459-300x152.png b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708222459-300x152.png new file mode 100644 index 0000000..dcdc2f2 Binary files /dev/null and b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708222459-300x152.png differ diff --git a/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708224929-300x224.png b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708224929-300x224.png new file mode 100644 index 0000000..b9d5dfc Binary files /dev/null and b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708224929-300x224.png differ diff --git a/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708233438-300x169.png b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708233438-300x169.png new file mode 100644 index 0000000..a237da9 Binary files /dev/null and b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708233438-300x169.png differ diff --git a/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708233654-300x46.png b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708233654-300x46.png new file mode 100644 index 0000000..9461874 Binary files /dev/null and b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708233654-300x46.png differ diff --git a/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708234052-300x95.png b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708234052-300x95.png new file mode 100644 index 0000000..1ac6e62 Binary files /dev/null and b/docs/note/工具资源/img/一次树莓派系统安装记录.assets/TIM截图20180708234052-300x95.png differ diff --git a/docs/note/工具资源/vscode web版本搭建.md b/docs/note/工具资源/vscode web版本搭建.md new file mode 100644 index 0000000..0790262 --- /dev/null +++ b/docs/note/工具资源/vscode web版本搭建.md @@ -0,0 +1,79 @@ +--- +title: vscode web版本搭建 +--- + +> 今天拿 ipad 看书的时候,想到之前看到的一个文章说可以在浏览器上使用 vscode,而且看书的时候,牵扯到一些函数的参数和具体描述无法知道(难查文档),就想能不能整一个这样的环境,一边看书也可以一边去**浅度**的了解里面使用的方法,也可以写代码进行调试. + +## 准备 + +一台服务器,我在 [https://www.vultr.com/?ref=7107762](https://www.vultr.com/?ref=7107762) 购买了一台服务器,准备作为环境。(感觉国外的好一点,对于拉包速度之类) + +链接服务器的工具,我这里使用的 putty,服务器系统是 centos7 + +## 安装环境 + +> 官方说得好模糊....踩了好多坑,也许是我系统太干净的原因? + +[https://github.com/microsoft/vscode/wiki/How-to-Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute) + +```bash +# 装好git curl 之类的必须品 +yum install git curl gcc gcc-c++ libX11-devel.x86_64 libxkbfile-devel.x86_64 libsecret-devel sqlite-devel zlib-devel bzip2-devel +# 安装nodejs和yarn +curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo +curl --silent --location https://rpm.nodesource.com/setup_10.x | bash - +sudo yum install -y nodejs +sudo yum install -y yarn +# 安装python27 +wget https://www.python.org/ftp/python/2.7.17/Python-2.7.17.tgz +tar -zxvf Python-2.7.17.tgz +cd Python-2.7.17 +./configure +make && make install +# 克隆vscode仓库 +cd .. +git clone https://github.com/microsoft/vscode.git +cd vscode +firewall-cmd --zone=public --add-port=8080/tcp --permanent +systemctl restart firewalld +npm install -g node-gyp +# 按照官方的来的,但是好像有问题?有一些地址是localhost,而且文件打不开,可以看下面的方法 +git checkout 1.40.1 +yarn +yarn watch +yarn web +``` + +然后我就开始使用另外一个项目,命令和上面的一样,除了上面四行 https://github.com/cdr/code-server ,注意上方`git checkout v1.40.1` 要换成其它版本,如:`git checkout v1.39.2` 见:https://github.com/cdr/code-server/issues/1170 (可能以后会支持吧) + +```bash +git checkout 1.39.2 +yarn +git clone https://github.com/cdr/code-server src/vs/server +cd src/vs/server +yarn +yarn patch:apply +echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p +yarn watch +yarn start +``` + +(中间因为服务器太辣鸡了...build 内存不够,然后分配了 4g 虚拟内存解决了...过程中非常卡,服务器都连不上) + +完成之后访问 http://ip:8080 就可以用了,`code-server`会要你输入密码,yarn start 会获得 + +![](./img/809d7db3ac159d37b1ca4c9f69c61808.png) + +![](./img/95c8c1c596bf5a22c26096a7fed4e1db.png) + +感觉要台网络好的服务器比较好....(我然后装了 bbr 感觉好多了) + +可以安装扩展,但是好像装一次扩展然后要重新加载(然后又等很久) + +想像体验: +![](./img/tWrqlGeKcOEJe0D.png) + +实际体验: +我枯了,bug 比较多,Terminal 跑不起来,代码也不能运行,单单的平板操作很不好(是我需要外接键鼠么?).我觉得还不如用 duet 来分屏. + +不过还是很期待以后的版本的. diff --git a/docs/note/工具资源/一次树莓派系统安装记录.md b/docs/note/工具资源/一次树莓派系统安装记录.md new file mode 100644 index 0000000..ab3f047 --- /dev/null +++ b/docs/note/工具资源/一次树莓派系统安装记录.md @@ -0,0 +1,79 @@ +--- +title: 一次树莓派系统安装记录 +--- + +> 暑假了,给树莓派重新弄一次系统,这回是 pi3b+,上次写 swoole 用的是 pizero,这回给 pi3 重新刷一个,然后再安装 swoole + +## 准备 + +- 网线 \* 1 +- micro usb \* 1 +- pi3b+ \* 1 +- 读卡器 \* 1 +- micro sd 卡 \* 1 + +## 镜像制作 + +从官网下载镜像 [https://www.raspberrypi.org/downloads/](https://www.raspberrypi.org/downloads/) + +有挺多的,我选择的是这个 [https://www.raspberrypi.org/downloads/raspbian/](https://www.raspberrypi.org/downloads/raspbian/) + +![](img/%E4%B8%80%E6%AC%A1%E6%A0%91%E8%8E%93%E6%B4%BE%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95.assets/TIM%E6%88%AA%E5%9B%BE20180708224929-300x224.png) + +带桌面和一些程序 + +下载好镜像之后,还需要一个制作工具:win32diskimager,百度下载吧- -推荐绿色版,这些小东西我是不喜欢安装 + +然后打开,选好我们的镜像和读卡器插入的那个盘符就好了 + +![](img/%E4%B8%80%E6%AC%A1%E6%A0%91%E8%8E%93%E6%B4%BE%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95.assets/TIM%E6%88%AA%E5%9B%BE20180708222459-300x152.png) + +我们前面下载的是一个 zip 文件,我们解压它,然后就得到了一个 img 文件,用这个工具写入 突然 1 个多 g 就变成了 4 个多 g + +## 配置 + +### 开启 ssh + +我们又没显示屏...(如果你有转化的话可以直接插键盘鼠标操作....)没 ssh 干不了活啊,在前面镜像制作完毕后,我们会多一个 **boot:盘符** 的磁盘(我做了几次都没有出现,后来重启一下电脑就好了...) + +![](img/%E4%B8%80%E6%AC%A1%E6%A0%91%E8%8E%93%E6%B4%BE%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95.assets/TIM%E6%88%AA%E5%9B%BE20180708233438-300x169.png) + +然后在里面新建一个 ssh 的文件,插上网线,电源,sd 卡,如果红灯绿灯都亮了就代表成功了 + +在路由里面找到了我们的 pi 的 ip(最好分配一个 ip),然后连上 ssh,还有什么好怕的? + +![](img/%E4%B8%80%E6%AC%A1%E6%A0%91%E8%8E%93%E6%B4%BE%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95.assets/TIM%E6%88%AA%E5%9B%BE20180708233654-300x46.png) + +![](img/%E4%B8%80%E6%AC%A1%E6%A0%91%E8%8E%93%E6%B4%BE%E7%B3%BB%E7%BB%9F%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95.assets/TIM%E6%88%AA%E5%9B%BE20180708234052-300x95.png) + +这里连接的账号和密码是默认的: +账号:`pi` 密码:`piraspberry` + +### 初始化配置 + +要进行一些密码的修改 +ssh 中输入,进入一个面板 + +``` +sudo raspi-config +``` + +#### 配置密码 + +选中`change user password`,然后会提示你输入新的密码 + +#### 开启 VNC + +选中`Interfacing Options`选中`VNC`开启 + +#### 更改 root 密码和解锁 root + +退回到之前的 ssh 界面,输入 + +``` +sudo passwd root + +sudo passwd --unlock root +``` + +到这里就完成了,之后可以直接用 vnc viewer 连接操作 diff --git a/docs/ops/README.md b/docs/ops/README.md new file mode 100644 index 0000000..52bfae3 --- /dev/null +++ b/docs/ops/README.md @@ -0,0 +1,6 @@ +--- +title: 运维 +sidebar_position: 0 +--- + +这里是服务器运维相关的内容,包括CI/CD、监控、容器化、云原生等等。 diff --git a/docs/ops/_category_.json b/docs/ops/_category_.json new file mode 100644 index 0000000..3a7971a --- /dev/null +++ b/docs/ops/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "OPS", + "position": 4 +} diff --git a/docs/ops/ci&cd/README.md b/docs/ops/ci&cd/README.md new file mode 100644 index 0000000..58552aa --- /dev/null +++ b/docs/ops/ci&cd/README.md @@ -0,0 +1,5 @@ +--- +id: ci-cd +title: CI/CD +--- + diff --git a/docs/ops/ci&cd/github-actions-入门.md b/docs/ops/ci&cd/github-actions-入门.md new file mode 100644 index 0000000..7ba194f --- /dev/null +++ b/docs/ops/ci&cd/github-actions-入门.md @@ -0,0 +1,131 @@ +--- +title: github actions 入门 We love open source +--- + +> github 推出了 ci/cd 服务 [https://github.com/features/actions](https://github.com/features/actions) 不过还在内测中,我申请了一下得到了内测资格 + +![](img/github-actions-入门.assets/47aa11c30a1b3c418ba1bb6f2fd16bb4.png) + +## 介绍 + +github actions 是 github 推出的一款持续集成服务,这里记录下一些概念和基础的使用方法(gitlab 有 gitlab runner,现在 github 终于是推出了自己的 ci/cd 服务) + +和 gitlab runner 等其它 ci/cd 工具最大的区别在于,允许引用其它仓库的脚本,并且拥有一个[actions 市场](https://github.com/marketplace?type=actions),这样可以避免很多重复的工作,需要的可以直接引用(才知道 github 有一个这样的市场功能.) + +觉得这个和了 Docker hub 的思路是差不多的,可以引用不同的 docker 镜像.gitlab runner 中也可以使用 docker 来实现运行在不同的 ci/cd 运行环境 + +## 概念 + +先放出一个 workflow 文件的栗子: + +```yaml +name: Greet Everyone +# This workflow is triggered on pushes to the repository. +on: [push] + +jobs: + build: + # Job name is Greeting + name: Greeting + # This job runs on Linux + runs-on: ubuntu-latest + steps: + # This step uses GitHub's hello-world-javascript-action: https://github.com/actions/hello-world-javascript-action + - name: Hello world + uses: actions/hello-world-javascript-action@v1 + with: + who-to-greet: "Mona the Octocat" + id: hello + # This step prints an output (time) from the previous step's action. + - name: Echo the greeting's time + run: echo 'The time was ${{ steps.hello.outputs.time }}.' +``` + +### workflow + +Workflow 定义一个完整的包括测试,打包,发布,部署等流程.存放再`.github/workflow`目录下,使用 yaml 语法,一个 yaml 或者 yml 文件表示一个 workflow.(就是上面的栗子) + +我在使用的时候觉得一个 workflow 文件完全可以满足我的所有需求,但是后来看例子,触发事件是写在最顶级的路径上,所以可能会牵扯到不同的事件运行不同的任务(job),然后写多个 workflow 文件 + +### job + +一个 job 就是实际运行的任务,定义一个 测试/部署/发布 任务,多个 job 合起来就是一个完整的工作流. + +### setps + +任务所需要执行的步骤,就像一个测试的任务会包括,编译->代码分析->测试->覆盖率->提交结果 + +### action + +一个 action 可以包括多条命令,也可以引用其它仓库的 action.还可以引用 docker 镜像:`uses: docker://alpine:3.8`,这样就更加的灵活了 + +## 命令 + +> [https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions](https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions) + +再来了解一下会常使用到的一些基础命令,就拿上面的?来说 + +#### name + +描述工作流 + +#### on + +触发的事件,还可以选择定时触发,指定分支 tag 等... + +```yaml +on: + schedule: + - cron: '0 * * * *' + +on: + push: + branches: + - master + tags: + - v1 + # file paths to consider in the event. Optional; defaults to all. + paths: + - 'test/*' +``` + +#### jobs.[id].name + +job 名字 + +#### jobs.[id].runs-on + +运行环境,linux,macos,windows 都有,具体可以看:[`jobs..runs-on`](https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#jobsjob_idruns-on) + +#### jobs.[id].steps.[]name + +步骤名字 + +#### jobs.[id].steps.[]needs + +job 的依赖,可以确定 job 的运行顺序 + +```yaml +needs: [job1, job2] +``` + +#### jobs.[id].steps.[]uses + +去引用一个 action/docker 等 + +#### jobs.[id].setps.[]with + +输入的参数,会传入 action 中 + +#### jobs.[id].setps.[]id + +步骤的 id,可以通过 id 再引用到这个步骤 + +#### jobs.[id].setps.[]run + +执行的命令 + +## 最后 + +测试项目:[https://github.com/CodFrm/StudyGit/actions](https://github.com/CodFrm/StudyGit/actions) +这里我写了一个例子上去,后面我会使用 actions 作为我公众号的一个自动部署的工具,后面再补上实际的使用? diff --git a/docs/ops/ci&cd/img/github-actions-入门.assets/47aa11c30a1b3c418ba1bb6f2fd16bb4.png b/docs/ops/ci&cd/img/github-actions-入门.assets/47aa11c30a1b3c418ba1bb6f2fd16bb4.png new file mode 100644 index 0000000..38bd1c8 Binary files /dev/null and b/docs/ops/ci&cd/img/github-actions-入门.assets/47aa11c30a1b3c418ba1bb6f2fd16bb4.png differ diff --git a/docs/ops/k8s&docker/Dockerfile和docker-compose.md b/docs/ops/k8s&docker/Dockerfile和docker-compose.md new file mode 100644 index 0000000..98d1390 --- /dev/null +++ b/docs/ops/k8s&docker/Dockerfile和docker-compose.md @@ -0,0 +1,123 @@ +--- +title: Dockerfile和docker-compose +--- + +## Dockerfile + +> 使用 Dockerfile 构建自己的镜像,这里记录一些常用的命令,这里拿我尝试做的一个 nginx 镜像来记录 +> [https://github.com/huanl-php/docker-nginx/blob/master/Dockerfile](https://github.com/huanl-php/docker-nginx/blob/master/Dockerfile) + +### FROM alpine:latest + +选择基础的镜像,这里的话我用的是 alpine,后面的 latest 表示最新的版本,alpine 是一个非常小的 linux 发行版,如果你对镜像大小很敏感的话推荐使用这个镜像作为基础镜像 + +### LABEL + +这一行表示这个 Dockerfile 的作者 + +### ENV + +环境变量,当你没配置的时候将使用这些作为默认值 + +### EXPOSE + +声明要暴露的端口,但是并不会直接帮你暴露出去,至少告诉 docker 你会暴露那些 + +### RUN + +运行命令,这里用了&和\表示连接命令和换行 + +### COPY + +COPY 顾名思义的复制文件 从本地复制到容器里面去 + +### CMD + +当你容器启动的时候,将运行的命令,除此之外还有**ENTRYPOINT** + +暂时就先记录这些,以后用到了再继续记录 + +### 另外提一下 + +使用 alpine 这个的时候有下面这个方法,安装包,卸载包,但是当时我构建我的 nginx 项目的时候 del 之后提示一些包不存在,时间久远我也不记得当时的操作了 + +```shell +apk add --no-cache --virtual .build-deps gcc +apk del .build-deps +``` + +然后我尝试了这种方法,只删除构建时需要的包,之后我发现我的镜像更小了= =不知道这样做会有什么不好。。。。 + +```shell +apk add --no-cache gcc +apk del gcc +``` + +## docker-compose.xml + +> compose 用于容器快速部署,我这里用我的云签到的项目来 +> [https://github.com/CodFrm/cas/blob/master/docker-compose.yml](https://github.com/CodFrm/cas/blob/master/docker-compose.yml) > [文档](https://docs.docker.com/compose/compose-file/) + +### version + +要求版本,不多说了 + +### services + +容器服务 + +### db 和 web + +都只是一个名字而已 + +### image + +容器的镜像名字 + +### environment + +环境变量 + +### networks + +所属网络环境 + +### ports + +暴露端口 外部端口:容器内部端口 + +### depends_on + +依赖,会先构建所依赖的容器 + +### 根部的 networks + +声明网络,没有将会创建 + +### cas_network + +网络的名字 + +### driver + +网络驱动类型,我这里是 bridge 桥接 + +## 最近用到的 + +### build + +build Dockerfile 路径,直接通过 dockerfile 来构建了,不用 image + +### volumes + +和本地路径绑定 本地路径:容器内部路径 + +### external_links + +将外部容器加入网络 链接的容器名字:本容器内叫的名字 + +### external + +networks 下的一个配置项,允许外部访问 external:true + +先记录到这里,解释是自己的简单理解\>\_\< diff --git a/docs/ops/k8s&docker/README.md b/docs/ops/k8s&docker/README.md new file mode 100644 index 0000000..cd7bb15 --- /dev/null +++ b/docs/ops/k8s&docker/README.md @@ -0,0 +1,5 @@ +--- +id: k8s-docker +title: Kubernetes & Docker +--- + diff --git a/docs/ops/k8s&docker/_category_.json b/docs/ops/k8s&docker/_category_.json new file mode 100644 index 0000000..4fb8ae5 --- /dev/null +++ b/docs/ops/k8s&docker/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "K8s & Docker", + "position": 1 +} diff --git a/docs/ops/k8s&docker/docker容器初窥.md b/docs/ops/k8s&docker/docker容器初窥.md new file mode 100644 index 0000000..1eeda13 --- /dev/null +++ b/docs/ops/k8s&docker/docker容器初窥.md @@ -0,0 +1,139 @@ +--- +title: docker容器初窥 +--- + +> 了解一下,了解一下- -! +> [官网](https://www.docker.com/) [英文文档](https://docs.docker.com/install/overview/) [中文文档](https://yeasy.gitbooks.io/docker_practice/) + +## 安装 + +> 我吧我原来那台腾讯云 windows 的服务器换成了 centos 来尝试 +> [参考教程](https://yeasy.gitbooks.io/docker_practice/install/centos.html) + +```shell +# 安装docker-ce +## 依赖 +sudo yum install -y yum-utils device-mapper-persistent-data lvm2 +## 切换国内源 +sudo yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo +## 安装 +sudo yum makecache fast +sudo yum install docker-ce -y +## 开机启动和开启docker +sudo systemctl enable docker +sudo systemctl start docker +``` + +执行完上面的步骤安装就算完成了,执行一次`docker run hello-world`没有提示错误就是成功了 + +## 镜像 + +> 这获取镜像感觉和 git 的命令有些相似,我先注册了一个账号,以后再看怎么使用 +> [镜像仓库](https://hub.docker.com/explore/) + +### pull + +使用 pull 获取镜像,我们可以在镜像仓库中找一个我们喜欢的镜像,然后拉去下来,之后运行 + +```shell +# 命令格式 +docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] +# 这里我弄一个redis +docker pull redis +``` + +### 开启一个 redis 服务器 + +--name 是为这个容器命名,不然之后我们就只能用 UUID 来找了 +-d 是以守护态运行,也就是后台运行,不然会直接的打印到我们终端上 +我们可以用 +docker logs test-redis 看运行日志 +docker container ls 查看容器信息 +docker attach test-redis 重新进入容器 +docker container rm test-redis 删除容器 + +```shell +docker run --name test-redis -d redis +``` + +### 使用 cli 连接 redis + +使用下面这个命令创建一个 redis 的容器 运行 redis-cli 这个命令 +-i 使用交互式的操作 +-t 打开一个终端 +--rm 退出之后就删除这个容器 +后面的-h 和-p 是主机(redis 就是主机名)和端口 + +```shell +docker run -it --rm redis redis-cli -h test-redis -p 6379 +``` + +不过上面这个命令是不足够的 - -。。。运行之后并没有链接上我们之前创建的 redis 服务器,还需要加上一个 --link 的参数,使两个容器建立链接,然后我们就可以使用 redis 客户端了 + +```shell +docker run -it --link test-redis:redis --rm redis redis-cli -h test-redis +``` + +### 外部使用容器 + +我先给我的服务器装一个 redis-cli,等会儿好测试 + +```shell +yum install redis -y +``` + +在容器没有创建前,我们可以用`-p`来映射端口 + +```shell +# -P 随机分配一个49000~49900的端口 +# 可以用docker container ls来查看 +# -p可以指定分配,例如: +# -p 6379:6379 (映射所有地址到6379) -p 127.0.0.1:6300:6379 (映射到127.0.0.1上的6300端口) +# -p 127.0.0.1::6379(映射所有端口到ip上) -p 1813:1813/udp(指定udp端口) +# 之后可以使用docker port test-redis 查看映射情况 +docker run --name test-redis -d -P redis +``` + +容器创建完成之后,我们可以用 iptables 来操作,不过这是很不好的,只是提一下可以使用这个方法 + +```shell +# 获取ip地址,我们也可以直接的用这个ip来连接 +docker inspect test-redis | grep IPAddress +# iptables映射端口 +iptables -t nat -A DOCKER -p tcp --dport 6379 -j DNAT --to-destination 172.17.0.2:6379 +``` + +推荐下面这个方法: +使用 commit 创建镜像,然后重新运行 + +```shell +# 创建了个my-redis的镜像 +docker commit test-redis my-redis +# 我吧原来的停止删除,重新创建,这回用-p参数 +docker stop test-redis +docker container rm test-redis +docker run --name test-redis -d -p 6379:6379 redis +``` + +完成,之后我们可以使用`redis-cli`直接访问了 + +```shell +[root@VM_92_235_centos ~]# redis-cli +127.0.0.1:6379> set haha qwe123 +OK +127.0.0.1:6379> get haha +"qwe123" +127.0.0.1:6379> exit +[root@VM_92_235_centos ~]# docker run -it --link test-redis:redis --rm redis redis-cli -h test-redis +test-redis:6379> get haha +"qwe123" +test-redis:6379> exit +``` + +上面是我玩的,感觉还不错吧 + +## End + +越用到后面越觉得容器的强大,最开始我想感觉有些占空间,又没什么用,用不到,所以用的云服务器学习,现在我想在我的电脑上装一个玩了。 + +还有很多内容,这一篇文章只是记录一些基本的操作,还有一个**Dockerfile**和 Makefile 类似,可以用来定制我们需要的镜像,这也是一个很重要的内容,后面再继续研究。 diff --git a/docusaurus.config.ts b/docusaurus.config.ts new file mode 100644 index 0000000..4222a56 --- /dev/null +++ b/docusaurus.config.ts @@ -0,0 +1,132 @@ +import { themes as prismThemes } from "prism-react-renderer"; +import type { Config } from "@docusaurus/types"; +import type * as Preset from "@docusaurus/preset-classic"; +import docsToBlog from "./packages/docusaurus-plugin-docs-info/src"; + +const config: Config = { + title: "王一之", + tagline: "王一之的个人博客:分享知识,记录生活,认识朋友", + favicon: "img/favicon.ico", + + // Set the production url of your site here + url: "https://blog.icodef.com", + // Set the // pathname under which your site is served + // For GitHub pages deployment, it is often '//' + baseUrl: "/", + + // GitHub pages deployment config. + // If you aren't using GitHub pages, you don't need these. + organizationName: "codfrm", // Usually your GitHub org/user name. + projectName: "blog", // Usually your repo name. + + onBrokenLinks: "warn", + onBrokenMarkdownLinks: "warn", + + plugins: [ + ["@gracefullight/docusaurus-plugin-tailwind", {}], + ["docusaurus-plugin-docs-info", {}], + ], + + // Even if you don't use internationalization, you can use this field to set + // useful metadata like html lang. For example, if your site is Chinese, you + // may want to replace "en" with "zh-Hans". + i18n: { + defaultLocale: "zh-CN", + locales: ["zh-CN"], + }, + + presets: [ + [ + "classic", + { + docs: { + routeBasePath: "/", + sidebarPath: "./sidebars.ts", + // Please change this to your repo. + // Remove this to remove the "edit this page" links. + editUrl: "https://github.com/codfrm/blog", + showLastUpdateTime: true, + }, + theme: { + customCss: "./src/css/custom.css", + }, + sitemap: { + // @ts-ignore + changefreq: "weekly", + priority: 0.5, + ignorePatterns: ["/tags/**"], + filename: "sitemap.xml", + }, + } satisfies Preset.Options, + ], + ], + + themeConfig: { + // Replace with your project's social card + image: "img/docusaurus-social-card.jpg", + navbar: { + title: "王一之的博客", + logo: { + alt: "Logo", + src: "img/avatar.png", + }, + items: [ + { + position: "right", + label: "主页", + href: "/", + }, + { + position: "right", + label: "全部", + href: "/blog", + }, + { + position: "right", + label: "Dev", + to: "/dev", + // items: [ + // { + // to: "/dev/golang", + // label: "Golang", + // }, + // ], + }, + { + type: "docSidebar", + sidebarId: "ops", + position: "right", + label: "Ops", + to: "/ops", + }, + { + type: "docSidebar", + sidebarId: "note", + position: "right", + label: "笔记", + to: "/note", + }, + { + href: "https://github.com/codfrm/blog", + label: "GitHub", + position: "right", + }, + ], + hideOnScroll: true, + }, + footer: { + style: "dark", + copyright: `

Copyright © ${new Date().getFullYear()} icodef.com, Built with Docusaurus.

+

湘ICP备19008073号

+

若无特殊声明,本站所有内容遵循 CC BY-NC-SA 4.0 协议

`, + }, + prism: { + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + // https://prismjs.com/download.html + additionalLanguages: ["php", "bash", "docker"], + }, + } satisfies Preset.ThemeConfig, +}; + +export default config; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5af52be --- /dev/null +++ b/package-lock.json @@ -0,0 +1,16911 @@ +{ + "name": "blog", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "blog", + "version": "0.0.0", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/plugin-sitemap": "^3.1.1", + "@docusaurus/preset-classic": "3.1.1", + "@giscus/react": "^3.0.0", + "@gracefullight/docusaurus-plugin-tailwind": "^1.0.1", + "@iconify/react": "^4.1.1", + "@mdx-js/react": "^3.0.0", + "antd": "^5.15.2", + "clsx": "^2.0.0", + "docusaurus-plugin-docs-info": "^1.0.0", + "gray-matter": "^4.0.3", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "simple-git": "^3.22.0" + }, + "devDependencies": { + "@docusaurus/eslint-plugin": "^3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/tsconfig": "3.1.1", + "@docusaurus/types": "3.1.1", + "typescript": "~5.2.2" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==", + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.22.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/logger-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==", + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==", + "license": "MIT" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.2.tgz", + "integrity": "sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.6.1" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.18.4", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.18.4.tgz", + "integrity": "sha512-IrUAOj5TYuMG556C9gdbFuOrigyhzhU5ZYpWb3gYTxAwymVqRbvLzFCZg6OsjLBR6GhzcxYF3AhxKmjB+rA2xA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.1.3", + "rc-util": "^5.35.0", + "stylis": "^4.0.13" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.3.3.tgz", + "integrity": "sha512-Zfci1s4f4+vfpVD6ksmmPuBv00SB/slpUAQlsBlMeRJdSleVVkgTUdlBM4j/vGzqYfMh2hF8/Poa1VSh542w0Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.4.0", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.31.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/react-slick": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz", + "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.4", + "classnames": "^2.2.5", + "json2mq": "^0.2.0", + "resize-observer-polyfill": "^1.5.1", + "throttle-debounce": "^5.0.0" + }, + "peerDependencies": { + "react": ">=16.9.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.6", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.0.tgz", + "integrity": "sha512-QAH+vfvts51BCsNZ2PhY6HAggnlS6omLLFTsIpeqZk/MmJ6cW7tgz5yRv0fMJThcr6FmbMrENh1RgrWPTYA76g==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz", + "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz", + "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.0.tgz", + "integrity": "sha512-y/yKMm7buHpFFXfxVFS4Vk1ToRJDilIa6fKRioB9Vjichv58TDGXTvqV0dN7plobAmTW5eSEGXDngE+Mm+uO+w==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.23.3.tgz", + "integrity": "sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz", + "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz", + "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.0.tgz", + "integrity": "sha512-zc0GA5IitLKJrSfXlXmp8KDqLrnGECK7YRfQBmEKg1NmBOQ7e+KuclBEKJgzifQeUYLdNiAw4B4bjyvzWVLiSA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.0.tgz", + "integrity": "sha512-ZxPEzV9IgvGn73iK0E6VB9/95Nd7aMFpbE0l8KQFDG70cOV9IxRP7Y2FUPmlK0v6ImlLqYX50iuZ3ZTVhOF2lA==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.9", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.8", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.9", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.24.0", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.8", + "babel-plugin-polyfill-corejs3": "^0.9.0", + "babel-plugin-polyfill-regenerator": "^0.5.5", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz", + "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.23.3", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", + "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-typescript": "^7.23.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.0.tgz", + "integrity": "sha512-HxiRMOncx3ly6f3fcZ1GVKf+/EROcI9qwPgmij8Czqy6Okm/0T37T4y2ZIlLUuEUFjtM7NRsfdCO8Y3tAiJZew==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.0.tgz", + "integrity": "sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.0.tgz", + "integrity": "sha512-HUFut4ztcVNmqy9gp/wxNbC7pTOHhgVVkHVGCACTuLhUKUhKAF9KYHJtMiLUJxEqiFLQiuri1fWF8zqwM/cu1w==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.0", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.1.tgz", + "integrity": "sha512-2nQfKFcf+MLEM7JXsXwQxPOmQAR6ytKMZVSx7tVi9HEm9WtfwBH1fp6bn8Gj4zLUhjWKCLoysQ9/Wm+EZCQ4yQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@slorber/static-site-generator-webpack-plugin": "^4.0.7", + "@svgr/webpack": "^6.5.1", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^4.2.2", + "cssnano": "^5.1.15", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.1.tgz", + "integrity": "sha512-LnoIDjJWbirdbVZDMq+4hwmrTl2yHDnBf9MLG9qyExeAE3ac35s4yUhJI8yyTCdixzNfKit4cbXblzzqMu4+8g==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^5.3.10", + "postcss": "^8.4.26", + "postcss-sort-media-queries": "^4.4.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/eslint-plugin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/eslint-plugin/-/eslint-plugin-3.1.1.tgz", + "integrity": "sha512-seOuNvqXVxM4hWs9NzUgLnlVvc0Rk9N+C5fZ5gVTk5hc5JlyJNZNWh85TU+XsLogbA5odjJSEDKOhv8SDGmWRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.62.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.1.tgz", + "integrity": "sha512-BjkNDpQzewcTnST8trx4idSoAla6zZ3w22NqM/UMcFtvYJgmoE4layuTzlfql3VFPNuivvj7BOExa/+21y4X2Q==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.1.tgz", + "integrity": "sha512-xN2IccH9+sv7TmxwsDJNS97BHdmlqWwho+kIVY4tcCXkp+k4QuzvWBeunIMzeayY4Fu13A6sAjHGv5qm72KyGA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.22.7", + "@babel/traverse": "^7.22.8", + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.1.tgz", + "integrity": "sha512-xBJyx0TMfAfVZ9ZeIOb1awdXgR4YJMocIEzTps91rq+hJDFJgJaylDtmoRhUxkwuYmNK1GJpW95b7DLztSBJ3A==", + "license": "MIT", + "dependencies": { + "@docusaurus/react-loadable": "5.5.2", + "@docusaurus/types": "3.1.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@5.5.2" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/module-type-aliases/node_modules/react-helmet-async": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.4.tgz", + "integrity": "sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==", + "license": "Apache-2.0", + "dependencies": { + "invariant": "^2.2.4", + "react-fast-compare": "^3.2.2", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.1.tgz", + "integrity": "sha512-ew/3VtVoG3emoAKmoZl7oKe1zdFOsI0NbcHS26kIxt2Z8vcXKCUgK9jJJrz0TbOipyETPhqwq4nbitrY3baibg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.1.tgz", + "integrity": "sha512-lhFq4E874zw0UOH7ujzxnCayOyAt0f9YPVYSb9ohxrdCM8B4szxitUw9rIX4V9JLLHVoqIJb6k+lJJ1jrcGJ0A==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.1.tgz", + "integrity": "sha512-NQHncNRAJbyLtgTim9GlEnNYsFhuCxaCNkMwikuxLTiGIPH7r/jpb7O3f3jUMYMebZZZrDq5S7om9a6rvB/YCA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.1.tgz", + "integrity": "sha512-xWeMkueM9wE/8LVvl4+Qf1WqwXmreMjI5Kgr7GYCDoJ8zu4kD+KaMhrh7py7MNM38IFvU1RfrGKacCEe2DRRfQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.1.tgz", + "integrity": "sha512-+q2UpWTqVi8GdlLoSlD5bS/YpxW+QMoBwrPrUH/NpvpuOi0Of7MTotsQf9JWd3hymZxl2uu1o3PIrbpxfeDFDQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.1.tgz", + "integrity": "sha512-0mMPiBBlQ5LFHTtjxuvt/6yzh8v7OxLi3CbeEsxXZpUzcKO/GC7UA1VOWUoBeQzQL508J12HTAlR3IBU9OofSw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.1.tgz", + "integrity": "sha512-d07bsrMLdDIryDtY17DgqYUbjkswZQr8cLWl4tzXrt5OR/T/zxC1SYKajzB3fd87zTu5W5klV5GmUwcNSMXQXA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.1.tgz", + "integrity": "sha512-iJ4hCaMmDaUqRv131XJdt/C/jJQx8UreDWTRqZKtNydvZVh/o4yXGRRFOplea1D9b/zpwL1Y+ZDwX7xMhIOTmg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.1.tgz", + "integrity": "sha512-jG4ys/hWYf69iaN/xOmF+3kjs4Nnz1Ay3CjFLDtYa8KdxbmUhArA9HmP26ru5N0wbVWhY+6kmpYhTJpez5wTyg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/plugin-debug": "3.1.1", + "@docusaurus/plugin-google-analytics": "3.1.1", + "@docusaurus/plugin-google-gtag": "3.1.1", + "@docusaurus/plugin-google-tag-manager": "3.1.1", + "@docusaurus/plugin-sitemap": "3.1.1", + "@docusaurus/theme-classic": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-search-algolia": "3.1.1", + "@docusaurus/types": "3.1.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.1.tgz", + "integrity": "sha512-GiPE/jbWM8Qv1A14lk6s9fhc0LhPEQ00eIczRO4QL2nAQJZXkjPG6zaVx+1cZxPFWbAsqSjKe2lqkwF3fGkQ7Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/types": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.1.tgz", + "integrity": "sha512-38urZfeMhN70YaXkwIGXmcUcv2CEYK/2l4b05GkJPrbEbgpsIZM3Xc+Js2ehBGGZmfZq8GjjQ5RNQYG+MYzCYg==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/plugin-content-blog": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/plugin-content-pages": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-common": "3.1.1", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.1.tgz", + "integrity": "sha512-tBH9VY5EpRctVdaAhT+b1BY8y5dyHVZGFXyCHgTrvcXQy5CV4q7serEX7U3SveNT9zksmchPyct6i1sFDC4Z5g==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.1.1", + "@docusaurus/logger": "3.1.1", + "@docusaurus/plugin-content-docs": "3.1.1", + "@docusaurus/theme-common": "3.1.1", + "@docusaurus/theme-translations": "3.1.1", + "@docusaurus/utils": "3.1.1", + "@docusaurus/utils-validation": "3.1.1", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.1.tgz", + "integrity": "sha512-xvWQFwjxHphpJq5fgk37FXCDdAa2o+r7FX8IpMg+bGZBNXyWBu3MjZ+G4+eUVNpDhVinTc+j6ucL0Ain5KCGrg==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.1.1.tgz", + "integrity": "sha512-FTBuY3KvaHfMVBgvlPmDQ+KS9Q/bYtVftq2ugou3PgBDJoQmw2aUZ4Sg15HKqLGbfIkxoy9t6cqE4Yw1Ta8Q1A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.1.tgz", + "integrity": "sha512-grBqOLnubUecgKFXN9q3uit2HFbCxTWX4Fam3ZFbMN0sWX9wOcDoA7lwdX/8AmeL20Oc4kQvWVgNrsT8bKRvzg==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.1.tgz", + "integrity": "sha512-ZJfJa5cJQtRYtqijsPEnAZoduW6sjAQ7ZCWSZavLcV10Fw0Z3gSaPKA/B4micvj2afRZ4gZxT7KfYqe5H8Cetg==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.1.1", + "@svgr/webpack": "^6.5.1", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.1.tgz", + "integrity": "sha512-eGne3olsIoNfPug5ixjepZAIxeYFzHHnor55Wb2P57jNbtVaFvij/T+MS8U0dtZRFi50QU+UPmRrXdVUM8uyMg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.1.tgz", + "integrity": "sha512-KlY4P9YVDnwL+nExvlIpu79abfEv6ZCHuOX4ZQ+gtip+Wxj0daccdReIWWtqxM/Fb5Cz1nQvUCc7VEtT8IBUAA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.1.1", + "@docusaurus/utils": "3.1.1", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "devOptional": true, + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "devOptional": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@giscus/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@giscus/react/-/react-3.0.0.tgz", + "integrity": "sha512-hgCjLpg3Wgh8VbTF5p8ZLcIHI74wvDk1VIFv12+eKhenNVUDjgwNg2B1aq/3puyHOad47u/ZSyqiMtohjy/OOA==", + "dependencies": { + "giscus": "^1.5.0" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/@gracefullight/docusaurus-plugin-tailwind": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@gracefullight/docusaurus-plugin-tailwind/-/docusaurus-plugin-tailwind-1.0.1.tgz", + "integrity": "sha512-V4ZW2jET0H1XWPIv8Kw0NhOYPJhkRl0ag3n1yaFdHuDNQxqszSf7h9p3Z5L3wN+eZe4WR4lP8HaszKRAYQL3Hw==", + "license": "MIT", + "dependencies": { + "@docusaurus/utils-validation": "^3", + "autoprefixer": "^10.4.17", + "postcss": "^8.4.33", + "tailwindcss": "^3.4.1" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "devOptional": true, + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "devOptional": true, + "peer": true + }, + "node_modules/@iconify/react": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@iconify/react/-/react-4.1.1.tgz", + "integrity": "sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==", + "license": "MIT", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/cyberalien" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "license": "MIT" + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.2.0.tgz", + "integrity": "sha512-yWJKmpGE6lUURKAaIltoPIE/wrbY3TEkqQt+X0m+7fQNnAv0keydnYvbiJFP1PnMhizmIWRWOG5KLhYyc/xl+g==" + }, + "node_modules/@lit/reactive-element": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.0.4.tgz", + "integrity": "sha512-GFn91inaUa2oHLak8awSIigYz0cU0Payr1rcFsrkf5OJ5eSPxElyZfKh0f2p9FsTiZWXQdWGJeXZICEfXXYSXQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "license": "MIT" + }, + "node_modules/@rc-component/color-picker": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.5.3.tgz", + "integrity": "sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.6", + "@ctrl/tinycolor": "^3.6.1", + "classnames": "^2.2.6", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/context": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-1.4.0.tgz", + "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/mini-decimal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", + "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0" + }, + "engines": { + "node": ">=8.x" + } + }, + "node_modules/@rc-component/mutate-observer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz", + "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/portal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz", + "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/tour": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.14.2.tgz", + "integrity": "sha512-A75DZ8LVvahBIvxooj3Gvf2sxe+CGOkmzPNX7ek0i0AJHyKZ1HXe5ieIGo3m0FMdZfVOlbCJ952Duq8VKAHk6g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.2", + "rc-util": "^5.24.4" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@rc-component/trigger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-2.0.0.tgz", + "integrity": "sha512-niwKADPdY5dhdIblV6uwSayVivwo2uUISfJqri+/ovYQcH/omxDYBJKo755QKeoIIsWptxnRpgr7reEnNEZGFg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@rc-component/portal": "^1.1.0", + "classnames": "^2.3.2", + "rc-motion": "^2.0.0", + "rc-resize-observer": "^1.3.1", + "rc-util": "^5.38.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@slorber/remark-comment/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/@slorber/static-site-generator-webpack-plugin": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz", + "integrity": "sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==", + "license": "MIT", + "dependencies": { + "eval": "^0.1.8", + "p-map": "^4.0.0", + "webpack-sources": "^3.2.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", + "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", + "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", + "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", + "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", + "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", + "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", + "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", + "@svgr/babel-plugin-remove-jsx-attribute": "*", + "@svgr/babel-plugin-remove-jsx-empty-expression": "*", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", + "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", + "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", + "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", + "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", + "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", + "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", + "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@svgr/babel-preset": "^6.5.1", + "@svgr/hast-util-to-babel-ast": "^6.5.1", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "^6.0.0" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", + "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.1", + "deepmerge": "^4.2.2", + "svgo": "^2.8.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", + "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-constant-elements": "^7.18.12", + "@babel/preset-env": "^7.19.4", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@svgr/core": "^6.5.1", + "@svgr/plugin-jsx": "^6.5.1", + "@svgr/plugin-svgo": "^6.5.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.43", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", + "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.11.tgz", + "integrity": "sha512-HM5bwOaIQJIQbAYfax35HCKxx7a3KrK3nBtIqJgSOitivTD1y3oW9P3rxY9RkXYPUk7y/AjAohfHKmFpGE79zw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.4.tgz", + "integrity": "sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", + "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.3", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz", + "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.66", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", + "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", + "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==" + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "license": "MIT", + "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" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "license": "MIT", + "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" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "license": "MIT", + "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" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "license": "MIT", + "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" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.3.tgz", + "integrity": "sha512-1OuJT6sONAa9PxcOmWo5WCAT3jQSpCR9/m5Azujja7nhUQwAUDvaaAYrcmUySsrvHh74usZHbE3jFfGnWtZj8w==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antd": { + "version": "5.15.2", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.15.2.tgz", + "integrity": "sha512-EByEiCQknPKJVYfD+zneXwEvjdFzvMw8CZrsxw9nq19ftC4uMcMkZ2irasW7RQQGg9i7XsAZpAwYz3anuFX+EA==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^7.0.2", + "@ant-design/cssinjs": "^1.18.4", + "@ant-design/icons": "^5.3.1", + "@ant-design/react-slick": "~1.0.2", + "@babel/runtime": "^7.24.0", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~1.5.2", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/tour": "~1.14.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.5.1", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.10", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.24.0", + "rc-checkbox": "~3.2.0", + "rc-collapse": "~3.7.2", + "rc-dialog": "~9.4.0", + "rc-drawer": "~7.1.0", + "rc-dropdown": "~4.2.0", + "rc-field-form": "~1.42.1", + "rc-image": "~7.6.0", + "rc-input": "~1.4.3", + "rc-input-number": "~9.0.0", + "rc-mentions": "~2.11.1", + "rc-menu": "~9.13.0", + "rc-motion": "^2.9.0", + "rc-notification": "~5.3.0", + "rc-pagination": "~4.0.4", + "rc-picker": "~4.3.0", + "rc-progress": "~3.5.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.3.0", + "rc-select": "~14.13.0", + "rc-slider": "~10.5.0", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.42.0", + "rc-tabs": "~14.1.1", + "rc-textarea": "~1.6.3", + "rc-tooltip": "~6.2.0", + "rc-tree": "~5.8.5", + "rc-tree-select": "~5.19.0", + "rc-upload": "~4.5.2", + "rc-util": "^5.39.1", + "scroll-into-view-if-needed": "^3.1.0", + "throttle-debounce": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.18", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", + "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001591", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.1", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz", + "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0", + "core-js-compat": "^3.34.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clsx": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz", + "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "license": "MIT", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz", + "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.0.tgz", + "integrity": "sha512-iV9Pd/PsgjNWBXeq8XRtWVSgz2tKAfhfvBs7qxYty+RlRd+OCksaWmOnc4JKrTc1cToXL1N0s3l/vwlxPtdElw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.22.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.36.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.0.tgz", + "integrity": "sha512-cN28qmhRNgbMZZMc/RFu5w8pK9VJzpb2rJVR/lHuZJKwmXnoWOpXmMkxqBB514igkp1Hu8WGROsiOAzUcKdHOQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz", + "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz", + "integrity": "sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz", + "integrity": "sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.12", + "cssnano-preset-default": "^5.2.14", + "postcss-discard-unused": "^5.1.0", + "postcss-merge-idents": "^5.1.1", + "postcss-reduce-idents": "^5.2.0", + "postcss-zindex": "^5.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "devOptional": true, + "peer": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "devOptional": true, + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/docusaurus-plugin-docs-info": { + "resolved": "packages/docusaurus-plugin-docs-info", + "link": true + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.708", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.708.tgz", + "integrity": "sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", + "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "devOptional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "devOptional": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "devOptional": true, + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz", + "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "is-plain-obj": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "devOptional": true, + "peer": true + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "license": "MIT", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "devOptional": true, + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "devOptional": true, + "peer": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "devOptional": true, + "peer": true + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/giscus": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/giscus/-/giscus-1.5.0.tgz", + "integrity": "sha512-t3LL0qbSO3JXq3uyQeKpF5CegstGfKX/0gI6eDe1cmnI7D56R7j52yLdzw4pdKrg3VnufwCgCM3FDz7G1Qr6lg==", + "dependencies": { + "lit": "^3.1.2" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "devOptional": true, + "peer": true + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.2.tgz", + "integrity": "sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==", + "license": "MIT" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.5.tgz", + "integrity": "sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.2" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz", + "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.12.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.2.tgz", + "integrity": "sha512-RonXAIzCiHLc8ss3Ibuz45u28GOsWE1UpfDXLbN/9NKbL4tCJf8TWYVKsoYuuh+sAUt7fsSNpA+r2+TBA6Wjmw==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "devOptional": true, + "peer": true + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "license": "MIT", + "dependencies": { + "string-convert": "^0.2.0" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lit": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.1.2.tgz", + "integrity": "sha512-VZx5iAyMtX7CV4K8iTLdCkMaYZ7ipjJZ0JcSdJ0zIdGxxyurjIn7yuuSxNBD7QmjvcNJwr0JS4cAdAtsy7gZ6w==", + "dependencies": { + "@lit/reactive-element": "^2.0.4", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-element": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.0.4.tgz", + "integrity": "sha512-98CvgulX6eCPs6TyAIQoJZBCQPo80rgXR+dVBs61cstJXqtI+USQZAbA4gFHh6L/mxBx9MrgPLHLsUgDUHAcCQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.0.4", + "lit-html": "^3.1.2" + } + }, + "node_modules/lit-html": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.1.2.tgz", + "integrity": "sha512-3OBZSUrPnAHoKJ9AMjRL/m01YJxQMf+TMHanNtTHG68ubjnZxK0RFl102DPzsw4mWnHibfZIBJm3LWCZ/LmMvg==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "devOptional": true, + "peer": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz", + "integrity": "sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", + "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", + "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", + "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", + "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "devOptional": true, + "peer": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "devOptional": true, + "peer": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-unused": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz", + "integrity": "sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-merge-idents": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz", + "integrity": "sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz", + "integrity": "sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz", + "integrity": "sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.1.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.16" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz", + "integrity": "sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "devOptional": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", + "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qrcode.react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/qrcode.react/-/qrcode.react-3.1.0.tgz", + "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==", + "license": "ISC", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc-cascader": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.24.0.tgz", + "integrity": "sha512-NwkYsVULA61S085jbOYbq8Z7leyIxVmLwf+71mWLjA3kCfUf/rAKC0WfjQbqBDaLGlU9d4z1EzyPaHBKLYWv6A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.13.0", + "rc-tree": "~5.8.1", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-checkbox": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.2.0.tgz", + "integrity": "sha512-8inzw4y9dAhZmv/Ydl59Qdy5tdp9CKg4oPVcRigi+ga/yKPZS5m5SyyQPtYSgbcqHRYOdUhiPSeKfktc76du1A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.25.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-collapse": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.2.tgz", + "integrity": "sha512-ZRw6ipDyOnfLFySxAiCMdbHtb5ePAsB9mT17PA6y1mRD/W6KHRaZeb5qK/X9xDV1CqgyxMpzw0VdS74PCcUk4A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.3.4", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dialog": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.4.0.tgz", + "integrity": "sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.0.0-8", + "classnames": "^2.2.6", + "rc-motion": "^2.3.0", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-drawer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-7.1.0.tgz", + "integrity": "sha512-nBE1rF5iZvpavoyqhSSz2mk/yANltA7g3aF0U45xkx381n3we/RKs9cJfNKp9mSWCedOKWt9FLEwZDaAaOGn2w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.38.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.2.0.tgz", + "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.11.0", + "react-dom": ">=16.11.0" + } + }, + "node_modules/rc-field-form": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.42.1.tgz", + "integrity": "sha512-SqiEmWNP+I61Lt80+ofPvT+3l8Ij6vb35IS+x14gheVnCJN0SRnOwEgsqCEB5FslT7xqjUqDnU845hRZ1jzlAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.0", + "async-validator": "^4.1.0", + "rc-util": "^5.32.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-image": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.6.0.tgz", + "integrity": "sha512-tL3Rvd1sS+frZQ01i+tkeUPaOeFz2iG9/scAt/Cfs0hyCRVA/w0Pu1J/JxIX8blalvmHE0bZQRYdOmRAzWu4Hg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.4.0", + "rc-motion": "^2.6.2", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-input": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.4.5.tgz", + "integrity": "sha512-AjzykhwnwYTRSwwgCu70CGKBIAv6bP2nqnFptnNTprph/TF1BAs0Qxl91mie/BR6n827WIJB6ZjaRf9iiMwAfw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.18.1" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-input-number": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-9.0.0.tgz", + "integrity": "sha512-RfcDBDdWFFetouWFXBA+WPEC8LzBXyngr9b+yTLVIygfFu7HiLRGn/s/v9wwno94X7KFvnb28FNynMGj9XJlDQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.4.0", + "rc-util": "^5.28.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.11.1.tgz", + "integrity": "sha512-upb4AK1SRFql7qGnbLEvJqLMugVVIyjmwBJW9L0eLoN9po4JmJZaBzmKA4089fNtsU8k6l/tdZiVafyooeKnLw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.6", + "rc-input": "~1.4.0", + "rc-menu": "~9.13.0", + "rc-textarea": "~1.6.1", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.13.0.tgz", + "integrity": "sha512-1l8ooCB3HcYJKCltC/s7OxRKRjgymdl9htrCeGZcXNaMct0RxZRK6OPV3lPhVksIvAGMgzPd54ClpZ5J4b8cZA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.4.3", + "rc-overflow": "^1.3.1", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-motion": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz", + "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-util": "^5.21.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-notification": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-5.3.0.tgz", + "integrity": "sha512-WCf0uCOkZ3HGfF0p1H4Sgt7aWfipxORWTPp7o6prA3vxwtWhtug3GfpYls1pnBp4WA+j8vGIi5c2/hQRpGzPcQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.9.0", + "rc-util": "^5.20.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-overflow": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz", + "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.37.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-pagination": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-4.0.4.tgz", + "integrity": "sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.3.2", + "rc-util": "^5.38.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-4.3.0.tgz", + "integrity": "sha512-bQNB/+NdW55jlQ5lPnNqF5J90Tq4SihLbAF7tzPBvGDJyoYmDgwLm4FN0ZB3Ot9i1v6vJY/1mgqZZTT9jbYc5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.2.1", + "rc-overflow": "^1.3.2", + "rc-resize-observer": "^1.4.0", + "rc-util": "^5.38.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "date-fns": ">= 2.x", + "dayjs": ">= 1.x", + "luxon": ">= 3.x", + "moment": ">= 2.x", + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + }, + "peerDependenciesMeta": { + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, + "node_modules/rc-progress": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.5.1.tgz", + "integrity": "sha512-V6Amx6SbLRwPin/oD+k1vbPrO8+9Qf8zW1T8A7o83HdNafEVvAxPV5YsgtKFP+Ud5HghLj33zKOcEHrcrUGkfw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.6", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-rate": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.12.0.tgz", + "integrity": "sha512-g092v5iZCdVzbjdn28FzvWebK2IutoVoiTeqoLTj9WM7SjA/gOJIw5/JFZMRyJYYVe1jLAU2UhAfstIpCNRozg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.0.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-resize-observer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz", + "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "classnames": "^2.2.1", + "rc-util": "^5.38.0", + "resize-observer-polyfill": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-segmented": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.3.0.tgz", + "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.1", + "classnames": "^2.2.1", + "rc-motion": "^2.4.4", + "rc-util": "^5.17.0" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/rc-select": { + "version": "14.13.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.13.0.tgz", + "integrity": "sha512-ew34FsaqHokK4dxVrcIxSYrgWJ2XJYlkk32eiOIiEo3GkHUExdCzmozMYaUc2P67c5QJRUvvY0uqCs3QG67h5A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^2.0.0", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-overflow": "^1.3.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.2" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-slider": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.5.0.tgz", + "integrity": "sha512-xiYght50cvoODZYI43v3Ylsqiw14+D7ELsgzR40boDZaya1HFa1Etnv9MDkQE8X/UrXAffwv2AcNAhslgYuDTw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.5", + "rc-util": "^5.27.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-steps": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-6.0.1.tgz", + "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.16.7", + "classnames": "^2.2.3", + "rc-util": "^5.16.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-switch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-4.1.0.tgz", + "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-table": { + "version": "7.42.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.42.0.tgz", + "integrity": "sha512-GwHV9Zs3HvWxBkoXatO/IeKoElzy3Ojf3dcyw1Rj3cyQVb+ZHtexslKdyzsrKRPJ0mUa62BoX+ZAg3zgTEql8w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/context": "^1.4.0", + "classnames": "^2.2.5", + "rc-resize-observer": "^1.1.0", + "rc-util": "^5.37.0", + "rc-virtual-list": "^3.11.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tabs": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-14.1.1.tgz", + "integrity": "sha512-5nOr9PVpJy2SWHTLgv1+kESDOb0tFzl0cYU9r9d8LfL0Wg9i/n1B558rmkxdQHgBwMqxmwoyPSAbQROxMQe8nw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.2.0", + "rc-menu": "~9.13.0", + "rc-motion": "^2.6.2", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.34.1" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-textarea": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.6.3.tgz", + "integrity": "sha512-8k7+8Y2GJ/cQLiClFMg8kUXOOdvcFQrnGeSchOvI2ZMIVvX5a3zQpLxoODL0HTrvU63fPkRmMuqaEcOF9dQemA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.4.0", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.27.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tooltip": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.2.0.tgz", + "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^2.0.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.8.5", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.5.tgz", + "integrity": "sha512-PRfcZtVDNkR7oh26RuNe1hpw11c1wfgzwmPFL0lnxGnYefe9lDAO6cg5wJKIAwyXFVt5zHgpjYmaz0CPy1ZtKg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-motion": "^2.0.1", + "rc-util": "^5.16.1", + "rc-virtual-list": "^3.5.1" + }, + "engines": { + "node": ">=10.x" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-tree-select": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.19.0.tgz", + "integrity": "sha512-f4l5EsmSGF3ggj76YTzKNPY9SnXfFaer7ZccTSGb3urUf54L+cCqyT+UsPr+S5TAr8mZSxJ7g3CgkCe+cVQ6sw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.13.0", + "rc-tree": "~5.8.1", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.5.2.tgz", + "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "classnames": "^2.2.5", + "rc-util": "^5.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util": { + "version": "5.39.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.39.1.tgz", + "integrity": "sha512-OW/ERynNDgNr4y0oiFmtes3rbEamXw7GHGbkbNd9iRr7kgT03T6fT0b9WpJ3mbxKhyOcAHnGcIoh5u/cjrC2OQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^18.2.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-util/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "license": "MIT" + }, + "node_modules/rc-virtual-list": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.4.tgz", + "integrity": "sha512-NbBi0fvyIu26gP69nQBiWgUMTPX3mr4FcuBQiVqagU0BnuX8WQkiivnMs105JROeuUIFczLrlgUhLQwTWV1XDA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "classnames": "^2.2.6", + "rc-resize-observer": "^1.0.0", + "rc-util": "^5.36.0" + }, + "engines": { + "node": ">=8.x" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz", + "integrity": "sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz", + "integrity": "sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", + "license": "MIT" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rtlcss": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", + "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/scroll-into-view-if-needed": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/search-insights": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/search-insights/-/search-insights-2.13.0.tgz", + "integrity": "sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/simple-git": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.22.0.tgz", + "integrity": "sha512-6JujwSs0ac82jkGjMHiCnTifvf1crOiY/+tfs/Pqih6iow7VrpNKRRNdWm6RtaXpvvv/JGNYhlUtLhGFqHF+Yw==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz", + "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz", + "integrity": "sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", + "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", + "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", + "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "devOptional": true, + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", + "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/docusaurus-plugin-docs-info": { + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@docusaurus/core": "^3.1.1", + "dayjs": "^1.11.10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5aed566 --- /dev/null +++ b/package.json @@ -0,0 +1,59 @@ +{ + "name": "blog", + "version": "0.0.0", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids", + "typecheck": "tsc" + }, + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@docusaurus/core": "3.1.1", + "@docusaurus/plugin-sitemap": "^3.1.1", + "@docusaurus/preset-classic": "3.1.1", + "@giscus/react": "^3.0.0", + "@gracefullight/docusaurus-plugin-tailwind": "^1.0.1", + "@iconify/react": "^4.1.1", + "@mdx-js/react": "^3.0.0", + "antd": "^5.15.2", + "clsx": "^2.0.0", + "docusaurus-plugin-docs-info": "^1.0.0", + "gray-matter": "^4.0.3", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "simple-git": "^3.22.0" + }, + "devDependencies": { + "@docusaurus/eslint-plugin": "^3.1.1", + "@docusaurus/module-type-aliases": "3.1.1", + "@docusaurus/tsconfig": "3.1.1", + "@docusaurus/types": "3.1.1", + "typescript": "~5.2.2" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=18.0" + } +} diff --git a/packages/docusaurus-plugin-docs-info/node_modules/.bin/docusaurus b/packages/docusaurus-plugin-docs-info/node_modules/.bin/docusaurus new file mode 120000 index 0000000..3d04d20 --- /dev/null +++ b/packages/docusaurus-plugin-docs-info/node_modules/.bin/docusaurus @@ -0,0 +1 @@ +../../../../node_modules/@docusaurus/core/bin/docusaurus.mjs \ No newline at end of file diff --git a/packages/docusaurus-plugin-docs-info/package.json b/packages/docusaurus-plugin-docs-info/package.json new file mode 100644 index 0000000..ad9a672 --- /dev/null +++ b/packages/docusaurus-plugin-docs-info/package.json @@ -0,0 +1,15 @@ +{ + "name": "docusaurus-plugin-docs-info", + "version": "1.0.0", + "description": "", + "main": "src/index.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "@docusaurus/core": "^3.1.1", + "dayjs": "^1.11.10" + } +} diff --git a/packages/docusaurus-plugin-docs-info/src/components/ArticleList/index.tsx b/packages/docusaurus-plugin-docs-info/src/components/ArticleList/index.tsx new file mode 100644 index 0000000..2fa585c --- /dev/null +++ b/packages/docusaurus-plugin-docs-info/src/components/ArticleList/index.tsx @@ -0,0 +1,100 @@ +import { Article } from "../.."; +import { FullVersion } from "@docusaurus/plugin-content-docs/lib/types.d.ts"; +import { DocMetadata } from "@docusaurus/plugin-content-docs"; +import { usePluginData } from "@docusaurus/useGlobalData"; +import dayjs from "dayjs"; +import Link from "@docusaurus/Link"; + +const ArticleList: React.FC<{ + list: Article[]; +}> = ({ list: data }) => { + const docsData = usePluginData("docusaurus-plugin-content-docs") as { + versions: FullVersion[]; + }; + const list: Array> = []; + const map: Map = new Map(); + for (let i = 0; i < docsData.versions[0].docs.length; i++) { + // @ts-ignore + map.set(docsData.versions[0].docs[i].path, docsData.versions[0].docs[i]); + } + // 一行两个 + const num = 3; + for (let i = 0; i < data.length && i < 8; i += num) { + list.push(data.slice(i, i + num)); + } + // 构建与docs的连接 + for (let i = 0; i < list.length; i++) { + for (let j = 0; j < list[i].length; j++) { + const val = list[i][j]; + let path = val.filename.replace(/\.(md|mdx)/, "").substring(4); + if ( + val.filename.endsWith("index.md") || + val.filename.endsWith("index.mdx") + ) { + path = path.split("/").slice(0, -1).join("/") + "/"; + } + const doc = map.get(path); + if (doc) { + // @ts-ignore + list[i][j].link = doc.path; + } + } + } + + return ( + <> + {list.map((val, index) => ( +
+ {val.map((val, index) => ( +
+
+
+ + {val.title} + +
+
+
+

{dayjs(val.create_date).format("YYYY年MM月DD日")}

+ + + +
+
+
+
+ ))} +
+ ))} + + ); +}; + +export default ArticleList; diff --git a/packages/docusaurus-plugin-docs-info/src/components/LatestDocs/index.tsx b/packages/docusaurus-plugin-docs-info/src/components/LatestDocs/index.tsx new file mode 100644 index 0000000..cb82298 --- /dev/null +++ b/packages/docusaurus-plugin-docs-info/src/components/LatestDocs/index.tsx @@ -0,0 +1,33 @@ +import { usePluginData } from "@docusaurus/useGlobalData"; +import { Articles } from "../.."; +import ArticleList from "../ArticleList"; +import Link from "@docusaurus/Link"; + +function LatestDocs() { + const data = usePluginData("docusaurus-plugin-docs-info") as Articles; + + return ( +
+ +
+ + + +
+
+ ); +} + +export default LatestDocs; diff --git a/packages/docusaurus-plugin-docs-info/src/index.ts b/packages/docusaurus-plugin-docs-info/src/index.ts new file mode 100644 index 0000000..9c79526 --- /dev/null +++ b/packages/docusaurus-plugin-docs-info/src/index.ts @@ -0,0 +1,168 @@ +import path from "path"; +import fs from "fs"; +import simpleGit, { DefaultLogFields } from "simple-git"; +import matter from "gray-matter"; +import { LoadContext, Plugin } from "@docusaurus/types"; + +async function readDir(pathName: string) { + return new Promise((resolve) => { + const filenames: Array = []; + fs.readdir(pathName, async (_, files) => { + await Promise.all( + files.map((val) => { + return new Promise((resolve) => { + const filename = path.join(pathName, val); + fs.stat(filename, async (_, stats) => { + if (stats.isFile()) { + filenames.push(filename); + } else { + const result = await readDir(filename); + filenames.push(...result); + } + resolve(); + }); + }); + }) + ); + resolve(filenames); + }); + }); +} + +export interface Article { + filename: string; + title: string; + create_date?: Date; + update_date?: Date; +} + +export interface Articles { + list: Article[]; + current: number; + total: number; +} + +export default function ( + context: LoadContext, + options: { debug?: boolean } +): Plugin { + const themePath = path.resolve(__dirname, "./theme"); + return { + name: "docusaurus-plugin-docs-info", + getThemePath() { + return themePath; + }, + async contentLoaded({ content, actions }): Promise { + const { addRoute, createData, setGlobalData } = actions; + const isProd = process.env.NODE_ENV === "production"; + if (!isProd && !options.debug) { + setGlobalData({ + current: 1, + list: [], + total: 0, + }); + return; + } + + // 读取docs下文件 + const files = await readDir("./docs"); + const git = simpleGit(); + const articles = []; + + await Promise.all( + files.map((file) => { + return new Promise((resolve) => { + if ( + !( + file.startsWith("_") || + file.endsWith(".md") || + file.endsWith(".mdx") + ) + ) { + return resolve(); + } + // 读取文件内容, 查看标题, 查看日期 + const meta = matter.read(file); + const article: Article = { + filename: file, + title: + meta.data["title"] || + path.basename(file).split(".").slice(0, -1).join("."), + }; + // 读取git log文件时间 + git.log( + { + format: "%ad", + file: file, + }, + (_, data) => { + if (meta.data["create_date"]) { + article.create_date = new Date(meta.data["create_date"]); + } else { + article.create_date = data.all.length + ? new Date(data.all[data.all.length - 1].date) + : new Date(); + } + if (meta.data["update_date"]) { + article.update_date = new Date(meta.data["update_date"]); + } else { + article.update_date = data.latest + ? new Date(data.latest.date) + : new Date(); + } + articles.push(article); + resolve(); + } + ); + }); + }) + ); + + // 20篇为一页, 创建时间由新到旧 + articles.sort((a, b) => { + return b.create_date.getTime() - a.create_date.getTime(); + }); + + const pageSize = 21; + const latest = { + current: 1, + list: articles.slice(0, pageSize), + total: articles.length, + }; + setGlobalData(latest); + + const pageData = await createData( + "timeline-1.json", + JSON.stringify(latest) + ); + addRoute({ + path: "/timeline", + component: "@theme/Timeline", + modules: { + articles: pageData, + }, + exact: true, + }); + + for (let i = 1; i < Math.ceil(articles.length / pageSize); i++) { + const page = i + 1; + const pageData = await createData( + `timeline-${page}.json`, + JSON.stringify({ + current: i + 1, + list: articles.slice(i * pageSize, (i + 1) * pageSize), + total: articles.length, + }) + ); + addRoute({ + path: `/timeline/${page}`, + component: "@theme/Timeline", + modules: { + articles: pageData, + }, + exact: true, + }); + } + }, + }; +} diff --git a/packages/docusaurus-plugin-docs-info/src/theme/Timeline/index.tsx b/packages/docusaurus-plugin-docs-info/src/theme/Timeline/index.tsx new file mode 100644 index 0000000..94e68a6 --- /dev/null +++ b/packages/docusaurus-plugin-docs-info/src/theme/Timeline/index.tsx @@ -0,0 +1,49 @@ +import Layout from "@theme/Layout"; +import { Article, Articles } from "../.."; +import ArticleList from "../../components/ArticleList"; +import { Pagination } from "antd"; +import Link from "@docusaurus/Link"; + +export interface TimelineProps { + articles: Articles; +} + +function Timeline({ articles }: TimelineProps) { + return ( + +
+ +
+ { + if (!page) { + return el; + } + if (page === 1) { + return 1; + } + return {page}; + }} + /> +
+
+
+ ); +} + +export default Timeline; diff --git a/sidebars.ts b/sidebars.ts new file mode 100644 index 0000000..34d8219 --- /dev/null +++ b/sidebars.ts @@ -0,0 +1,23 @@ +import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; + +/** + * Creating a sidebar enables you to: + - create an ordered group of docs + - render a sidebar for each doc of that group + - provide next/previous navigation + + The sidebars can be generated from the filesystem, or explicitly defined here. + + Create as many sidebars as you want. + */ +const sidebars: SidebarsConfig = { + // By default, Docusaurus generates a sidebar from the docs folder structure + all: [{ type: "autogenerated", dirName: "." }], + + // But you can create a sidebar manually + dev: [{ type: "autogenerated", dirName: "dev" }], + ops: [{ type: "autogenerated", dirName: "ops" }], + note: [{ type: "autogenerated", dirName: "note" }], +}; + +export default sidebars; diff --git a/src/components/Comments/index.tsx b/src/components/Comments/index.tsx new file mode 100644 index 0000000..3df3a00 --- /dev/null +++ b/src/components/Comments/index.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import Giscus from "@giscus/react"; +import { useColorMode } from "@docusaurus/theme-common"; + +export default function Comments(): JSX.Element { + const { colorMode } = useColorMode(); + + return ( +
+ +
+ ); +} diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx new file mode 100644 index 0000000..50a9e6f --- /dev/null +++ b/src/components/HomepageFeatures/index.tsx @@ -0,0 +1,70 @@ +import clsx from 'clsx'; +import Heading from '@theme/Heading'; +import styles from './styles.module.css'; + +type FeatureItem = { + title: string; + Svg: React.ComponentType>; + description: JSX.Element; +}; + +const FeatureList: FeatureItem[] = [ + { + title: 'Easy to Use', + Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, + description: ( + <> + Docusaurus was designed from the ground up to be easily installed and + used to get your website up and running quickly. + + ), + }, + { + title: 'Focus on What Matters', + Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, + description: ( + <> + Docusaurus lets you focus on your docs, and we'll do the chores. Go + ahead and move your docs into the docs directory. + + ), + }, + { + title: 'Powered by React', + Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, + description: ( + <> + Extend or customize your website layout by reusing React. Docusaurus can + be extended while reusing the same header and footer. + + ), + }, +]; + +function Feature({title, Svg, description}: FeatureItem) { + return ( +
+
+ +
+
+ {title} +

{description}

+
+
+ ); +} + +export default function HomepageFeatures(): JSX.Element { + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); +} diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css new file mode 100644 index 0000000..b248eb2 --- /dev/null +++ b/src/components/HomepageFeatures/styles.module.css @@ -0,0 +1,11 @@ +.features { + display: flex; + align-items: center; + padding: 2rem 0; + width: 100%; +} + +.featureSvg { + height: 200px; + width: 200px; +} diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 0000000..1fcc247 --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,65 @@ +/* @tailwind base; */ +@tailwind components; +@tailwind utilities; + +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +/* You can override the default Infima variables here. */ +:root { + --ifm-color-primary: #4594d5; + --ifm-color-primary-dark: #2f87cf; + --ifm-color-primary-darker: #2c7fc4; + --ifm-color-primary-darkest: #2469a1; + --ifm-color-primary-light: #5ca1da; + --ifm-color-primary-lighter: #68a8dd; + --ifm-color-primary-lightest: #8abce5; + --ifm-code-font-size: 95%; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + --ifm-font-family-base: Roboto, "PingFang SC", "Microsoft Yahei", sans-serif; + --ifm-heading-font-family: Roboto, Verdana, "Raleway", "PingFang SC", "Microsoft Yahei", sans-serif; +} + +/* For readability concerns, you should choose a lighter palette in dark mode. */ +[data-theme='dark'] { + --ifm-color-primary: #4594d5; + --ifm-color-primary-dark: #2f87cf; + --ifm-color-primary-darker: #2c7fc4; + --ifm-color-primary-darkest: #2469a1; + --ifm-color-primary-light: #5ca1da; + --ifm-color-primary-lighter: #68a8dd; + --ifm-color-primary-lightest: #8abce5; + --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --ifm-button-color: #fff; +} + +[data-theme='dark'] .home .bg-dark { + background: rgba(75, 85, 99); +} + + +[data-theme='dark'] .home .bg-light { + background: #262b30; +} + +.home .bg-dark { + background: #fff; +} + +.home .bg-light { + background: rgba(75, 85, 99); + color: #fff; +} + +a:hover { + color: unset; + text-decoration: unset; +} + +.navbar__logo { + border-radius: 100%; + overflow: hidden; +} \ No newline at end of file diff --git a/src/pages/index.module.css b/src/pages/index.module.css new file mode 100644 index 0000000..be57178 --- /dev/null +++ b/src/pages/index.module.css @@ -0,0 +1,40 @@ +/** + * CSS files with the .module.css suffix will be treated as CSS modules + * and scoped locally. + */ + +.heroBanner { + padding: 4rem 0; + text-align: center; + position: relative; + overflow: hidden; +} + +@media screen and (max-width: 996px) { + .heroBanner { + padding: 2rem; + } +} + +.buttons { + display: flex; + align-items: center; + justify-content: center; +} + +.hide-zhan:hover .hide-zhan-1 { + text-decoration: line-through; +} + + +.hide-zhan:hover .hide-zhan-2 { + display: inline; +} + +.hide-zhan-2 { + display: none; +} + +.social a { + font-size: 2rem; +} \ No newline at end of file diff --git a/src/pages/index.tsx b/src/pages/index.tsx new file mode 100644 index 0000000..88a4327 --- /dev/null +++ b/src/pages/index.tsx @@ -0,0 +1,140 @@ +import Layout from "@theme/Layout"; +import clsx from "clsx"; +import styles from "./index.module.css"; +import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; +import { Icon } from "@iconify/react/dist/iconify.js"; +import Link from "@docusaurus/Link"; +import LatestDocs from "docusaurus-plugin-docs-info/src/components/LatestDocs"; + +function HomepageHeader() { + const { siteConfig } = useDocusaurusContext(); + return ( +
+
+
+

+ Hi!我是 + 王一之 +

+

+ 欢迎来到我的个人博客,一个什么都会点的全 + + + + + 工程师,这里记录了我的一些学习笔记和技术分享。目前主要使用 + + Golang + + 与 + + TypeScript + + ✖️ + + React + + 进行开发,也会写一些关于 + + 运维 + + 、 + + 工具分享 + + 之类的文章。 +
+ 平常喜欢做开源项目,目前我正在开发 + + 脚本猫 + + 与运营 + + 油猴中文网 + + ,你可以在我的 + + Github + + 中找到更多关于我的开源项目。 +
+
+ 博客源码托管在 + + GitHub + + 上,如果觉得还不错,顺手点个 Star 吧! +

+ +
+
+ + + + {/* + + */} +
+
+
+ +
+
+
+

+ 最新文章 +

+ +
+
+ ); +} + +function Index() { + const { siteConfig } = useDocusaurusContext(); + return ( + + + + ); +} + +export default Index; diff --git a/src/theme/DocItem/Footer/index.tsx b/src/theme/DocItem/Footer/index.tsx new file mode 100644 index 0000000..d26596c --- /dev/null +++ b/src/theme/DocItem/Footer/index.tsx @@ -0,0 +1,17 @@ +import React from "react"; +import Footer from "@theme-original/DocItem/Footer"; +// @ts-ignore +import Comments from "/src/components/Comments"; +import { useDoc } from "@docusaurus/theme-common/internal"; + +export default function FooterWrapper(props) { + const { metadata } = useDoc(); + const { comments = true } = metadata.frontMatter; + + return ( + <> +