From bd457c7f107ac3d5ad3a78ecfe48a68e6f334e3b Mon Sep 17 00:00:00 2001 From: JianMiau Date: Thu, 23 Nov 2023 16:33:21 +0800 Subject: [PATCH] [add] first --- .eslintignore | 2 + .eslintrc.json | 366 + .gitignore | 30 + auto-imports.d.ts | 5 + build-templates/favicon.ico | Bin 0 -> 137165 bytes build.cjs | 124 + index.html | 24 + package-lock.json | 8946 +++++++++++++++++ package.json | 99 + src/Common/DataReceived/MainControlData.ts | 242 + src/Common/MainControl/MainControl.ts | 29 + src/Common/Mask/CSMask.ts | 53 + src/Common/Mask/Group/LoadMaskBase.ts | 35 + src/Common/Mask/Group/LoadingMask.ts | 6 + src/Common/Message/CSMessage.ts | 49 + src/Common/ResourceItem/CSResource.ts | 92 + src/Common/ResourceItem/IResourceItem.ts | 16 + .../ResourceItem/Items/CardCouponItem.ts | 28 + .../Items/CollectTokenItem.ts.meta | 10 + .../ResourceItem/Items/LevelItem.ts.meta | 10 + src/Common/ResourceItem/Items/LpPointItem.ts | 28 + .../ResourceItem/Items/LpPointItem.ts.meta | 10 + src/Common/ResourceItem/Items/MoneyItem.ts | 31 + .../ResourceItem/Items/MoneyItem.ts.meta | 10 + src/Common/ResourceItem/ResourceItemType.ts | 12 + src/Common/System/SystemEventBase.ts | 22 + src/Common/System/SystemEventManager.ts | 34 + .../CatanEngine/CSharp/System/Action.ts | 125 + .../CSharp/System/ActionWithType.ts | 165 + .../CSharp/System/ActionWithType2.ts | 165 + .../CSharp/System/Text/Encoding.ts | 75 + .../CSharp/System/Text/Encoding.ts.meta | 10 + .../CoroutineV2/CancellationTokenSource.ts | 44 + .../CoroutineV2/Core/ActionEnumerator.ts | 17 + .../CoroutineV2/Core/BaseEnumerator.ts | 137 + .../CoroutineV2/Core/CoroutineExecutor.ts | 103 + .../CoroutineV2/Core/EnumeratorExecutor.ts | 167 + .../CoroutineV2/Core/ParallelEnumerator.ts | 46 + .../CoroutineV2/Core/SingleEnumerator.ts | 18 + .../CoroutineV2/Core/WaitTimeEnumerator.ts | 21 + .../CoroutineV2/CoroutineExample.ts | 133 + .../CatanEngine/CoroutineV2/CoroutineV2.ts | 75 + .../CatanEngine/CoroutineV2/IEnumeratorV2.ts | 23 + .../NetManagerV2/Core/INetConnector.ts | 15 + .../NetManagerV2/Core/INetRequest.ts | 13 + .../NetManagerV2/Core/INetResponse.ts | 6 + .../CatanEngine/NetManagerV2/NetConfig.ts | 4 + .../CatanEngine/NetManagerV2/NetConnector.ts | 279 + .../CatanEngine/NetManagerV2/NetManager.ts | 54 + .../CatanEngine/NetManagerV2/NetRequest.ts | 28 + .../CatanEngine/TableV3/Core/ITableJson.ts | 4 + .../CatanEngine/TableV3/Core/ITableRow.ts | 10 + .../CatanEngine/TableV3/Core/TableBase.ts | 30 + .../TableV3/Examples/CSSettingsV3Example.ts | 13 + .../TableV3/Examples/TableUseExample.ts | 78 + .../Examples/Tables/StringTableExample.ts | 50 + .../CatanEngine/TableV3/TableManager.ts | 53 + src/Engine/Data/LocalStorageData.ts | 57 + src/Engine/Timer/Timer.ts | 192 + src/Engine/Utils/Audio/CSAudio.ts | 5 + src/Engine/Utils/PSPS.ts | 120 + src/Engine/Utils/Singleton/BaseSingleton.ts | 27 + src/UI/Game.tsx | 7 + src/UI/Lobby.tsx | 7 + src/UI/Login.tsx | 53 + .../BusinessTypeSetting.ts | 255 + src/context/GameItemsContext.tsx | 45 + src/index.css | 5 + src/index.tsx | 38 + src/types/index.ts | 7 + src/utils/ArrayExtension.ts | 140 + src/utils/LineTools.ts | 565 ++ src/utils/Number/NumberEx.ts | 181 + src/utils/Number/NumberEx.ts.meta | 10 + src/utils/Number/RandomEx.ts | 92 + src/utils/Number/RandomEx.ts.meta | 10 + src/utils/NumberExtension.ts | 192 + src/utils/PWANotification.ts | 99 + src/utils/String.ts | 20 + src/utils/catan.ts | 48 + src/utils/iframeUtils.ts | 47 + src/utils/index.ts | 652 ++ src/utils/setRPCData.ts | 235 + src/vite-env.d.ts | 1 + src/zSbmoduleUpdate.bat | 38 + tsconfig.json | 41 + tsconfig.node.json | 11 + vite.config.d.ts | 2 + vite.config.ts | 28 + 89 files changed, 15504 insertions(+) create mode 100644 .eslintignore create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 auto-imports.d.ts create mode 100644 build-templates/favicon.ico create mode 100644 build.cjs create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/Common/DataReceived/MainControlData.ts create mode 100644 src/Common/MainControl/MainControl.ts create mode 100644 src/Common/Mask/CSMask.ts create mode 100644 src/Common/Mask/Group/LoadMaskBase.ts create mode 100644 src/Common/Mask/Group/LoadingMask.ts create mode 100644 src/Common/Message/CSMessage.ts create mode 100644 src/Common/ResourceItem/CSResource.ts create mode 100644 src/Common/ResourceItem/IResourceItem.ts create mode 100644 src/Common/ResourceItem/Items/CardCouponItem.ts create mode 100644 src/Common/ResourceItem/Items/CollectTokenItem.ts.meta create mode 100644 src/Common/ResourceItem/Items/LevelItem.ts.meta create mode 100644 src/Common/ResourceItem/Items/LpPointItem.ts create mode 100644 src/Common/ResourceItem/Items/LpPointItem.ts.meta create mode 100644 src/Common/ResourceItem/Items/MoneyItem.ts create mode 100644 src/Common/ResourceItem/Items/MoneyItem.ts.meta create mode 100644 src/Common/ResourceItem/ResourceItemType.ts create mode 100644 src/Common/System/SystemEventBase.ts create mode 100644 src/Common/System/SystemEventManager.ts create mode 100644 src/Engine/CatanEngine/CSharp/System/Action.ts create mode 100644 src/Engine/CatanEngine/CSharp/System/ActionWithType.ts create mode 100644 src/Engine/CatanEngine/CSharp/System/ActionWithType2.ts create mode 100644 src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts create mode 100644 src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts.meta create mode 100644 src/Engine/CatanEngine/CoroutineV2/CancellationTokenSource.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/Core/ActionEnumerator.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/Core/CoroutineExecutor.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/Core/EnumeratorExecutor.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/Core/ParallelEnumerator.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/Core/SingleEnumerator.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/Core/WaitTimeEnumerator.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/CoroutineExample.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/CoroutineV2.ts create mode 100644 src/Engine/CatanEngine/CoroutineV2/IEnumeratorV2.ts create mode 100644 src/Engine/CatanEngine/NetManagerV2/Core/INetConnector.ts create mode 100644 src/Engine/CatanEngine/NetManagerV2/Core/INetRequest.ts create mode 100644 src/Engine/CatanEngine/NetManagerV2/Core/INetResponse.ts create mode 100644 src/Engine/CatanEngine/NetManagerV2/NetConfig.ts create mode 100644 src/Engine/CatanEngine/NetManagerV2/NetConnector.ts create mode 100644 src/Engine/CatanEngine/NetManagerV2/NetManager.ts create mode 100644 src/Engine/CatanEngine/NetManagerV2/NetRequest.ts create mode 100644 src/Engine/CatanEngine/TableV3/Core/ITableJson.ts create mode 100644 src/Engine/CatanEngine/TableV3/Core/ITableRow.ts create mode 100644 src/Engine/CatanEngine/TableV3/Core/TableBase.ts create mode 100644 src/Engine/CatanEngine/TableV3/Examples/CSSettingsV3Example.ts create mode 100644 src/Engine/CatanEngine/TableV3/Examples/TableUseExample.ts create mode 100644 src/Engine/CatanEngine/TableV3/Examples/Tables/StringTableExample.ts create mode 100644 src/Engine/CatanEngine/TableV3/TableManager.ts create mode 100644 src/Engine/Data/LocalStorageData.ts create mode 100644 src/Engine/Timer/Timer.ts create mode 100644 src/Engine/Utils/Audio/CSAudio.ts create mode 100644 src/Engine/Utils/PSPS.ts create mode 100644 src/Engine/Utils/Singleton/BaseSingleton.ts create mode 100644 src/UI/Game.tsx create mode 100644 src/UI/Lobby.tsx create mode 100644 src/UI/Login.tsx create mode 100644 src/_BusinessTypeSetting/BusinessTypeSetting.ts create mode 100644 src/context/GameItemsContext.tsx create mode 100644 src/index.css create mode 100644 src/index.tsx create mode 100644 src/types/index.ts create mode 100644 src/utils/ArrayExtension.ts create mode 100644 src/utils/LineTools.ts create mode 100644 src/utils/Number/NumberEx.ts create mode 100644 src/utils/Number/NumberEx.ts.meta create mode 100644 src/utils/Number/RandomEx.ts create mode 100644 src/utils/Number/RandomEx.ts.meta create mode 100644 src/utils/NumberExtension.ts create mode 100644 src/utils/PWANotification.ts create mode 100644 src/utils/String.ts create mode 100644 src/utils/catan.ts create mode 100644 src/utils/iframeUtils.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/setRPCData.ts create mode 100644 src/vite-env.d.ts create mode 100644 src/zSbmoduleUpdate.bat create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.d.ts create mode 100644 vite.config.ts diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..13b0ba2 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +src/FormTable +src/FormTableExt \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..200119f --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,366 @@ +{ + "env": { + "browser": true, + "es2021": true, + "jest": true + }, + "extends": [ + "eslint:recommended", + "plugin:react/recommended", + "plugin:@typescript-eslint/recommended" + ], + "overrides": [], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": "latest", + "sourceType": "module" + }, + "plugins": [ + "react", + "@typescript-eslint", + "react-hooks" + ], + "rules": { + "no-alert": 0, //禁止使用alert confirm prompt + "no-bitwise": 0, //禁止使用按位运算符 + "no-console": "off", //禁止使用console + "no-continue": 0, //禁止使用continue + "no-debugger": 2, //禁止使用debugger + "no-delete-var": 2, //不能对var声明的变量使用delete操作符 + "no-div-regex": 1, //不能使用看起来像除法的正则表达式/=foo/ + "no-dupe-args": 2, //函数参数不能重复 + "no-duplicate-case": 2, //switch中的case标签不能重复 + "no-else-return": "off", //如果if语句里面有return,后面不能跟else语句 + "no-empty-label": "off", //禁止使用空label + "no-eq-null": "off", //禁止对null使用==或!=运算符 + "no-extend-native": "off", //禁止扩展native对象 + "no-extra-parens": "off", //禁止非必要的括号 + "no-extra-semi": 2, //禁止多余的冒号 + "no-floating-decimal": 2, //禁止省略浮点数中的0 .5 3. + "no-implicit-coercion": "off", //禁止隐式转换 + "no-inline-comments": 0, //禁止行内备注 + "no-invalid-this": 2, //禁止无效的this,只能用在构造器,类,对象字面量 + "no-iterator": 2, //禁止使用__iterator__ 属性 + "no-lonely-if": "off", //禁止else语句内只有if语句 + "no-mixed-requires": [ + 0, + false + ], //声明时不能混用声明类型 + "no-mixed-spaces-and-tabs": "off", //禁止混用tab和空格 + "no-multiple-empty-lines": [ + 1, + { + "max": 2 + } + ], //空行最多不能超过2行 + "no-nested-ternary": 0, //禁止使用嵌套的三目运算 + "no-new": "off", //禁止在使用new构造一个实例后不赋值 + "no-new-require": 2, //禁止使用new require + "no-param-reassign": "off", //禁止给参数重新赋值 + "no-path-concat": 0, //node中不能使用__dirname或__filename做路径拼接 + "no-plusplus": 0, //禁止使用++,-- + "no-process-env": 0, //禁止使用process.env + "no-process-exit": 0, //禁止使用process.exit() + "no-redeclare": "off", //禁止重复声明变量 + "no-restricted-modules": 0, //如果禁用了指定模块,使用就会报错 + "no-return-assign": "off", //return 语句中不能有赋值表达式 + "no-self-compare": 2, //不能比较自身 + "no-sequences": 0, //禁止使用逗号运算符 + "no-shadow": "off", //外部作用域中的变量不能与它所包含的作用域中的变量或参数同名 + "no-sync": 0, //nodejs 禁止同步方法 + "no-ternary": 0, //禁止使用三目运算符 + "no-this-before-super": 0, //在调用super()之前不能使用this或super + "no-throw-literal": 2, //禁止抛出字面量错误 throw "error"; + "no-undef": "off", //不能有未定义的变量 + "no-undef-init": "off", //变量初始化时不能直接给它赋值为undefined + "no-undefined": "off", //不能使用undefined + "no-unexpected-multiline": 2, //避免多行表达式 + "no-underscore-dangle": "off", //标识符不能以_开头或结尾 + "no-unneeded-ternary": 2, //禁止不必要的嵌套 var isYes = answer === 1 ? true : false; + "no-unused-expressions": "off", //禁止无用的表达式 + "no-unused-vars": "off", //不能有声明后未被使用的变量或参数 + "no-use-before-define": "off", //未定义前不能使用 + "no-useless-call": "off", //禁止不必要的call和apply + "no-void": "off", //禁用void操作符 + "no-var": 0, //禁用var,用let和const代替 + "no-warning-comments": "off", //不能有警告备注 + "no-array-constructor": "error", // 禁止使用数组构造器 + "no-caller": "error", // 禁止使用arguments.caller或arguments.callee + "no-catch-shadow": "error", // 禁止catch子句参数与外部作用域变量同名 + "no-class-assign": "error", // 禁止给类赋值 + "no-cond-assign": [ + "error", + "except-parens" + ], // 禁止在条件表达式中使用赋值语句 + "no-constant-condition": "error", // 禁止在条件中使用常量表达式 if(true) if(1) + "no-control-regex": "error", // 禁止在正则表达式中使用控制字符 + "no-dupe-keys": "error", // 在创建对象字面量时不允许键重复 {a: 1, a: 1} + "no-empty": "error", // 块语句中的内容不能为空 + "no-empty-character-class": "error", // 正则表达式中的[]内容不能为空 + "no-eval": "error", // 禁止使用eval + "no-ex-assign": "error", // 禁止给catch语句中的异常参数赋值 + "no-extra-bind": "error", // 禁止不必要的函数绑定 + "no-extra-boolean-cast": "off", // 禁止不必要的bool转换 + "no-fallthrough": "error", // 禁止switch穿透 + "no-func-assign": "error", // 禁止重复的函数声明 + "no-implied-eval": "error", // 禁止使用隐式eval + "no-inner-declarations": "off", // 禁止在块语句中使用声明函数 + "no-invalid-regexp": "error", // 禁止无效的正则表达式 + "no-irregular-whitespace": "error", // 不能有不规则的空格 + "no-label-var": "error", // label名不能与var声明的变量名相同 + "no-labels": "error", // 禁止标签声明 + "no-lone-blocks": "error", // 禁止不必要的嵌套块 + "no-loop-func": "error", // 禁止在循环中使用函数(如果没有引用外部变量不形成闭包就可以) + "no-multi-spaces": "error", // 不能用多余的空格 + "no-multi-str": "error", // 字符串不能用\换行 + "no-native-reassign": "error", // 不能重写native对象 + "no-negated-in-lhs": "error", // in 操作符的左边不能有! + "no-new-func": "error", // 禁止使用new Function + "no-new-object": "error", // 禁止使用new Object() + "no-new-wrappers": "error", // 禁止使用new创建包装实例,new String new Boolean new Number + "no-obj-calls": "error", // 不能调用内置的全局对象,比如Math() JSON() + "no-octal": "error", // 禁止使用八进制数字(因为八进制数字以0开头) + "no-octal-escape": "error", // 禁止使用八进制转义序列 + "no-proto": "error", // 禁止使用__proto__属性(按照标准,__proto__为私有属性,不应公开) + "no-regex-spaces": "error", // 禁止在正则表达式字面量中使用多个空格 /foo bar/ + "no-script-url": "off", // 禁止使用javascript:void(0) + "no-shadow-restricted-names": "error", // 严格模式中规定的限制标识符不能作为声明时的变量名使用 + "no-spaced-func": "error", // 函数调用时 函数名与()之间不能有空格 + "no-sparse-arrays": "error", // 禁止稀疏数组, [1,,2] + "no-trailing-spaces": [ + "error", + { + "skipBlankLines": true + } + ], // 一行结束后面不要有空格( 空白行忽略 ) + "no-unreachable": "error", // 不能有无法执行的代码 + "no-const-assign": "error", // 禁止修改const声明的变量 + "no-with": "error", // 禁用with + "comma-dangle": "off", // 数组或对象最后不允许出现多余的逗号 + "comma-spacing": "error", // 逗号前面不允许有空格,后面还有东西的时候必须有一个空格 + "curly": [ + "error", + "multi-line" + ], // 块级代码需要换行的时候必须使用 {}将代码裹起来 + "eqeqeq": "off", // 必须使用全等 + "indent": [ + "off", + "tab", + { + "SwitchCase": 1 + } + ], // 缩进用tab + "key-spacing": [ + "error", + { + "beforeColon": false, + "afterColon": true + } + ], // 对象字面量中冒号的后面必须有空格,前面不允许有空格 + "keyword-spacing": "off", // 关键字前后必须存在空格 + "new-parens": "error", // new时必须加小括号 const person = new Person(); + "quotes": [ + "error", + "double", + { + "allowTemplateLiterals": true + } + ], // 引号类型 '' + "semi": [ + "error", + "always" + ], // 语句必须分号结尾 + "semi-spacing": [ + 0, + { + "before": false, + "after": true + } + ], // 分号前面不允许有空格,后面有其他东西的时候必须空一空格 + "space-before-blocks": [ + "error", + "always" + ], // 不以新行开始的块 { 前面要有空格 + // "space-before-function-paren": ["error", "never"], // 函数定义时括号前面不允许有空格 + "space-infix-ops": "error", // 中缀操作符周围必须有空格 a + b + "space-unary-ops": [ + "error", + { + "words": true, + "nonwords": false + } + ], // 一元运算符的前/后如果是单词则空一空格,如果是运算符则不需要空空格 new Foo √ 1++ √ + // "spaced-comment": ["error", "always", { "markers": ["*!"] }], // 注释风格, 双斜杠后面空一格空格再写注释 + "strict": [ + "error", + "global" + ], // 使用全局严格模式 + "use-isnan": "error", // 禁止比较时使用NaN,只能用isNaN() + "arrow-parens": 0, //箭头函数用小括号括起来 + "arrow-spacing": 0, //=>的前/后括号 + "accessor-pairs": 0, //在对象中使用getter/setter + "block-scoped-var": 0, //块语句中使用var + "brace-style": "off", //大括号风格 + "callback-return": "off", //避免多次调用回调什么的 + "comma-style": [ + "error", + "last" + ], //逗号风格,换行时在行首还是行尾 + "complexity": [ + 0, + 11 + ], //循环复杂度 + "computed-property-spacing": [ + 0, + "never" + ], //是否允许计算后的键名什么的 + "consistent-return": 0, //return 后面是否允许省略 + "consistent-this": "off", //this别名 + "constructor-super": 0, //非派生类不能调用super,派生类必须调用super + "default-case": "off", //switch语句最后必须有default + "dot-location": 0, //对象访问符的位置,换行的时候在行首还是行尾 + "dot-notation": [ + 0, + { + "allowKeywords": true + } + ], //避免不必要的方括号 + "eol-last": 0, //文件以单一的换行符结束 + "func-names": 0, //函数表达式必须有名字 + "func-style": [ + 0, + "declaration" + ], //函数风格,规定只能使用函数声明/函数表达式 + "generator-star-spacing": 0, //生成器函数*的前后空格 + "guard-for-in": 0, //for in循环要用if语句过滤 + "handle-callback-err": 0, //nodejs 处理错误 + "id-length": 0, //变量名长度 + "init-declarations": 0, //声明时必须赋初值 + "lines-around-comment": 0, //行前/行后备注 + "max-depth": [ + 0, + 4 + ], //嵌套块深度 + "max-len": [ + 0, + 80, + 4 + ], //字符串最大长度 + "max-nested-callbacks": [ + 0, + 2 + ], //回调嵌套深度 + "max-params": [ + 0, + 3 + ], //函数最多只能有3个参数 + "max-statements": [ + 0, + 10 + ], //函数内最多有几个声明 + "new-cap": "off", //函数名首行大写必须使用new方式调用,首行小写必须用不带new方式调用 + "newline-after-var": "off", //变量声明后是否需要空一行 + "object-shorthand": 0, //强制对象字面量缩写语法 + "one-var": "off", //连续声明 + "operator-assignment": [ + 0, + "always" + ], //赋值运算符 += -=什么的 + "operator-linebreak": "off", //换行时运算符在行尾还是行首 + "padded-blocks": 0, //块语句内行首行尾是否要空行 + "prefer-spread": 0, //首选展开运算 + "prefer-reflect": 0, //首选Reflect的方法 + "quote-props": "off", //对象字面量中的属性名是否强制双引号 + "radix": "off", //parseInt必须指定第二个参数 + "id-match": 0, //命名检测 + "sort-vars": 0, //变量声明时排序 + "space-after-keywords": [ + 0, + "always" + ], //关键字后面是否要空一格 + "space-before-function-paren": [ + 0, + "always" + ], //函数定义时括号前面要不要有空格 + "space-in-parens": [ + 0, + "never" + ], //小括号里面要不要有空格 + "space-return-throw-case": "off", //return throw case后面要不要加空格 + "spaced-comment": 0, //注释风格不要有空格什么的 + "valid-jsdoc": 0, //jsdoc规则 + "valid-typeof": "error", //必须使用合法的typeof的值 + "vars-on-top": "error", //var必须放在作用域顶部 + "wrap-iife": [ + "error", + "inside" + ], //立即执行函数表达式的小括号风格 + "wrap-regex": 0, //正则表达式字面量用小括号包起来 + "yoda": [ + "error", + "never" + ], //禁止尤达条件 + "linebreak-style": [ + 0, + "windows" + ], //换行风格 + "array-bracket-spacing": [ + 2, + "never" + ], //是否允许非空数组里面有多余的空格 + "react/react-in-jsx-scope": "off", + "camelcase": "off", + "block-spacing": "error", + "no-duplicate-imports": "error", + "require-yield": "off", + "prefer-const": "off", + "object-curly-spacing": [ + "error", + "always" + ], + "react/jsx-curly-spacing": [ + "error", + "never" + ], + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/prefer-namespace-keyword": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/explicit-function-return-type": [ + "off", + { + "allowExpressions": true + } + ], + "@typescript-eslint/typedef": [ + "warn", + { + "arrayDestructuring": false, + "arrowParameter": false, + "objectDestructuring": false, + "memberVariableDeclaration": true, + "parameter": true, + "propertyDeclaration": true, + "variableDeclaration": false, + "variableDeclarationIgnoreFunction": true + } + ] + }, + "settings": { + "import/resolver": { + "typescript": {} + }, + "react": { + "version": "detect" + } + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3611f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +web-mobile +node_modules +build +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +/.vscode +/src/FormTable +/src/FormTable/* +/src/FormTableExt +/src/FormTableExt/* \ No newline at end of file diff --git a/auto-imports.d.ts b/auto-imports.d.ts new file mode 100644 index 0000000..08908ed --- /dev/null +++ b/auto-imports.d.ts @@ -0,0 +1,5 @@ +// Generated by 'unplugin-auto-import' +export {} +declare global { + +} diff --git a/build-templates/favicon.ico b/build-templates/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c66f7c0ba3bc9003fc34495977f5530dc50e15c6 GIT binary patch literal 137165 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 z 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

h%1hPPCHt|Osn{C#npXlrpN7O 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 literal 0 HcmV?d00001 diff --git a/build.cjs b/build.cjs new file mode 100644 index 0000000..c96f55c --- /dev/null +++ b/build.cjs @@ -0,0 +1,124 @@ +//build.js文件 +// let exec = require('child_process').exec // 异步子进程 +let fs = require('fs') +const path = "./build-templates/version.json" +let packageJSON = require(path) +/** package.json文件的version参数 */ +let version = packageJSON.version +// /** 命令行的所有参数 */ +// let options = process.argv +// /** 命令行的type参数 */ +// let type = null +// /** 新的version参数 */ +// let newVersion = null + +const dt = new Date(); +const Year = +((dt.getFullYear() + "")[2] + (dt.getFullYear() + "")[3]); +const Month = +(dt.getMonth() + 1); +const Day = +(dt.getDate()); +let MajorVersion = +(version.MajorVersion); +let MinorVersion = +(version.MinorVersion); +let BuildVersion = +(version.BuildVersion); +let Revision = +(version.Revision); + +if (!MajorVersion || !MinorVersion || !BuildVersion || !Revision || Year != MajorVersion) { + MajorVersion = Year; + MinorVersion = Month; + BuildVersion = Day; + Revision = 1; +} else if (Month != MinorVersion) { + MinorVersion = Month; + BuildVersion = Day; + Revision = 1; +} else if (Day != BuildVersion) { + BuildVersion = Day; + Revision = 1; +} else { + Revision++; +} +var data_new = { + version: { + MajorVersion, + MinorVersion, + BuildVersion, + Revision + } +} +let VersionNew = JSON.stringify(data_new); +console.log(`version: ${MajorVersion}.${MinorVersion}.${BuildVersion}.${Revision}`) +//同步寫入package.json文件 +fs.writeFileSync(path, VersionNew) +return; + + + + + +// //判断命令行是否存在type参数或version参数进行逻辑处理 +// for (let i = 0; i < options.length; i++) { +// if (options[i].indexOf('type') > -1) { +// //存在type参数 +// type = options[i].split('=')[1] +// } else if (options[i].indexOf('version') > -1) { +// //存在version参数 +// newVersion = options[i].split('=')[1] +// } else { +// //code +// } +// } + +// if (newVersion) { +// //存在设置version参数则改变原来的version +// version = newVersion +// } else if (type) { +// //不设置version则根据type来进行修改version +// version = handleType(version, type) +// } else { +// version = null +// console.log('-----------没有改变version-----------') +// } + +// //修改了version则写入 +// if (version) { +// packageJSON.version = version +// //同步写入package.json文件 +// fs.writeFileSync('package.json', JSON.stringify(packageJSON, null, 2)) +// console.log('-----------更新package的version为:%s参数成功-----------', version) +// // handleGitAdd('./package.json') +// // pullRemote() +// } + +// /** +// * 根据分支类型处理版本号version +// * @param {string} oldVersion 旧的版本号 +// * @param {string} type 分支类型 +// * @private +// */ +// function handleType(oldVersion, type) { +// let oldVersionArr = oldVersion.split('.') +// //版本号第一位 如:1.2.3 则为 1 +// let firstNum = +oldVersionArr[0] +// //版本号第二位 如:1.2.3 则为 2 +// let secondNum = +oldVersionArr[1] +// //版本号第三位 如:1.2.3 则为 3 +// let thirdNum = +oldVersionArr[2] +// switch (type) { +// case 'release': +// //release分支的处理逻辑 +// ++secondNum +// thirdNum = 0 +// break + +// case 'hotfix': +// //hotfix分支的处理逻辑 +// ++thirdNum +// break + +// default: +// // 默认按照最小版本处理 +// ++thirdNum +// break +// } + +// return firstNum + '.' + secondNum + '.' + thirdNum +// } \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..756baf9 --- /dev/null +++ b/index.html @@ -0,0 +1,24 @@ + + + + + + + + + 來博娛樂城 + + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..0e4cb97 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8946 @@ +{ + "name": "lp-react", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lp-react", + "version": "0.0.1", + "dependencies": { + "@fortawesome/fontawesome-free": "^6.4.0", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@line/liff": "^2.22.3", + "@types/lodash": "^4.14.197", + "@types/node": "^20.2.5", + "antd": "^5.11.3", + "axios": "^1.5.0", + "bootstrap": "^5.3.0", + "breakpoint-sass": "^3.0.0", + "buffer": "^6.0.3", + "classnames": "^2.3.2", + "date-fns": "^2.30.0", + "dayjs": "^1.11.9", + "eslint-import-resolver-typescript": "^3.6.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-unused-imports": "^3.0.0", + "events": "^3.3.0", + "firebase": "^10.5.2", + "gsap": "^3.12.2", + "immer": "^9.0.21", + "lodash": "^4.17.21", + "lz-string": "^1.5.0", + "miragejs": "^0.1.47", + "moment": "^2.29.4", + "nosleep.js": "^0.12.0", + "numeral": "^2.0.6", + "path": "^0.12.7", + "pure-react-carousel": "^1.30.1", + "react": "^18.2.0", + "react-countdown": "^2.3.5", + "react-device-detect": "^2.2.3", + "react-dom": "^18.2.0", + "react-draggable": "^4.4.5", + "react-fast-marquee": "^1.6.0", + "react-fitty": "^1.0.1", + "react-iframe": "^1.8.5", + "react-infinite-scroll-component": "^6.1.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.15.0", + "react-scroll": "^1.8.9", + "react-spinners": "^0.13.8", + "react-timer-hook": "^3.0.7", + "react-use": "^17.4.0", + "rxjs": "^7.8.1", + "sass": "^1.66.1", + "string-width": "^6.1.0", + "styled-components": "^5.3.6", + "swiper": "^8.4.5", + "ts-key-enum": "^2.0.12", + "use-immer": "^0.9.0", + "use-onclickoutside": "^0.4.1", + "use-reducer-async": "^2.1.1", + "uuid": "^9.0.0", + "vconsole": "^3.15.1" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@types/styled-components": "^5.1.26", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "typescript": "^5.0.2", + "vite": "^4.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-7.0.0.tgz", + "integrity": "sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/cssinjs": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-1.17.5.tgz", + "integrity": "sha512-Ed2rruHMxZTVYGPec6QBZkrh00Df5K1FAufmBpONai5iGYxoxIkg1sRD8YdCw0NvPRAa4r1nJP5LbwICGHzGiQ==", + "dependencies": { + "@babel/runtime": "^7.11.1", + "@emotion/hash": "^0.8.0", + "@emotion/unitless": "^0.7.5", + "classnames": "^2.3.1", + "csstype": "^3.0.10", + "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.2.6", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-5.2.6.tgz", + "integrity": "sha512-4wn0WShF43TrggskBJPRqCD0fcHbzTYjnaoskdiJrVHg86yxoZ8ZUqsXvyn4WUqehRiFKnaclOhqk9w4Ui2KVw==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/icons-svg": "^4.3.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.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", + "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" + }, + "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==", + "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/@ant-design/react-slick/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==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz", + "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.11", + "@babel/parser": "^7.22.11", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11", + "convert-source-map": "^1.7.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==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dependencies": { + "@babel/types": "^7.22.10", + "@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==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "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==", + "peer": true, + "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==", + "peer": true, + "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==", + "peer": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "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==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.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==", + "peer": true, + "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==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz", + "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==", + "peer": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.11", + "@babel/types": "^7.22.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.13.tgz", + "integrity": "sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz", + "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz", + "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==", + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.11", + "@babel/types": "^7.22.11", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz", + "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + }, + "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==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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==", + "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.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@firebase/analytics": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", + "integrity": "sha512-Locv8gAqx0e+GX/0SI3dzmBY5e9kjVDtD+3zCFLJ0tH2hJwuCAiL+5WkHuxKj92rqQj/rvkBUCfA1ewlX2hehg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz", + "integrity": "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q==", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-types": "0.8.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.0.tgz", + "integrity": "sha512-iRP+QKI2+oz3UAh4nPEq14CsEjrjD6a5+fuypjScisAh9kXKFvdJOZJDwk7kikLvWVLGEs9+kIUS4LPQV7VZVw==" + }, + "node_modules/@firebase/app": { + "version": "0.9.22", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.9.22.tgz", + "integrity": "sha512-4hbUg9ojPbn4Gj21Z/GnJbiLQYOzkwBDFT5vBkQgUJJGS28qQLG6eZZ1DwLKh8lcrNJc4MR90OPaJWhSzJCR2w==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "idb": "7.1.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.8.0.tgz", + "integrity": "sha512-dRDnhkcaC2FspMiRK/Vbp+PfsOAEP6ZElGm9iGFJ9fDqHoPs0HOPn7dwpJ51lCFi1+2/7n5pRPGhqF/F03I97g==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.3.7.tgz", + "integrity": "sha512-cW682AxsyP1G+Z0/P7pO/WT2CzYlNxoNe5QejVarW2o5ZxeWSSPAiVEwpEpQR/bUlUmdeWThYTMvBWaopdBsqw==", + "dependencies": { + "@firebase/app-check": "0.8.0", + "@firebase/app-check-types": "0.5.0", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.0.tgz", + "integrity": "sha512-xAxHPZPIgFXnI+vb4sbBjZcde7ZluzPPaSK7Lx3/nmuVk4TjZvnL8ONnkd4ERQKL8WePQySU+pRcWkh8rDf5Sg==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.0.tgz", + "integrity": "sha512-uwSUj32Mlubybw7tedRzR24RP8M8JUVR3NPiMk3/Z4bCmgEKTlQBwMXrehDAZ2wF+TsBq0SN1c6ema71U/JPyQ==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.22.tgz", + "integrity": "sha512-kyksJFA19Oz5HZmR56s/ziOM6ivDBF9JYwC0ufacooYNd2sQ3pRsi5MZAYb1FR9hCE7MgoHuPmTtBHA7S/Cv8g==", + "dependencies": { + "@firebase/app": "0.9.22", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.0.tgz", + "integrity": "sha512-AeweANOIo0Mb8GiYm3xhTEBVCmPwTYAu9Hcd2qSkLuga/6+j9b1Jskl5bpiSQWy9eJ/j5pavxj6eYogmnuzm+Q==" + }, + "node_modules/@firebase/auth": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.3.2.tgz", + "integrity": "sha512-ksYpeRACL8INRpFZzbCLLnI9NP+L3UH/+ebKo4oBjhc/dSwPbpw6E1wjdm0odB1U5xHhXD/5lpyeFQZ+jXyBxA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@react-native-async-storage/async-storage": "^1.18.1" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + } + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.4.8.tgz", + "integrity": "sha512-qKX8BOl1qewBzpfAXl6/lKPW7fjnY8/3umiSFIGO8SHwLQ3LsAdNFPdwafouwMiKLo5MXxW4XdxNSI4ilt0Z5w==", + "dependencies": { + "@firebase/auth": "1.3.2", + "@firebase/auth-types": "0.12.0", + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.1.tgz", + "integrity": "sha512-VOaGzKp65MY6P5FI84TfYKBXEPi6LmOCSMMzys6o2BN2LOsqy7pCuZCup7NYnfbk5OkkQKzvIfHOzTm0UDpkyg==" + }, + "node_modules/@firebase/auth-types": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.12.0.tgz", + "integrity": "sha512-pPwaZt+SPOshK8xNoiQlK5XIrS97kFYc3Rc7xmy373QsOJ9MmqXxLaYssP5Kcds4wd2qK//amx/c+A8O2fVeZA==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.6.4.tgz", + "integrity": "sha512-rLMyrXuO9jcAUCaQXCMjCMUsWrba5fzHlNK24xz5j2W6A/SRmK8mZJ/hn7V0fViLbxC0lPMtrK1eYzk6Fg03jA==", + "dependencies": { + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.0.1.tgz", + "integrity": "sha512-VAhF7gYwunW4Lw/+RQZvW8dlsf2r0YYqV9W0Gi2Mz8+0TGg1mBJWoUtsHfOr8kPJXhcLsC4eP/z3x6L/Fvjk/A==", + "dependencies": { + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-1.0.1.tgz", + "integrity": "sha512-ky82yLIboLxtAIWyW/52a6HLMVTzD2kpZlEilVDok73pNPLjkJYowj8iaIWK5nTy7+6Gxt7d00zfjL6zckGdXQ==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/database": "1.0.1", + "@firebase/database-types": "1.0.0", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.0.tgz", + "integrity": "sha512-SjnXStoE0Q56HcFgNQ+9SsmJc0c8TqGARdI/T44KXy+Ets3r6x/ivhQozT66bMnCEjJRywYoxNurRTMlZF8VNg==", + "dependencies": { + "@firebase/app-types": "0.9.0", + "@firebase/util": "1.9.3" + } + }, + "node_modules/@firebase/firestore": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.3.2.tgz", + "integrity": "sha512-K4TwMbgArWw+XAEUYX/vtk+TVy9n1uLeJKSrQeb89lwfkfyFINGLPME6YleaS0ovD1ziLM5/0WgL1CR4s53fDg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "@firebase/webchannel-wrapper": "0.10.3", + "@grpc/grpc-js": "~1.9.0", + "@grpc/proto-loader": "^0.7.8", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.3.21.tgz", + "integrity": "sha512-u17so8cP4FQBEJyivAbZc0kW09YBXBvhSmUXiB7swkOLemfZUmmPZQGJxZGa9y/M02euU1y4EzvWN/h/bkx8pg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/firestore": "4.3.2", + "@firebase/firestore-types": "3.0.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.0.tgz", + "integrity": "sha512-Meg4cIezHo9zLamw0ymFYBD4SMjLb+ZXIbuN7T7ddXN6MGoICmOTq3/ltdCGoDCS2u+H1XJs2u/cYp75jsX9Qw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.10.0.tgz", + "integrity": "sha512-2U+fMNxTYhtwSpkkR6WbBcuNMOVaI7MaH3cZ6UAeNfj7AgEwHwMIFLPpC13YNZhno219F0lfxzTAA0N62ndWzA==", + "dependencies": { + "@firebase/app-check-interop-types": "0.3.0", + "@firebase/auth-interop-types": "0.2.1", + "@firebase/component": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.3.5.tgz", + "integrity": "sha512-uD4jwgwVqdWf6uc3NRKF8cSZ0JwGqSlyhPgackyUPe+GAtnERpS4+Vr66g0b3Gge0ezG4iyHo/EXW/Hjx7QhHw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/functions": "0.10.0", + "@firebase/functions-types": "0.6.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.0.tgz", + "integrity": "sha512-hfEw5VJtgWXIRf92ImLkgENqpL6IWpYaXVYiRkFY1jJ9+6tIhWM7IzzwbevwIIud/jaxKVdRzD7QBWfPmkwCYw==" + }, + "node_modules/@firebase/installations": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.4.tgz", + "integrity": "sha512-u5y88rtsp7NYkCHC3ElbFBrPtieUybZluXyzl7+4BsIz4sqb4vSAuwHEUgCgCeaQhvsnxDEU6icly8U9zsJigA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.4.tgz", + "integrity": "sha512-LI9dYjp0aT9Njkn9U4JRrDqQ6KXeAmFbRC0E7jI7+hxl5YmRWysq5qgQl22hcWpTk+cm3es66d/apoDU/A9n6Q==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/installations-types": "0.5.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.0.tgz", + "integrity": "sha512-9DP+RGfzoI2jH7gY4SlzqvZ+hr7gYzPODrbzVD82Y12kScZ6ZpRg/i3j6rleto8vTFC8n6Len4560FnV1w2IRg==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, + "node_modules/@firebase/logger": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.4.0.tgz", + "integrity": "sha512-eRKSeykumZ5+cJPdxxJRgAC3G5NknY2GwEbKfymdnXtnT0Ucm4pspfR6GT4MUQEDuJwRVbVcSx85kgJulMoFFA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.4.tgz", + "integrity": "sha512-6JLZct6zUaex4g7HI3QbzeUrg9xcnmDAPTWpkoMpd/GoSVWH98zDoWXMGrcvHeCAIsLpFMe4MPoZkJbrPhaASw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/messaging-interop-types": "0.2.0", + "@firebase/util": "1.9.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.4.tgz", + "integrity": "sha512-lyFjeUhIsPRYDPNIkYX1LcZMpoVbBWXX4rPl7c/rqc7G+EUea7IEtSt4MxTvh6fDfPuzLn7+FZADfscC+tNMfg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/messaging": "0.12.4", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.0.tgz", + "integrity": "sha512-ujA8dcRuVeBixGR9CtegfpU4YmZf3Lt7QYkcj693FFannwNuZgfAYaTmbJ40dtjB81SAu6tbFPL9YLNT15KmOQ==" + }, + "node_modules/@firebase/messaging/node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, + "node_modules/@firebase/performance": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.6.4.tgz", + "integrity": "sha512-HfTn/bd8mfy/61vEqaBelNiNnvAbUtME2S25A67Nb34zVuCSCRIX4SseXY6zBnOFj3oLisaEqhVcJmVPAej67g==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.4.tgz", + "integrity": "sha512-nnHUb8uP9G8islzcld/k6Bg5RhX62VpbAb/Anj7IXs/hp32Eb2LqFPZK4sy3pKkBUO5wcrlRWQa6wKOxqlUqsg==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/performance": "0.6.4", + "@firebase/performance-types": "0.2.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.0.tgz", + "integrity": "sha512-kYrbr8e/CYr1KLrLYZZt2noNnf+pRwDq2KK9Au9jHrBMnb0/C9X9yWSXmZkFt4UIdsQknBq8uBB7fsybZdOBTA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.4.4.tgz", + "integrity": "sha512-x1ioTHGX8ZwDSTOVp8PBLv2/wfwKzb4pxi0gFezS5GCJwbLlloUH4YYZHHS83IPxnua8b6l0IXUaWd0RgbWwzQ==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/installations": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.4.tgz", + "integrity": "sha512-FKiki53jZirrDFkBHglB3C07j5wBpitAaj8kLME6g8Mx+aq7u9P7qfmuSRytiOItADhWUj7O1JIv7n9q87SuwA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/logger": "0.4.0", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-types": "0.3.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.3.0.tgz", + "integrity": "sha512-RtEH4vdcbXZuZWRZbIRmQVBNsE7VDQpet2qFvq6vwKLBIQRQR5Kh58M4ok3A3US8Sr3rubYnaGqZSurCwI8uMA==" + }, + "node_modules/@firebase/storage": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.11.2.tgz", + "integrity": "sha512-CtvoFaBI4hGXlXbaCHf8humajkbXhs39Nbh6MbNxtwJiCqxPy9iH3D3CCfXAvP0QvAAwmJUTK3+z9a++Kc4nkA==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/util": "1.9.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.3.2.tgz", + "integrity": "sha512-wvsXlLa9DVOMQJckbDNhXKKxRNNewyUhhbXev3t8kSgoCotd1v3MmqhKKz93ePhDnhHnDs7bYHy+Qa8dRY6BXw==", + "dependencies": { + "@firebase/component": "0.6.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-types": "0.8.0", + "@firebase/util": "1.9.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.0.tgz", + "integrity": "sha512-isRHcGrTs9kITJC0AVehHfpraWFui39MPaU7Eo8QfWlqW7YPymBmRgjDrlOgFdURh6Cdeg07zmkLP5tzTKRSpg==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.9.3.tgz", + "integrity": "sha512-DY02CRhOZwpzO36fHpuVysz6JZrscPiBXD0fXp6qSrL9oNOx5KWICKdR95C0lSITzxp0TZosVyHqzatE8JbcjA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.10.3.tgz", + "integrity": "sha512-+ZplYUN3HOpgCfgInqgdDAbkGGVzES1cs32JJpeqoh87SkRobGXElJx+1GZSaDqzFL+bYiX18qEcBK76mYs8uA==" + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.2.tgz", + "integrity": "sha512-m5cPn3e2+FDCOgi1mz0RexTUvvQibBebOUlUlW0+YrMjDTPkiJ6VTKukA1GRsvRw+12KyJndNjj0O4AgTxm2Pg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.9.tgz", + "integrity": "sha512-vQ1qwi/Kiyprt+uhb1+rHMpyk4CVRMTGNUGGPRGS7pLNfWkdCHrGEnT6T3/JyC2VZgoOX/X1KwdoU0WYQAeYcQ==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "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==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@liff/add-to-home-screen": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/add-to-home-screen/-/add-to-home-screen-2.22.3.tgz", + "integrity": "sha512-JsR/O6iXVs+XajQ02Ut6nKFIr0sirLx8QZ+7Atqro7ujhCG87JbTScvRXwk6SWLL/F0SJiKqzI1K1if59L8dBg==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/open-window": "2.22.3", + "@liff/types": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/analytics": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/analytics/-/analytics-2.22.3.tgz", + "integrity": "sha512-0mqdut+1oSn36umyNk75pGy9pM3D5JO3z7SWfbnWmcgZ9AU7mfiQ2uiAIVXeE8TInV7NzkT6PvzQjRss6rteDg==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/core": "2.22.3", + "@liff/get-profile": "2.22.3", + "@liff/get-version": "2.22.3", + "@liff/is-logged-in": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/store": "2.22.3", + "@liff/types": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/check-availability": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/check-availability/-/check-availability-2.22.3.tgz", + "integrity": "sha512-TOw7r3m5xoPGWvr9SArBBNFRKfvmk1I60jRoEFFl73mQpIfYo1PTSTv/zk+2gczUf0k6OZ9L/p9C9JygJbBbBA==", + "dependencies": { + "@liff/get-version": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/types": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/close-window": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/close-window/-/close-window-2.22.3.tgz", + "integrity": "sha512-jldtGdBjOlCKVVjFIMPrfIBt2bFAVYFId1Bf0Cqgfb+Y1ZdFpUow2fZIZulbmKBIafebtf7oEU8LalpaSNKm1Q==", + "dependencies": { + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/native-bridge": "2.22.3", + "@liff/types": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/consts": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/consts/-/consts-2.22.3.tgz", + "integrity": "sha512-e7L6S+uCaJkLwNcxOvV/5N2VgIaztNeADXFr2ABtv/1bJGxSWOIoV0yQ4fK3vBgfE6gDLAEPOahFaTvD8t7Xcg==", + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/core": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/core/-/core-2.22.3.tgz", + "integrity": "sha512-tP05ycQKKI/CtCrTNiNJwmnu7VntLT9EPdXKf/tiuUsnuLjHqItNBrzD5hkCMGojIIfCupcRlz6oaTF21kM9qQ==", + "dependencies": { + "@liff/get-version": "2.22.3", + "@liff/init": "2.22.3", + "@liff/native-bridge": "2.22.3", + "@liff/ready": "2.22.3", + "@liff/store": "2.22.3", + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/extensions": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/extensions/-/extensions-2.22.3.tgz", + "integrity": "sha512-x4xOFcEBbG/hhEqsK00G+ts8j1LvaoQaUfHAAT9GlPtJimeQJxL4DAf+jS/tVGKxCXVVVvNZ3HFxusr5gdBdmA==", + "dependencies": { + "@liff/add-to-home-screen": "2.22.3", + "@liff/check-availability": "2.22.3", + "@liff/consts": "2.22.3", + "@liff/get-advertising-id": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/scan-code": "2.22.3", + "@liff/store": "2.22.3", + "@liff/types": "2.22.3", + "@liff/util": "2.22.3" + } + }, + "node_modules/@liff/get-advertising-id": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/get-advertising-id/-/get-advertising-id-2.22.3.tgz", + "integrity": "sha512-w1gXVxF+MMscr1I7/BuuizdsKlo1tf6MxO0t2cHNQ6/vJqbH1lo6ZancrH5Pp9lNhRfC7tvzzgbuG3cQtH5Gqw==", + "dependencies": { + "@liff/types": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/get-friendship": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/get-friendship/-/get-friendship-2.22.3.tgz", + "integrity": "sha512-KuQRePDNhLMa3tWYpi7wuNHWpk164tuO2KpHegffOMG+DsMZBo6+8ivuL/S6FClYSp+rz9tL9GJNei/5rTfrjA==", + "dependencies": { + "@liff/permission": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/get-language": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/get-language/-/get-language-2.22.3.tgz", + "integrity": "sha512-5wX0EY1u3W4wjfiGEgi6KWGdUsNWB5BRF6Q1AmqTyEgNBg0f2Ve+K11/SxSURe16x1/1h8bHF4gwXyjXKn9VWw==", + "dependencies": { + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/get-line-version": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/get-line-version/-/get-line-version-2.22.3.tgz", + "integrity": "sha512-qd7i86O1MPO/CHf5Upt+dTs67jYgr6U8BM7zSiu/Q2fYeDHKgDW3P84V/yYJ+sPEoTadLYSgMn8cISvrI8iuLw==", + "dependencies": { + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/get-os": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/get-os/-/get-os-2.22.3.tgz", + "integrity": "sha512-70e/KJSdWAf0wQWi7790uhZrBlfBS59uaZ3tfJXHVXt+DjPrpKwnKiqjytdR6WgIZzSHuL2gI3lYJy6E7f+1wg==", + "dependencies": { + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/get-profile": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/get-profile/-/get-profile-2.22.3.tgz", + "integrity": "sha512-g7zPjKDTPxVc+Y3qabKcCzauHfTrVbgBKdMej0MO4eMXSOQ7+VRKhVwMkWaJ/scJGXikj9sV1LFbaONQqMVxeQ==", + "dependencies": { + "@liff/permission": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/get-version": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/get-version/-/get-version-2.22.3.tgz", + "integrity": "sha512-FCTjPOzR18r1mKjsKr4gyvPHwZjt0m0Qvtw3qv7cXbnTc58ZoovE6CCSbdGnxLz1daf9Qtji4KCa1dJ2xIjr8Q==", + "dependencies": { + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/hooks": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/hooks/-/hooks-2.22.3.tgz", + "integrity": "sha512-hIEpOah32Mx/B9h2HKY+DVHwI+IAqwbDSsfIwJtAU6jvA6gdvEOkk5Rcmx1ehl06aWGt2O/uTk9D5haNwdHwXA==", + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/i18n": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/i18n/-/i18n-2.22.3.tgz", + "integrity": "sha512-AGyb0G3W1LQ6hPJcay0iskk3hXUuQSTIf98+bRaDKs2YR4UwEr7ps1ul538Mr9vOuNQo6HlVmf5PPW9mC9WRiw==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/init": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/init/-/init-2.22.3.tgz", + "integrity": "sha512-k0X50vrp+DBHgUHJjVE0uE7kGdzc+1iJ5xvMJxkeeN4MVURRaPpkDXrysi/uEKveHF41Z15f/KH28m/mdibCXg==", + "dependencies": { + "@liff/check-availability": "2.22.3", + "@liff/close-window": "2.22.3", + "@liff/consts": "2.22.3", + "@liff/extensions": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/hooks": "2.22.3", + "@liff/i18n": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/is-logged-in": "2.22.3", + "@liff/is-sub-window": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/login": "2.22.3", + "@liff/logout": "2.22.3", + "@liff/message-bus": "2.22.3", + "@liff/native-bridge": "2.22.3", + "@liff/ready": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/store": "2.22.3", + "@liff/sub-window": "2.22.3", + "@liff/types": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/is-api-available": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/is-api-available/-/is-api-available-2.22.3.tgz", + "integrity": "sha512-+BI2OVKDm41L4SKmfDNtP+4AuVwJ63mIF7Dw37IMHQy07QLyIpKLLI548FzwqaA+3dDOSpCZEv0ubAkOE+5l5Q==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/is-logged-in": "2.22.3", + "@liff/is-sub-window": "2.22.3", + "@liff/store": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/is-in-client": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/is-in-client/-/is-in-client-2.22.3.tgz", + "integrity": "sha512-DOO4RFz0x3vhL4ysa9kekYtSwaSQI4x1dB8dQ4vUYk62XGWfnl/kzoxwK98E+ecNvBPSbCgAKSfqkWZn8efEXw==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/is-logged-in": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/is-logged-in/-/is-logged-in-2.22.3.tgz", + "integrity": "sha512-4AS3uMjBj9OtuCkpNOcl5MKBW4aCxi2eQPnb25mFc3WVwu+60lGdIqYOfL6w+lmu8XbDHMDuB+9uRKnBNjNslQ==", + "dependencies": { + "@liff/store": "2.22.3", + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/is-sub-window": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/is-sub-window/-/is-sub-window-2.22.3.tgz", + "integrity": "sha512-XqFvCRUSkw/dNkuX5b8BJwY2ZyAeQDKFh11WD1q7V3K3FC4VhhzC0dRourw49SEAqsiAj17bcNW85FtN0v4+3g==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/store": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/liff-types": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/liff-types/-/liff-types-2.22.3.tgz", + "integrity": "sha512-KPgJIp9ND+ieRHf3I+CBFBjGYLCt3HbXenr5WqlUuPFRtHGX6mqt0Md/8ZwEcCIBB7/I2q0z6C6UlLIYsdu2NQ==", + "dependencies": { + "@liff/analytics": "2.22.3", + "@liff/close-window": "2.22.3", + "@liff/get-friendship": "2.22.3", + "@liff/get-language": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/get-profile": "2.22.3", + "@liff/get-version": "2.22.3", + "@liff/i18n": "2.22.3", + "@liff/init": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/is-logged-in": "2.22.3", + "@liff/is-sub-window": "2.22.3", + "@liff/login": "2.22.3", + "@liff/logout": "2.22.3", + "@liff/native-bridge": "2.22.3", + "@liff/open-window": "2.22.3", + "@liff/permanent-link": "2.22.3", + "@liff/permission": "2.22.3", + "@liff/ready": "2.22.3", + "@liff/scan-code-v2": "2.22.3", + "@liff/send-messages": "2.22.3", + "@liff/share-target-picker": "2.22.3", + "@liff/store": "2.22.3", + "@liff/sub-window": "2.22.3", + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/logger": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/logger/-/logger-2.22.3.tgz", + "integrity": "sha512-AwZfgI5Eg8zeFfiO8S4ly33puQYMiiUGWH2/bkUtFap5sPdrsut7FIbCNNDaGm9GpVPME7moeUlf6YrpIjieIQ==", + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/login": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/login/-/login-2.22.3.tgz", + "integrity": "sha512-LD4W+qCsbehLPQyoMgznTeUMN2RVvW+Pv3NY2mIEJ3jlj9AwrUWhEb6+Y9bArQw6nl269RbS9Fg842H0iaQLPQ==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/get-version": "2.22.3", + "@liff/hooks": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/is-sub-window": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/store": "2.22.3", + "@liff/sub-window": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3", + "tiny-sha256": "^1.0.2" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/logout": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/logout/-/logout-2.22.3.tgz", + "integrity": "sha512-aFar9jlOwg+jjmxNoIw5F62lLO9H1UwVCk/NYumi6kM5QuruuAHbwKTPmYWMNNDF5D9/+lRG/LGTstmwFFFVBw==", + "dependencies": { + "@liff/store": "2.22.3", + "@liff/use": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/message-bus": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/message-bus/-/message-bus-2.22.3.tgz", + "integrity": "sha512-CR/E1Fkh+mWEx7+vk0u4QLwFPUlE9doDm/twKkkmdYkWbzDSNid+Hg2ifwABT0/hOgi5Z8BWqBz/B5b39sqGUw==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/store": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/native-bridge": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/native-bridge/-/native-bridge-2.22.3.tgz", + "integrity": "sha512-q1GHTdAj0zt7a4fW224fXUa9aWMIlo/7zj6oZ+yGhPajiMsm/CTq0Zz7QBX8H2e699ScBSvjskqOzP+Dvp4APg==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/store": "2.22.3", + "@liff/types": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/open-window": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/open-window/-/open-window-2.22.3.tgz", + "integrity": "sha512-xtPy+v8rRvnaSzXhTDfl/GdeMCIvz3xd0AI5RjlQ/+XQR8zPz8JG4qUPMk4W9mUFrUCwE19BBbnk2pm9YeZN2Q==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/native-bridge": "2.22.3", + "@liff/types": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/permanent-link": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/permanent-link/-/permanent-link-2.22.3.tgz", + "integrity": "sha512-ZyHy6RnSVPqUtRiljEt8G86AXzYMCde7Xrpr/Ncrao6Sb6wQ7cPNLkIMYgvKUluqNtmwP5nsFBR8rkqAPFdsag==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/store": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/permission": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/permission/-/permission-2.22.3.tgz", + "integrity": "sha512-j96QmxPxyI2A7ResOY5jnloUHLb+3hAuW0oc5ZYK1RHumsm1gATvESe7u+s5hYOhQ5mhXLY6WLVXpLcj8YB8sA==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/store": "2.22.3", + "@liff/sub-window": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/ready": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/ready/-/ready-2.22.3.tgz", + "integrity": "sha512-4W9vyTDOksNAN9/h+NV1+2peUK48AE06FsZ2YTgFGQ6Z0ct0iq3wyZHaw4BzDb4zEzMt1yfUoodKb92c09T86g==", + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/scan-code": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/scan-code/-/scan-code-2.22.3.tgz", + "integrity": "sha512-HnIOTIsBDxs6+hcqNAJgj5NCkrexcD4K+4GhLxVSumYp2h640nEVYcs8x+DqIwQZa/ShHwE06mBL95p2SA4/0Q==", + "dependencies": { + "@liff/types": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/scan-code-v2": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/scan-code-v2/-/scan-code-v2-2.22.3.tgz", + "integrity": "sha512-kviiLAS5FHzXkZNLYr0akZuuLpA1ETSENsiV5eqALUyNH2l0XguEoqNs1TA77jIdUHj4g8EAZeQ0s12jsDZnaA==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/sub-window": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/send-messages": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/send-messages/-/send-messages-2.22.3.tgz", + "integrity": "sha512-znBxydpZfPKEjnl8dgC8CIXETxgSc1zWd5VDRmItADhJT/C9hHVNp8+QMccTiv8VZHH6hQqAnlljhxb3y1KfHw==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/permission": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3", + "@line/bot-sdk": "^7.0.0" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/server-api": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/server-api/-/server-api-2.22.3.tgz", + "integrity": "sha512-Z7SXZtSiTpOp9V5f4Rej8BDiqlPRrzF+Xxx7rPC3n6WO7asHq9GdpnGYm6lwlf7oVgNbY6T1xJC33lXR8Pk9Sg==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/store": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/share-target-picker": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/share-target-picker/-/share-target-picker-2.22.3.tgz", + "integrity": "sha512-gUDyX4wp2EtgW2wk260CVm3tLaIBZamqQD44zvD3d3079sNXXvfXwj3hRILlUp39jFBTGdemt4nDy+ZE8VpytA==", + "dependencies": { + "@liff/analytics": "2.22.3", + "@liff/consts": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/is-logged-in": "2.22.3", + "@liff/is-sub-window": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/send-messages": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/store": "2.22.3", + "@liff/types": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3", + "@liff/window-postmessage": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/store": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/store/-/store-2.22.3.tgz", + "integrity": "sha512-8DHjpqAvDVrqkA8CMGCtOj/ZO+/dNHCjr1dYMOjHeEpjjf6iGTHym+UGnRYxj8zMSBDk+ujAhdw8Y8dNKm4/aQ==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/types": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/sub-window": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/sub-window/-/sub-window-2.22.3.tgz", + "integrity": "sha512-uwi4HizVCcyZ1eIE+un6U0aIgsHvDvYnpdA8s12iOJ3FCbMBQH5fEfsAJLj+32+KXRWhbEF0U5MGA7E5iBWNGg==", + "dependencies": { + "@liff/close-window": "2.22.3", + "@liff/consts": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/is-sub-window": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/message-bus": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/store": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/types": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/types/-/types-2.22.3.tgz", + "integrity": "sha512-fWff3gSuwWpdAgFG1HrbPjwaADat5YJkErm3k+m9uH99uZ3FmufBR0MeM6kFUttixOEnZAKjHDj2BIrQ8PC+Dw==" + }, + "node_modules/@liff/use": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/use/-/use-2.22.3.tgz", + "integrity": "sha512-C5M2M4ihDP8sIQc28F2NWIr8wsbdHRZ03qv1PcBKoCYlQoJSkyTAbNrzy5anhGSVTTRiR2gAqkcwTRm5cI+rxA==", + "dependencies": { + "@liff/hooks": "2.22.3", + "@liff/logger": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/util": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/util/-/util-2.22.3.tgz", + "integrity": "sha512-1QLw1pY4BH7LbQyBNpQmFW3eZYGG0pPS4msZYPOQd7J8gq/ENRYmkhxR5BkKYcGUAWD8T9FYeMEyKIGm0OVhbA==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/logger": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@liff/window-postmessage": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@liff/window-postmessage/-/window-postmessage-2.22.3.tgz", + "integrity": "sha512-WHbTysbLlPAEpEedYnU6ttTg0B54T9urJ64piRByrjfZ7w1DKdS7c34AcyvpNeG0JwZ3wyxaPLms6kjCFOXaVg==", + "dependencies": { + "@liff/consts": "2.22.3", + "@liff/logger": "2.22.3", + "@liff/util": "2.22.3" + }, + "peerDependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/@line/bot-sdk": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@line/bot-sdk/-/bot-sdk-7.5.2.tgz", + "integrity": "sha512-mMaDnr+mOqQDLYJcUp+fQwZklg/LoOZzNILlWdsj2IFD2nXF+HhAm3KEy5tyUx629Y2bCx6nv9Jl0UlMwBiAiw==", + "dependencies": { + "@types/body-parser": "^1.19.2", + "@types/node": "^16.0.0", + "axios": "^0.27.0", + "body-parser": "^1.20.0", + "file-type": "^16.5.4", + "form-data": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@line/bot-sdk/node_modules/@types/node": { + "version": "16.18.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.46.tgz", + "integrity": "sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg==" + }, + "node_modules/@line/bot-sdk/node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@line/liff": { + "version": "2.22.3", + "resolved": "https://registry.npmjs.org/@line/liff/-/liff-2.22.3.tgz", + "integrity": "sha512-wRNvH7jgqlKjPT+tn17sdoYAA28W9TOFShOzOiJhJhYYIg4/wmVKDMquTi7kKBFZZT4eum7TLX9lTcSn24tAzw==", + "dependencies": { + "@liff/analytics": "2.22.3", + "@liff/close-window": "2.22.3", + "@liff/consts": "2.22.3", + "@liff/core": "2.22.3", + "@liff/extensions": "2.22.3", + "@liff/get-friendship": "2.22.3", + "@liff/get-language": "2.22.3", + "@liff/get-line-version": "2.22.3", + "@liff/get-os": "2.22.3", + "@liff/get-profile": "2.22.3", + "@liff/get-version": "2.22.3", + "@liff/hooks": "2.22.3", + "@liff/i18n": "2.22.3", + "@liff/init": "2.22.3", + "@liff/is-api-available": "2.22.3", + "@liff/is-in-client": "2.22.3", + "@liff/is-logged-in": "2.22.3", + "@liff/is-sub-window": "2.22.3", + "@liff/liff-types": "2.22.3", + "@liff/login": "2.22.3", + "@liff/logout": "2.22.3", + "@liff/native-bridge": "2.22.3", + "@liff/open-window": "2.22.3", + "@liff/permanent-link": "2.22.3", + "@liff/permission": "2.22.3", + "@liff/ready": "2.22.3", + "@liff/scan-code-v2": "2.22.3", + "@liff/send-messages": "2.22.3", + "@liff/server-api": "2.22.3", + "@liff/share-target-picker": "2.22.3", + "@liff/store": "2.22.3", + "@liff/sub-window": "2.22.3", + "@liff/use": "2.22.3", + "@liff/util": "2.22.3", + "tslib": "^2.3.0", + "whatwg-fetch": "^3.0.0" + } + }, + "node_modules/@miragejs/pretender-node-polyfill": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@miragejs/pretender-node-polyfill/-/pretender-node-polyfill-0.1.2.tgz", + "integrity": "sha512-M/BexG/p05C5lFfMunxo/QcgIJnMT2vDVCd00wNqK2ImZONIlEETZwWJu1QtLxtmYlSHlCFl3JNzp0tLe7OJ5g==" + }, + "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==", + "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==", + "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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@rc-component/color-picker": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-1.4.1.tgz", + "integrity": "sha512-vh5EWqnsayZa/JwUznqDaPJz39jznx/YDbyBuVJntv735tKXKwEUZZb2jYEldOg+NKWZwtALjGMrNeGBmqFoEw==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@ctrl/tinycolor": "^3.6.0", + "classnames": "^2.2.6", + "rc-util": "^5.30.0" + }, + "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==", + "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==", + "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==", + "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==", + "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.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-1.10.0.tgz", + "integrity": "sha512-voV0BKaTJbewB9LLgAHQ7tAGG7rgDkKQkZo82xw2gIk542hY+o7zwoqdN16oHhIKk7eG/xi+mdXrONT62Dt57A==", + "dependencies": { + "@babel/runtime": "^7.18.0", + "@rc-component/portal": "^1.0.0-9", + "@rc-component/trigger": "^1.3.6", + "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": "1.18.2", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-1.18.2.tgz", + "integrity": "sha512-jRLYgFgjLEPq3MvS87fIhcfuywFSRDaDrYw1FLku7Cm4esszvzTbA0JBsyacAyLrK9rF3TiHFcvoEDMzoD3CTA==", + "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/@remix-run/router": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", + "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@swc/core": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.80.tgz", + "integrity": "sha512-yX2xV5I/lYswHHR+44TPvzBgq3/Y8N1YWpTQADYuvSiX3Jxyvemk5Jpx3rRtigYb8WBkWAAf2i5d5ZJ2M7hhgw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/types": "^0.1.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.3.80", + "@swc/core-darwin-x64": "1.3.80", + "@swc/core-linux-arm-gnueabihf": "1.3.80", + "@swc/core-linux-arm64-gnu": "1.3.80", + "@swc/core-linux-arm64-musl": "1.3.80", + "@swc/core-linux-x64-gnu": "1.3.80", + "@swc/core-linux-x64-musl": "1.3.80", + "@swc/core-win32-arm64-msvc": "1.3.80", + "@swc/core-win32-ia32-msvc": "1.3.80", + "@swc/core-win32-x64-msvc": "1.3.80" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.80.tgz", + "integrity": "sha512-rhoFTcQMUGfO7IkfOnopPSF6O0/aVJ58B7KueIKbvrMe6YvSfFj9QfObELFjYCcrJZTvUWBhig0QrsfPIiUphA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.80.tgz", + "integrity": "sha512-0dOLedFpVXe+ugkKHXsqSxMKqvQYfFtibWbrZ7j8wOaErzSGPr0VpyWvepNVb9s046725kPXSw+fsGhqZR8wrw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.80.tgz", + "integrity": "sha512-QIjwP3PtDeHBDkwF6+ZZqdUsqAhORbMpxrw2jq3mHe4lQrxBttSFTq018vlMRo2mFEorOvXdadzaD9m+NymPrw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.80.tgz", + "integrity": "sha512-cg8WriIueab58ZwkzXmIACnjSzFLzOBwxlC9k65gPXMNgCjab2YbqEYvAbjBqneuqaao02gW6tad2uhjgYaExw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.80.tgz", + "integrity": "sha512-AhdCQ7QKx5mWrtpaOA1mFRiWWvuiiUtspvo0QSpspDetRKTND1rlf/3UB5+gp0kCeCNUTsVmJWU7fIA9ICZtXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.80.tgz", + "integrity": "sha512-+2e5oni1vOrLIjM5Q2/GIzK/uS2YEtuJqnjPvCK8SciRJsSl8OgVsRvyCDbmKeZNtJ2Q+o/O2AQ2w1qpAJG6jg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.80.tgz", + "integrity": "sha512-8OK9IlI1zpWOm7vIp1iXmZSEzLAwFpqhsGSEhxPavpOx2m54kLFdPcw/Uv3n461f6TCtszIxkGq1kSqBUdfUBA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.80.tgz", + "integrity": "sha512-RKhatwiAGlffnF6z2Mm3Ddid0v3KB+uf5m/Gc7N9zO/EUAV0PnHRuYuZSGyqodHmGFC+mK8YrCooFCEmHL9n+w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.80.tgz", + "integrity": "sha512-3jiiZzU/kaw7k4zUp1yMq1QiUe4wJVtCEXIhf+fKuBsIwm7rdvyK/+PIx5KHnZy4TGQnYczKBRhJA5nuBcrUCQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.3.80", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.80.tgz", + "integrity": "sha512-2eZtIoIWQBWqykfms92Zd37lveYOBWQTZjdooBGlsLHtcoQLkNpf1NXmR6TKY0yy8q6Yl3OhPvY+izjmO08MSg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/types": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.4.tgz", + "integrity": "sha512-z/G02d+59gyyUb7KYhKi9jOhicek6QD2oMaotUyG+lUkybpXoV49dY9bj7Ah5Q+y7knK2jU67UTX9FyfGzaxQg==", + "dev": true + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dev": true, + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/js-cookie": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-2.2.7.tgz", + "integrity": "sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "devOptional": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "peer": true + }, + "node_modules/@types/lodash": { + "version": "4.14.197", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.197.tgz", + "integrity": "sha512-BMVOiWs0uNxHVlHBgzTIqJYmj+PgCo4euloGF+5m4okL3rEYzM2EEv78mw8zWSMM57dM7kVIgJ2QDvwHSoCI5g==" + }, + "node_modules/@types/node": { + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz", + "integrity": "sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "devOptional": true + }, + "node_modules/@types/styled-components": { + "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", + "dev": true, + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.5.0.tgz", + "integrity": "sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==", + "devOptional": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.5.0", + "@typescript-eslint/type-utils": "6.5.0", + "@typescript-eslint/utils": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.5.0.tgz", + "integrity": "sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==", + "devOptional": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.5.0", + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/typescript-estree": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.5.0.tgz", + "integrity": "sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==", + "devOptional": true, + "dependencies": { + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.5.0.tgz", + "integrity": "sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==", + "devOptional": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.5.0", + "@typescript-eslint/utils": "6.5.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.5.0.tgz", + "integrity": "sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==", + "devOptional": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.5.0.tgz", + "integrity": "sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==", + "devOptional": true, + "dependencies": { + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/visitor-keys": "6.5.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.5.0.tgz", + "integrity": "sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==", + "devOptional": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.5.0", + "@typescript-eslint/types": "6.5.0", + "@typescript-eslint/typescript-estree": "6.5.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.5.0.tgz", + "integrity": "sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==", + "devOptional": true, + "dependencies": { + "@typescript-eslint/types": "6.5.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz", + "integrity": "sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.61" + }, + "peerDependencies": { + "vite": "^4" + } + }, + "node_modules/@xobotyi/scrollbar-width": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz", + "integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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==", + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antd": { + "version": "5.11.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-5.11.3.tgz", + "integrity": "sha512-+aXlytJCsp8Thag+MAMCDsDciwTl7w3bexHiojGgFOaSJPuIktN5yrLb9GCLar3fkTyGVAaxnkJm4JLGbAz3Xg==", + "dependencies": { + "@ant-design/colors": "^7.0.0", + "@ant-design/cssinjs": "^1.17.5", + "@ant-design/icons": "^5.2.6", + "@ant-design/react-slick": "~1.0.2", + "@babel/runtime": "^7.18.3", + "@ctrl/tinycolor": "^3.6.1", + "@rc-component/color-picker": "~1.4.1", + "@rc-component/mutate-observer": "^1.1.0", + "@rc-component/tour": "~1.10.0", + "@rc-component/trigger": "^1.18.2", + "classnames": "^2.3.2", + "copy-to-clipboard": "^3.3.3", + "dayjs": "^1.11.1", + "qrcode.react": "^3.1.0", + "rc-cascader": "~3.20.0", + "rc-checkbox": "~3.1.0", + "rc-collapse": "~3.7.1", + "rc-dialog": "~9.3.4", + "rc-drawer": "~6.5.2", + "rc-dropdown": "~4.1.0", + "rc-field-form": "~1.40.0", + "rc-image": "~7.5.0", + "rc-input": "~1.3.6", + "rc-input-number": "~8.4.0", + "rc-mentions": "~2.9.1", + "rc-menu": "~9.12.2", + "rc-motion": "^2.9.0", + "rc-notification": "~5.3.0", + "rc-pagination": "~3.7.0", + "rc-picker": "~3.14.6", + "rc-progress": "~3.5.1", + "rc-rate": "~2.12.0", + "rc-resize-observer": "^1.4.0", + "rc-segmented": "~2.2.2", + "rc-select": "~14.10.0", + "rc-slider": "~10.4.0", + "rc-steps": "~6.0.1", + "rc-switch": "~4.1.0", + "rc-table": "~7.36.0", + "rc-tabs": "~12.13.1", + "rc-textarea": "~1.5.3", + "rc-tooltip": "~6.1.2", + "rc-tree": "~5.8.2", + "rc-tree-select": "~5.15.0", + "rc-upload": "~4.3.5", + "rc-util": "^5.38.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/antd/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==", + "engines": { + "node": ">=12.22" + } + }, + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/are-passive-events-supported": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/are-passive-events-supported/-/are-passive-events-supported-1.1.1.tgz", + "integrity": "sha512-5wnvlvB/dTbfrCvJ027Y4L4gW/6Mwoy1uFSavney0YO++GU+0e/flnjiBBwH+1kh7xNCgCOGvmJC3s32joYbww==" + }, + "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==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dependencies": { + "has-symbols": "^1.0.3" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "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==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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==" + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "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==", + "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==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/breakpoint-sass": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/breakpoint-sass/-/breakpoint-sass-3.0.0.tgz", + "integrity": "sha512-qxJqSfTaOHI+RCGzvKWVRwwC2hMIaS0KV1b+asqWUFxdLv/yKNADF7AtT1uNnkt2VxSMZ2csM22CSc+Hez+EIg==", + "peerDependencies": { + "sass": "^1.25" + } + }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "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" + } + ], + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001524", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001524.tgz", + "integrity": "sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==", + "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" + } + ], + "peer": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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==" + }, + "node_modules/cliui/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "peer": true + }, + "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==", + "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==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz", + "integrity": "sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-in-js-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz", + "integrity": "sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==", + "dependencies": { + "hyphenate-style-name": "^1.0.3" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "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==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-freeze": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", + "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "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==" + }, + "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==", + "devOptional": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom7": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.6.tgz", + "integrity": "sha512-emjdpPLhpNubapLFdjNL9tP06Sr+GZkrIHEXLWvOGsytACUrkbeIdjO5g77m00BrHTznnlcNqgmn7pCN192TBA==", + "dependencies": { + "ssr-window": "^4.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "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==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.504", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.504.tgz", + "integrity": "sha512-cSMwIAd8yUh54VwitVRVvHK66QqHWE39C3DRj8SWiXitEpVSY3wNPD9y1pxQtLIi4w3UdzF9klLsmuPshz09DQ==", + "peer": true + }, + "node_modules/emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==" + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/equals": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/equals/-/equals-1.0.5.tgz", + "integrity": "sha512-wI15a6ZoaaXPv+55+Vh2Kqn3+efKRv8QPtcGTjW5xmanMnQzESdAt566jevtMZyt3W/jwLDTzXpMph5ECDJ2zg==", + "dependencies": { + "jkroso-type": "1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz", + "integrity": "sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "peer": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.0.tgz", + "integrity": "sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "peer": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dependencies": { + "is-core-module": "^2.9.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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz", + "integrity": "sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==", + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fake-xml-http-request": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fake-xml-http-request/-/fake-xml-http-request-2.1.2.tgz", + "integrity": "sha512-HaFMBi7r+oEC9iJNpc3bvcW7Z7iLmM26hPDmlb0mFwyANSsOQAtJxbdWsXITKOzZUyMYK0zYCv3h5yDj9TsiXg==" + }, + "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==" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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-glob/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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-loops": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz", + "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==" + }, + "node_modules/fast-shallow-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-shallow-equal/-/fast-shallow-equal-1.0.0.tgz", + "integrity": "sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==" + }, + "node_modules/fastest-stable-stringify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-2.0.2.tgz", + "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/firebase": { + "version": "10.5.2", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-10.5.2.tgz", + "integrity": "sha512-LLCig21TBYdByMbGJt5YmUzzk2HpsFCsIUTvOteQjW9BUh40IrSP2+dZi9IvT8RlztM3zcH+TNZ0jOsOaa7GMQ==", + "dependencies": { + "@firebase/analytics": "0.10.0", + "@firebase/analytics-compat": "0.2.6", + "@firebase/app": "0.9.22", + "@firebase/app-check": "0.8.0", + "@firebase/app-check-compat": "0.3.7", + "@firebase/app-compat": "0.2.22", + "@firebase/app-types": "0.9.0", + "@firebase/auth": "1.3.2", + "@firebase/auth-compat": "0.4.8", + "@firebase/database": "1.0.1", + "@firebase/database-compat": "1.0.1", + "@firebase/firestore": "4.3.2", + "@firebase/firestore-compat": "0.3.21", + "@firebase/functions": "0.10.0", + "@firebase/functions-compat": "0.3.5", + "@firebase/installations": "0.6.4", + "@firebase/installations-compat": "0.2.4", + "@firebase/messaging": "0.12.4", + "@firebase/messaging-compat": "0.2.4", + "@firebase/performance": "0.6.4", + "@firebase/performance-compat": "0.2.4", + "@firebase/remote-config": "0.4.4", + "@firebase/remote-config-compat": "0.2.4", + "@firebase/storage": "0.11.2", + "@firebase/storage-compat": "0.3.2", + "@firebase/util": "1.9.3" + } + }, + "node_modules/fitty": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/fitty/-/fitty-2.3.7.tgz", + "integrity": "sha512-yucQBzDD8sRa8EXfHu4/h9vNDFHUXpYtC+nydtBRfLSjzToCEvacy4qiBJyihgUVrqpXB+Kp5kWCbROSrePd2g==" + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "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==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", + "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "devOptional": true, + "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==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/gsap": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.12.2.tgz", + "integrity": "sha512-EkYnpG8qHgYBFAwsgsGEqvT1WUidX0tt/ijepx7z8EUJHElykg91RvW1XbkT59T0gZzzszOpjQv7SE41XuIXyQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "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==", + "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==" + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + }, + "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==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflected": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/inflected/-/inflected-2.1.0.tgz", + "integrity": "sha512-hAEKNxvHf2Iq3H60oMBHkB4wl5jn3TPF3+fXek/sRwAB5gP9xWs4r7aweSF95f99HFoz69pnZTcu8f0SIHV18w==" + }, + "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==", + "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==" + }, + "node_modules/inline-style-prefixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz", + "integrity": "sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==", + "dependencies": { + "css-in-js-utils": "^3.1.0", + "fast-loops": "^1.1.3" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/iterator.prototype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.0.tgz", + "integrity": "sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==", + "dependencies": { + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" + } + }, + "node_modules/jkroso-type": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jkroso-type/-/jkroso-type-1.1.1.tgz", + "integrity": "sha512-zZgay+fPG6PgMUrpyFADmQmvLo39+AZa7Gc5pZhev2RhDxwANEq2etwD8d0e6rTg5NkwOIlQmaEmns3draC6Ng==" + }, + "node_modules/js-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz", + "integrity": "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "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==" + }, + "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==", + "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==", + "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==" + }, + "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==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "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==", + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.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==", + "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==" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.compact": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.compact/-/lodash.compact-3.0.1.tgz", + "integrity": "sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==" + }, + "node_modules/lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==" + }, + "node_modules/lodash.forin": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.forin/-/lodash.forin-4.4.0.tgz", + "integrity": "sha512-APldePP4yvGhMcplVxv9L+exdLHMRHRhH1Q9O70zRJMm9HbTm6zxaihXtNl+ICOBApeFWoH7jNmFr/L4XfWeiQ==" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, + "node_modules/lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g==" + }, + "node_modules/lodash.invokemap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", + "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==" + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.lowerfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.lowerfirst/-/lodash.lowerfirst-4.3.1.tgz", + "integrity": "sha512-UUKX7VhP1/JL54NXg2aq/E1Sfnjjes8fNYTNkPU8ZmsaVeBvPHKdbNaN79Re5XRL01u6wbq3j0cbYZj71Fcu5w==" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==" + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "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==" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==" + }, + "node_modules/lodash.values": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz", + "integrity": "sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "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==" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/miragejs": { + "version": "0.1.47", + "resolved": "https://registry.npmjs.org/miragejs/-/miragejs-0.1.47.tgz", + "integrity": "sha512-99tuCbIAlMhNhyF3s5d3+5/FdJ7O4jSq/5e3e+sDv7L8dZdwJuwutXe0pobJ7hm6yRChTDjK+Nn8dZZd175wbg==", + "dependencies": { + "@miragejs/pretender-node-polyfill": "^0.1.0", + "inflected": "^2.0.4", + "lodash.assign": "^4.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.compact": "^3.0.1", + "lodash.find": "^4.6.0", + "lodash.flatten": "^4.4.0", + "lodash.forin": "^4.4.0", + "lodash.get": "^4.4.2", + "lodash.has": "^4.5.2", + "lodash.invokemap": "^4.6.0", + "lodash.isempty": "^4.4.0", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isinteger": "^4.0.4", + "lodash.isplainobject": "^4.0.6", + "lodash.lowerfirst": "^4.3.1", + "lodash.map": "^4.6.0", + "lodash.mapvalues": "^4.6.0", + "lodash.pick": "^4.4.0", + "lodash.snakecase": "^4.1.1", + "lodash.uniq": "^4.5.0", + "lodash.uniqby": "^4.7.0", + "lodash.values": "^4.3.0", + "pretender": "^3.4.7" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "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==" + }, + "node_modules/mutation-observer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mutation-observer/-/mutation-observer-1.0.3.tgz", + "integrity": "sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==" + }, + "node_modules/nano-css": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.5.tgz", + "integrity": "sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==", + "dependencies": { + "css-tree": "^1.1.2", + "csstype": "^3.0.6", + "fastest-stable-stringify": "^2.0.2", + "inline-style-prefixer": "^6.0.0", + "rtl-css-js": "^1.14.0", + "sourcemap-codec": "^1.4.8", + "stacktrace-js": "^2.0.2", + "stylis": "^4.0.6" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "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.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "peer": true + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nosleep.js": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.12.0.tgz", + "integrity": "sha512-9d1HbpKLh3sdWlhXMhU6MMH+wQzKkrgfRkYV0EBdvt99YJfj0ilCJrWRDYG2130Tm4GXbEoTCx5b34JSaP+HhA==" + }, + "node_modules/numeral": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", + "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "engines": { + "node": "*" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.hasown": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", + "dependencies": { + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, + "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==", + "dependencies": { + "ee-first": "1.1.1" + }, + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "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-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "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==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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==" + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretender": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/pretender/-/pretender-3.4.7.tgz", + "integrity": "sha512-jkPAvt1BfRi0RKamweJdEcnjkeu7Es8yix3bJ+KgBC5VpG/Ln4JE3hYN6vJym4qprm8Xo5adhWpm3HCoft1dOw==", + "dependencies": { + "fake-xml-http-request": "^2.1.2", + "route-recognizer": "^0.3.3" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-react-carousel": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/pure-react-carousel/-/pure-react-carousel-1.30.1.tgz", + "integrity": "sha512-B1qi62hZk0OFqRR4cTjtgIeOn/Ls5wo+HsLtrXT4jVf5et8ldBHSt+6LsYRJN86Or8dm+XbnJNEHy6WDJ0/DQw==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "deep-freeze": "0.0.1", + "deepmerge": "^2.2.1", + "equals": "^1.0.5", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "15.x || 16.x || 17.x || 18.x", + "react-dom": "15.x || 16.x || 17.x || 18.x" + } + }, + "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==", + "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==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ] + }, + "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==", + "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/rc-cascader": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.20.0.tgz", + "integrity": "sha512-lkT9EEwOcYdjZ/jvhLoXGzprK1sijT3/Tp4BLxQQcHDZkkOzzwYQC9HgmKoJz0K7CukMfgvO9KqHeBdgE+pELw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "array-tree-filter": "^2.1.0", + "classnames": "^2.3.1", + "rc-select": "~14.10.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.1.0", + "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.1.0.tgz", + "integrity": "sha512-PAwpJFnBa3Ei+5pyqMMXdcKYKNBMS+TvSDiLdDnARnMJHC8ESxwPfm4Ao1gJiKtWLdmGfigascnCpwrHFgoOBQ==", + "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.1", + "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.7.1.tgz", + "integrity": "sha512-N/7ejyiTf3XElNJBBpxqnZBUuMsQWEOPjB2QkfNvZ/Ca54eAvJXuOD1EGbCWCk2m7v/MSxku7mRpdeaLOCd4Gg==", + "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.3.4", + "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.3.4.tgz", + "integrity": "sha512-975X3018GhR+EjZFbxA2Z57SX5rnu0G0/OxFgMMvZK4/hQWEm3MHaNvP4wXpxYDoJsp+xUvVW+GB9CMMCm81jA==", + "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": "6.5.2", + "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.5.2.tgz", + "integrity": "sha512-QckxAnQNdhh4vtmKN0ZwDf3iakO83W9eZcSKWYYTDv4qcD2fHhRAZJJ/OE6v2ZlQ2kSqCJX5gYssF4HJFvsEPQ==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/portal": "^1.1.1", + "classnames": "^2.2.6", + "rc-motion": "^2.6.1", + "rc-util": "^5.36.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-dropdown": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.1.0.tgz", + "integrity": "sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@rc-component/trigger": "^1.7.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.40.0", + "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.40.0.tgz", + "integrity": "sha512-OM3N01X2BYFGJDJcwpk9/BBtlwgveE7eh2SQAKIxVCt9KVWlODYJ9ypTHQdxchfDbeJKJKxMBFXlLAmyvlgPHg==", + "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.5.0", + "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.5.0.tgz", + "integrity": "sha512-GVR/GX8MF/tC2nZ913heGCa/99FU4UkMjXXOj55gY8vF6yjPoZ21MusH2ZG2Y/mNMM1Cnkujp1kRdAzR7/KYTg==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/portal": "^1.0.2", + "classnames": "^2.2.6", + "rc-dialog": "~9.3.4", + "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.3.6", + "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-1.3.6.tgz", + "integrity": "sha512-/HjTaKi8/Ts4zNbYaB5oWCquxFyFQO4Co1MnMgoCeGJlpe7k8Eir2HN0a0F9IHDmmo+GYiGgPpz7w/d/krzsJA==", + "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": "8.4.0", + "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-8.4.0.tgz", + "integrity": "sha512-B6rziPOLRmeP7kcS5qbdC5hXvvDHYKV4vUxmahevYx2E6crS2bRi0xLDjhJ0E1HtOWo8rTmaE2EBJAkTCZOLdA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/mini-decimal": "^1.0.1", + "classnames": "^2.2.5", + "rc-input": "~1.3.5", + "rc-util": "^5.28.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-mentions": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.9.1.tgz", + "integrity": "sha512-cZuElWr/5Ws0PXx1uxobxfYh4mqUw2FitfabR62YnWgm+WAfDyXZXqZg5DxXW+M1cgVvntrQgDDd9LrihrXzew==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.6", + "rc-input": "~1.3.5", + "rc-menu": "~9.12.0", + "rc-textarea": "~1.5.0", + "rc-util": "^5.34.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-menu": { + "version": "9.12.2", + "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.12.2.tgz", + "integrity": "sha512-NzloFH2pRUYmQ3S/YbJAvRkgCZaLvq0sRa5rgJtuIHLfPPprNHNyepeSlT64+dbVqI4qRWL44VN0lUCldCbbfg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.17.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==", + "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==", + "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==", + "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": "3.7.0", + "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.7.0.tgz", + "integrity": "sha512-IxSzKapd13L91/195o1TPkKnCNw8gIR25UP1GCW/7c7n/slhld4npu2j2PB9IWjXm4SssaAaSAt2lscYog7wzg==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-util": "^5.32.2" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-picker": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-3.14.6.tgz", + "integrity": "sha512-AdKKW0AqMwZsKvIpwUWDUnpuGKZVrbxVTZTNjcO+pViGkjC1EBcjMgxVe8tomOEaIHJL5Gd13vS8Rr3zzxWmag==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.0", + "classnames": "^2.2.1", + "rc-util": "^5.30.0" + }, + "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==", + "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==", + "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==", + "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.2.2", + "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.2.2.tgz", + "integrity": "sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==", + "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.10.0", + "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.10.0.tgz", + "integrity": "sha512-TsIJTYafTTapCA32LLNpx/AD6ntepR1TG8jEVx35NiAAWCPymhUfuca8kRcUNd3WIGVMDcMKn9kkphoxEz+6Ag==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "@rc-component/trigger": "^1.5.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.4.0", + "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.4.0.tgz", + "integrity": "sha512-ZlpWjFhOlEf0w4Ng31avFBkXNNBj60NAcTPaIoiCxBkJ29wOtHSPMqv9PZeEoqmx64bpJkgK7kPa47HG4LPzww==", + "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==", + "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==", + "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.36.0", + "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.36.0.tgz", + "integrity": "sha512-3xVcdCC5OLeOOhaCg+5Lps2oPreM/GWXmUXWTSX4p6vF7F76ABM4dfPpMJ9Dnf5yGRyh+8pe7FRyhRVnWw2H/w==", + "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": "12.13.1", + "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.13.1.tgz", + "integrity": "sha512-83u3l2QkO0UznCzdBLEk9WnNcT+imtmDmMT993sUUEOGnNQAmqOdev0XjeqrcvsAMe9CDpAWDFd7L/RZw+LVJQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "classnames": "2.x", + "rc-dropdown": "~4.1.0", + "rc-menu": "~9.12.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.5.3", + "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-1.5.3.tgz", + "integrity": "sha512-oH682ghHx++stFNYrosPRBfwsypywrTXpaD0/5Z8MPkUOnyOQUaY9ueL9tMu6BP1LfsuYQ1VLpg5OtshViLNgA==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "^2.2.1", + "rc-input": "~1.3.5", + "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.1.2", + "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-6.1.2.tgz", + "integrity": "sha512-89zwvybvCxGJu3+gGF8w5AXd4HHk6hIN7K0vZbkzjilVaEAIWPqc1fcyeUeP71n3VCcw7pTL9LyFupFbrx8gHw==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "@rc-component/trigger": "^1.18.0", + "classnames": "^2.3.1" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/rc-tree": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.8.2.tgz", + "integrity": "sha512-xH/fcgLHWTLmrSuNphU8XAqV7CdaOQgm4KywlLGNoTMhDAcNR3GVNP6cZzb0GrKmIZ9yae+QLot/cAgUdPRMzg==", + "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.15.0", + "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.15.0.tgz", + "integrity": "sha512-YJHfdO6azFnR0/JuNBZLDptGE4/RGfVeHAafUIYcm2T3RBkL1O8aVqiHvwIyLzdK59ry0NLrByd+3TkfpRM+9Q==", + "dependencies": { + "@babel/runtime": "^7.10.1", + "classnames": "2.x", + "rc-select": "~14.10.0", + "rc-tree": "~5.8.1", + "rc-util": "^5.16.1" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/rc-upload": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.5.tgz", + "integrity": "sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA==", + "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.38.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz", + "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==", + "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==" + }, + "node_modules/rc-virtual-list": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz", + "integrity": "sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q==", + "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": "*", + "react-dom": "*" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-countdown": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/react-countdown/-/react-countdown-2.3.5.tgz", + "integrity": "sha512-K26ENYEesMfPxhRRtm1r+Pf70SErrvW3g4CArLi/x6MPFjgfDFYePT4UghEj8p2nI0cqVV7/JjDgjyr//U60Og==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">= 15", + "react-dom": ">= 15" + } + }, + "node_modules/react-device-detect": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-device-detect/-/react-device-detect-2.2.3.tgz", + "integrity": "sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==", + "dependencies": { + "ua-parser-js": "^1.0.33" + }, + "peerDependencies": { + "react": ">= 0.14.0", + "react-dom": ">= 0.14.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==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-fast-marquee": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/react-fast-marquee/-/react-fast-marquee-1.6.0.tgz", + "integrity": "sha512-jtuwT9SNjrqxnE7lGZ8mTL1I8Q4+9G4aBta2p+y2Pa3SjR17QROblwrLICyM8rbjQFHgHawTHcaH9HvoVO2NOA==", + "peerDependencies": { + "react": ">= 16.8.0 || 18.0.0", + "react-dom": ">= 16.8.0 || 18.0.0" + } + }, + "node_modules/react-fitty": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-fitty/-/react-fitty-1.0.1.tgz", + "integrity": "sha512-mO+Sbon+bO8Kazv38qu3uwi52vYDdty6P8fla91TkQEc2KwfZjNLT4j31cXix3ZTlBMWmavWAu5SfG6J9SpaFQ==", + "dependencies": { + "fitty": "2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-iframe": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/react-iframe/-/react-iframe-1.8.5.tgz", + "integrity": "sha512-F4cQJGs3ydaG6fJWfuz9yLwOU0Trzl6kttXuUG+vYwosH8enOOFxZWEDQCSbNVO8ayjfYZeqLxEvdvcsSy4GvA==", + "dependencies": { + "object-assign": "^4.1.1" + }, + "peerDependencies": { + "react": ">=16.x.x" + } + }, + "node_modules/react-infinite-scroll-component": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz", + "integrity": "sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ==", + "dependencies": { + "throttle-debounce": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/react-infinite-scroll-component/node_modules/throttle-debounce": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.3.0.tgz", + "integrity": "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==", + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", + "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", + "dependencies": { + "@remix-run/router": "1.8.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", + "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", + "dependencies": { + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-scroll": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-scroll/-/react-scroll-1.8.9.tgz", + "integrity": "sha512-9m7ztraiX/l6L7erzYAD3fhnveNckei6/NkWfqwN2e0FRdoE2W6Pk4oi2Nah7mWpPCPAeIgegfaqZACTimPOwg==", + "dependencies": { + "lodash.throttle": "^4.1.1", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.5.4 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-spinners": { + "version": "0.13.8", + "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.13.8.tgz", + "integrity": "sha512-3e+k56lUkPj0vb5NDXPVFAOkPC//XyhKPJjvcGjyMNPWsBKpplfeyialP74G7H7+It7KzhtET+MvGqbKgAqpZA==", + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-timer-hook": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/react-timer-hook/-/react-timer-hook-3.0.7.tgz", + "integrity": "sha512-ATpNcU+PQRxxfNBPVqce2+REtjGAlwmfoNQfcEBMZFxPj0r3GYdKhyPHdStvqrejejEi0QvqaJZjy2lBlFvAsA==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-universal-interface": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/react-universal-interface/-/react-universal-interface-0.6.2.tgz", + "integrity": "sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==", + "peerDependencies": { + "react": "*", + "tslib": "*" + } + }, + "node_modules/react-use": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/react-use/-/react-use-17.4.0.tgz", + "integrity": "sha512-TgbNTCA33Wl7xzIJegn1HndB4qTS9u03QUwyNycUnXaweZkE4Kq2SB+Yoxx8qbshkZGYBDvUXbXWRUmQDcZZ/Q==", + "dependencies": { + "@types/js-cookie": "^2.2.6", + "@xobotyi/scrollbar-width": "^1.9.5", + "copy-to-clipboard": "^3.3.1", + "fast-deep-equal": "^3.1.3", + "fast-shallow-equal": "^1.0.0", + "js-cookie": "^2.2.1", + "nano-css": "^5.3.1", + "react-universal-interface": "^0.6.2", + "resize-observer-polyfill": "^1.5.1", + "screenfull": "^5.1.0", + "set-harmonic-interval": "^1.0.1", + "throttle-debounce": "^3.0.1", + "ts-easing": "^0.2.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.3.tgz", + "integrity": "sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "peer": true, + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/route-recognizer": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/route-recognizer/-/route-recognizer-0.3.4.tgz", + "integrity": "sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==" + }, + "node_modules/rtl-css-js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.16.1.tgz", + "integrity": "sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.66.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", + "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/screenfull": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-5.2.0.tgz", + "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "devOptional": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-harmonic-interval": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz", + "integrity": "sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==", + "engines": { + "node": ">=6.9" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==" + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "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==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/ssr-window": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz", + "integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==" + }, + "node_modules/stack-generator": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/stacktrace-gps": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", + "dependencies": { + "source-map": "0.5.6", + "stackframe": "^1.3.4" + } + }, + "node_modules/stacktrace-gps/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "dependencies": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "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==" + }, + "node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz", + "integrity": "sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/styled-components": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.6.tgz", + "integrity": "sha512-hGTZquGAaTqhGWldX7hhfzjnIYBZ0IXQXkCYdvF1Sq3DsUaLx6+NTHC5Jj1ooM2F68sBiVz3lvhfwQs/S3l6qg==", + "hasInstallScript": true, + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/styled-components/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swiper": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/swiper/-/swiper-8.4.5.tgz", + "integrity": "sha512-zveyEFBBv4q1sVkbJHnuH4xCtarKieavJ4SxP0QEHvdpPLJRuD7j/Xg38IVVLbp7Db6qrPsLUePvxohYx39Agw==", + "funding": [ + { + "type": "patreon", + "url": "https://www.patreon.com/swiperjs" + }, + { + "type": "open_collective", + "url": "http://opencollective.com/swiper" + } + ], + "hasInstallScript": true, + "dependencies": { + "dom7": "^4.0.4", + "ssr-window": "^4.0.2" + }, + "engines": { + "node": ">= 4.7.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "optional": true, + "peer": true, + "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/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==", + "dev": true, + "optional": true, + "peer": true + }, + "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==" + }, + "node_modules/throttle-debounce": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tiny-sha256": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tiny-sha256/-/tiny-sha256-1.0.2.tgz", + "integrity": "sha512-IdsPtu8eJ0SwuCWUFm2euFH3jJvtpGQC0VpZNZlqxRvQ2zGvSjbXDO+4T8Rm5ETsmCQHHvKUGds69bJYrlb3Tg==" + }, + "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==", + "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==", + "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==" + }, + "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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "devOptional": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-easing": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz", + "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==" + }, + "node_modules/ts-key-enum": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-key-enum/-/ts-key-enum-2.0.12.tgz", + "integrity": "sha512-Ety4IvKMaeG34AyXMp5r11XiVZNDRL+XWxXbVVJjLvq2vxKRttEANBE7Za1bxCAZRdH2/sZT6jFyyTWxXz28hw==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "peer": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "peer": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "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==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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" + } + ], + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-immer": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.9.0.tgz", + "integrity": "sha512-/L+enLi0nvuZ6j4WlyK0US9/ECUtV5v9RUbtxnn5+WbtaXYUaOBoKHDNL9I5AETdurQ4rIFIj/s+Z5X80ATyKw==", + "peerDependencies": { + "immer": ">=2.0.0", + "react": "^16.8.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-onclickoutside": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/use-onclickoutside/-/use-onclickoutside-0.4.1.tgz", + "integrity": "sha512-hAo1viJ9D2mPffUig4EWCwE4as7fq84HANk3MCkY3rhXk5oMl0mjLCLF/OhzWIhTaITcAcDDcnaxRdMHPq+sww==", + "dependencies": { + "are-passive-events-supported": "^1.1.1", + "use-latest": "^1.2.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-reducer-async": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/use-reducer-async/-/use-reducer-async-2.1.1.tgz", + "integrity": "sha512-oPSFzOIEPgMenQkMHzqeRgsQLSpcyGkspAnyTWP4l1tKlt31wMVMz6wWj6g/jea/Ms7lRvBz4AL+Okt83Tntig==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "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==" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vconsole": { + "version": "3.15.1", + "resolved": "https://registry.npmjs.org/vconsole/-/vconsole-3.15.1.tgz", + "integrity": "sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==", + "dependencies": { + "@babel/runtime": "^7.17.2", + "copy-text-to-clipboard": "^3.0.1", + "core-js": "^3.11.0", + "mutation-observer": "^1.0.3" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "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==", + "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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.18", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz", + "integrity": "sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "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/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==" + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "devOptional": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/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==" + }, + "node_modules/yargs/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c576c42 --- /dev/null +++ b/package.json @@ -0,0 +1,99 @@ +{ + "name": "lp-react", + "private": true, + "version": "0.0.1", + "type": "module", + "homepage": "./", + "scripts": { + "start": "npm run dev", + "dev": "vite --host --port 8000", + "build": "tsc && vite build" + }, + "dependencies": { + "@fortawesome/fontawesome-free": "^6.4.0", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@line/liff": "^2.22.3", + "@types/lodash": "^4.14.197", + "@types/node": "^20.2.5", + "antd": "^5.11.3", + "axios": "^1.5.0", + "bootstrap": "^5.3.0", + "breakpoint-sass": "^3.0.0", + "buffer": "^6.0.3", + "classnames": "^2.3.2", + "date-fns": "^2.30.0", + "dayjs": "^1.11.9", + "eslint-import-resolver-typescript": "^3.6.0", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-unused-imports": "^3.0.0", + "events": "^3.3.0", + "firebase": "^10.5.2", + "gsap": "^3.12.2", + "immer": "^9.0.21", + "lodash": "^4.17.21", + "lz-string": "^1.5.0", + "miragejs": "^0.1.47", + "moment": "^2.29.4", + "nosleep.js": "^0.12.0", + "numeral": "^2.0.6", + "path": "^0.12.7", + "pure-react-carousel": "^1.30.1", + "react": "^18.2.0", + "react-countdown": "^2.3.5", + "react-device-detect": "^2.2.3", + "react-dom": "^18.2.0", + "react-draggable": "^4.4.5", + "react-fast-marquee": "^1.6.0", + "react-fitty": "^1.0.1", + "react-iframe": "^1.8.5", + "react-infinite-scroll-component": "^6.1.0", + "react-query": "^3.39.3", + "react-router-dom": "^6.15.0", + "react-scroll": "^1.8.9", + "react-spinners": "^0.13.8", + "react-timer-hook": "^3.0.7", + "react-use": "^17.4.0", + "rxjs": "^7.8.1", + "sass": "^1.66.1", + "string-width": "^6.1.0", + "styled-components": "^5.3.6", + "swiper": "^8.4.5", + "ts-key-enum": "^2.0.12", + "use-immer": "^0.9.0", + "use-onclickoutside": "^0.4.1", + "use-reducer-async": "^2.1.1", + "uuid": "^9.0.0", + "vconsole": "^3.15.1" + }, + "devDependencies": { + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", + "@types/styled-components": "^5.1.26", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", + "@vitejs/plugin-react-swc": "^3.3.2", + "eslint": "^8.45.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.3", + "typescript": "^5.0.2", + "vite": "^4.4.5" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/src/Common/DataReceived/MainControlData.ts b/src/Common/DataReceived/MainControlData.ts new file mode 100644 index 0000000..d37e05a --- /dev/null +++ b/src/Common/DataReceived/MainControlData.ts @@ -0,0 +1,242 @@ +import { INetResponse } from "@/Engine/CatanEngine/NetManagerV2/Core/INetResponse"; +import CSSettingsV3 from "@/FormTable/CSSettingsV3"; +import { confirmModalObj } from "@/UI/MessageBox/ConfirmModalContext"; +import { modalObj } from "@/UIControl/ModalContext"; +import { Cocos } from "@/assets/VueScript/Cocos"; +import { CommonEventCallBack, JackpotPoolCallBack } from "@/assets/VueScript/CocosVueScript"; +import GameData_Cocos from "@/assets/VueScript/share/GameData_Cocos"; +import { chatLog, chatMessage, setChatBanTime } from "@/components/ModalContent/ChatRoomModal/chatUtils"; +import Config from "@/define/Config"; +import Player from "@/modules/player"; +import UserData from "@/modules/player/UserData"; +import { State } from "@/modules/player/define/data"; +import { ILineShareData, ModalContentType } from "@/types"; +import { CommonEventType } from "@/utils"; +import { NumberEx } from "@/utils/Number/NumberEx"; +import { activityComSync, backpackInfo, friendAllowList, friendDenyList, profileInfo, txnCenter, txnNew, txnTrade, txnUserAdd, vipInfo } from "@/utils/setRPCData"; +import MainControl from "../MainControl/MainControl"; +import CSMessage from "../Message/CSMessage"; +import CSResource from "../ResourceItem/CSResource"; +import IResourceItem from "../ResourceItem/IResourceItem"; + +export default class MainControlData { + + /** + Normal = 0, //一般斷線or登出 + RpcError = 1, //RPC錯誤 + SystemError = 2, //系統錯誤 + UserError = 3, //使用者造成的錯誤 + DbaError = 4, //query時回傳錯誤 + SendBufferError = 5, //儲存傳送資料的buff錯誤 + Kick = 6, //指定踢除 + ConnectLimit = 7, //連線限制 + RequireHardLimit = 8, //機台請求逾時 + SignalWallet = 9, + RepeatLogin = 101, //重覆登入 + LoginFailed = 102, //登入失敗 + AppVerError = 103, //Client版本過舊 + Maintain = 104, //維護中 + Ban = 105, //帳號鎖定 + SlotClose = 106, //機台關閉 + ResourceWait = 107, //使用者資料尚未寫入 + IsDelete = 108, // 被刪除的帳號 + Delete = 109, // 刪除主動斷線 + SafeDisconnect = 201, // 安全離線 + */ + private _disconnectErrorType: number = null; + + constructor() { + Player.DataReceivedEvent.AddCallback(this._dataReceivedEvent, this); + } + private _dataReceivedEvent(param: any[] = null): void { + let type: MainControl.DataType = param[0]; + let data: any = param[1]; + switch (type) { + case MainControl.DataType.ServerData: + this._serverData(data); + break; + case MainControl.DataType.NetDisconnected: + this._netDisconnected(); + break; + default: + break; + } + } + // ======================================================================================= + /** SERVER主動通知 */ + private _serverData(resp: INetResponse): void { + if (resp.IsValid) { + switch (resp.Method) { + case "activity_com.sync": { + activityComSync(resp.Data); + break; + } + case "backpack.info": { + backpackInfo(resp.Data); + break; + } + case "chat.ban": { + setChatBanTime(resp.Data); + break; + } + case "chat.message": { + chatMessage(resp.Data); + break; + } + case "chat.log": { + chatLog(resp.Data); + break; + } + case "friend.allow_list": { + friendAllowList(resp.Data); + break; + } + case "friend.deny_list": { + friendDenyList(resp.Data); + break; + } + case "game.share": { + const { openLineShareGame } = confirmModalObj; + const data: ILineShareData = { + slotID: resp.Data[0], + winMilt: resp.Data[1] + }; + openLineShareGame(data); + break; + } + case "game.sync": { + Cocos.VicKing_Bridge.InGameGetUUID = true; + break; + } + case "jackpot.get": { + const { handleOpen, setModalType } = modalObj; + const playerData: State = Player.data.getState(); + playerData.account.jackpotGet.push(...resp.Data); + Player.data.setState(playerData); + setModalType(ModalContentType.jackpot); + handleOpen(); + break; + } + case "jackpot.pool": { + const playerData: State = Player.data.getState(); + if (!Config.IsVite || MainControl.Instance.IsInGame) { + for (let i = 0; i < playerData.game.jackpotPool.length; i++) { + const oldJpData: [gameId: number, maxJPId: number, jp: number] = playerData.game.jackpotPool[i]; + let newJpData: [gameId: number, maxJPId: number, jp: number] = null; + for (let j = 0; j < resp.Data.length; j++) { + const [gameId, maxJPId, jp] = resp.Data[j]; + if (gameId === oldJpData[0]) { + newJpData = resp.Data[j]; + break; + } + } + if (!newJpData) { + JackpotPoolCallBack.DispatchCallback(oldJpData[0], 0); + } + } + } + playerData.game.jackpotPool = resp.Data; + Player.data.setState(playerData); + if (!Config.IsVite || MainControl.Instance.IsInGame) { + for (let i = 0; i < playerData.game.jackpotPool.length; i++) { + const jpData: [gameId: number, maxJPId: number, jp: number] = playerData.game.jackpotPool[i]; + JackpotPoolCallBack.DispatchCallback(jpData[0], jpData[2]); + } + } else { + Cocos.CocosEventListener.DispatchCallback(GameData_Cocos.CELT.UpdateJPPool, null); + } + break; + } + case "maintain.info": { + const playerData: State = Player.data.getState(); + if (resp.Data) { + resp.Data[3] = NumberEx.plus(MainControl.Instance.NowTime, resp.Data[3]); + playerData.maintain = resp.Data; + CommonEventCallBack.DispatchCallback(CommonEventType.Maintenance, null); + } else { + playerData.maintain = undefined; + } + Player.data.setState(playerData); + break; + } + case "profile.info": { + profileInfo(resp.Data); + break; + } + case "resource.update": { + const resourceItems: IResourceItem[] = CSResource.GetResourceItemsFromServer(resp.Data); + UserData.DoResUpdate(resourceItems); + break; + } + case "resource.bankruptcy": { + Cocos.CocosEventListener.DispatchCallback(GameData_Cocos.CELT.Bankruptcy, null); + break; + } + case "system.disconnect": { + this._disconnectErrorType = +resp.Data["c"]; + break; + } + case "txn.new": { + txnNew(resp.Data); + break; + } + case "txn.center": { + txnCenter(resp.Data); + break; + } + case "txn.trade": { + txnTrade(resp.Data); + break; + } + case "txn.user_add": { + txnUserAdd(resp.Data); + break; + } + case "vip.info": { + vipInfo(resp.Data); + break; + } + case "vip.level": { + const playerData: State = Player.data.getState(); + playerData.vip.level = resp.Data; + Player.data.setState(playerData); + break; + } + default: + break; + } + } else { + switch (resp.Method) { + case "chat.log": { + chatLog([null, null]); + break; + } + default: + break; + } + } + } + // ======================================================================================= + /** SOCKET斷線 */ + private _netDisconnected(): void { + console.debug("Disconnected Error Type : " + this._disconnectErrorType); + let str: string = null; + if (this._disconnectErrorType < 10 && this._disconnectErrorType >= 0) { + str = CSSettingsV3.prototype.CommonString(55 + this._disconnectErrorType); + } else if (this._disconnectErrorType > 100 && this._disconnectErrorType < 110) { + str = CSSettingsV3.prototype.CommonString(65 + this._disconnectErrorType - 101); + } else { + str = "Server Disconnected"; + } + CSMessage.CreateYesMsg( + str, + this._disconnectedReload + ); + } + + private _disconnectedReload(): void { + window.location.reload(); + } + + // ======================================================================================= +} \ No newline at end of file diff --git a/src/Common/MainControl/MainControl.ts b/src/Common/MainControl/MainControl.ts new file mode 100644 index 0000000..513ed8f --- /dev/null +++ b/src/Common/MainControl/MainControl.ts @@ -0,0 +1,29 @@ +import BaseSingleton from "@/Engine/Utils/Singleton/BaseSingleton"; + +export class MainControl extends BaseSingleton() { + /** 每次啟動APP */ + public IsFirstEnteringLobby: boolean = true; + // /** 登入成功判斷 */ + // public IsLogin: boolean = false; + // /** 選桌頁內的機台號碼 */ + // public TableID: number = 0; + /** 最後遊玩的一個廠商 */ + public LastPlayComponyID: number = 0; + /** 最後遊玩的一個遊戲 */ + public LastPlayGameID: number = 0; + // /** 主動斷線=字串.被動斷線=null(因為SERVER有時候會先主動斷線所以有的要預先設定字串)*/ + // public IsLogoutStr: string = null; + public IsInGame: boolean = false; + /** 現在時間 */ + public get NowTime(): number { return Date.now(); } +} + +export module MainControl { + export enum DataType { + ServerData, + ChangeDire, + NetDisconnected, + } +} + +export default MainControl; \ No newline at end of file diff --git a/src/Common/Mask/CSMask.ts b/src/Common/Mask/CSMask.ts new file mode 100644 index 0000000..967a8e3 --- /dev/null +++ b/src/Common/Mask/CSMask.ts @@ -0,0 +1,53 @@ +import LoadMaskBase from "./Group/LoadMaskBase"; + +export class CSMask { + /** 遮罩Dic */ + private static _dicMask: Map = new Map(); + public static Initialize(masks: LoadMaskBase[]): void { + this._dicMask.clear(); + for (let i = 0; i < masks.length; i++) { + const mask: LoadMaskBase = masks[i]; + this._dicMask.set(mask.MaskType, mask); + } + } + + public static GetMask(type: CSMask.MaskType): LoadMaskBase { + if (this._dicMask.has(type)) { + return this._dicMask.get(type); + } + else { + return null; + } + } + + public static ShowMask(type: CSMask.MaskType, ...param: any[]): void { + let mask = this.GetMask(type); + if (mask != null) { + mask.Show(...param); + } + } + + public static HideMask(type: CSMask.MaskType, ...param: any[]): void { + let mask = this.GetMask(type); + if (mask != null) { + mask.Hide(...param); + } + } + + public static HideAllMask(): void { + this._dicMask.forEach((k, type) => { + let mask: LoadMaskBase = this.GetMask(type); + if (mask != null) { + mask.Reset(); + } + }); + } +} + +export module CSMask { + export enum MaskType { + /** Loading */ + LoadingMask + } +} +export default CSMask; diff --git a/src/Common/Mask/Group/LoadMaskBase.ts b/src/Common/Mask/Group/LoadMaskBase.ts new file mode 100644 index 0000000..92946aa --- /dev/null +++ b/src/Common/Mask/Group/LoadMaskBase.ts @@ -0,0 +1,35 @@ +import { loadingModalObj } from "@/context/LoadingModalContext"; +import CSMask from "../CSMask"; + +export default abstract class LoadMaskBase { + /** 一般遮罩記數 */ + private _count: number = 0; + public get MaskType(): CSMask.MaskType { throw new Error(`請初始化MaskType`); } + + onLoad() { + this._count = 0; + } + + public Show(...param: any[]): void { + if (this._count == 0) { + const { handleOpen } = loadingModalObj; + handleOpen(); + } + this._count++; + } + + public Hide(...param: any[]): void { + this._count--; + if (this._count <= 0) { + const { handleClose } = loadingModalObj; + handleClose(); + this._count = 0; + } + } + + public Reset(): void { + this._count = 0; + const { handleClose } = loadingModalObj; + handleClose(); + } +} diff --git a/src/Common/Mask/Group/LoadingMask.ts b/src/Common/Mask/Group/LoadingMask.ts new file mode 100644 index 0000000..7eace7f --- /dev/null +++ b/src/Common/Mask/Group/LoadingMask.ts @@ -0,0 +1,6 @@ +import CSMask from "../CSMask"; +import LoadMaskBase from "./LoadMaskBase"; + +export default class LoadingMask extends LoadMaskBase { + public get MaskType(): CSMask.MaskType { return CSMask.MaskType.LoadingMask; } +} diff --git a/src/Common/Message/CSMessage.ts b/src/Common/Message/CSMessage.ts new file mode 100644 index 0000000..9229721 --- /dev/null +++ b/src/Common/Message/CSMessage.ts @@ -0,0 +1,49 @@ +import CSSettingsV3 from "@/FormTable/CSSettingsV3"; +import { IConfirmMessageData } from "@/UI/MessageBox/ConfirmMessage"; +import { confirmModalObj } from "@/UI/MessageBox/ConfirmModalContext"; +import { StringFormKey } from "@/define/formkey"; + + +/** 訊息框相關 */ +export default class CSMessage { + public static Record: IConfirmMessageData[] = []; + + /** 一個按鈕的訊息框 */ + public static CreateYesMsg(content: string, yesCallback: () => void = null, enterStr: string = null, title: string = null, textAlign: "center" | "left" | "right" = null) { + enterStr = enterStr ? enterStr : CSSettingsV3.prototype.CommonString(StringFormKey.String.Confirm); + let data: IConfirmMessageData = { + title: title, + content: content, + isShowCancel: false, + handleConfirm: yesCallback, + enterStr: enterStr, + textAlign: textAlign + }; + const { openOtherConfirm } = confirmModalObj; + openOtherConfirm(data); + } + + /** 兩個按鈕的訊息框 */ + public static CreateYesNoMsg(content: string, yesCallback: () => void = null, noCallback: () => void = null, enterStr: string = null, title: string = null, cancelStr: string = null, textAlign: "center" | "left" | "right" = null) { + enterStr = enterStr ? enterStr : CSSettingsV3.prototype.CommonString(StringFormKey.String.Confirm); + cancelStr = cancelStr ? cancelStr : CSSettingsV3.prototype.CommonString(StringFormKey.String.Cancel); + let data: IConfirmMessageData = { + title: title, + content: content, + isShowCancel: true, + handleConfirm: yesCallback, + handleCancel: noCallback, + enterStr: enterStr, + cancelStr: cancelStr, + textAlign: textAlign + }; + const { openOtherConfirm } = confirmModalObj; + openOtherConfirm(data); + } + + /** 網路錯誤訊息 */ + public static NetError(method: string, state: number, str: string = ""): void { + let error = String.Format("[{0}] state:{1} {2}", method, state, str); + console.debug("網路錯誤訊息: ", error); + } +} \ No newline at end of file diff --git a/src/Common/ResourceItem/CSResource.ts b/src/Common/ResourceItem/CSResource.ts new file mode 100644 index 0000000..94fe9ac --- /dev/null +++ b/src/Common/ResourceItem/CSResource.ts @@ -0,0 +1,92 @@ +import { ResourceInfo } from "@/define/resource"; +import { ActionWithType } from "../../Engine/CatanEngine/CSharp/System/ActionWithType"; +import IResourceItem from "./IResourceItem"; +import CardCouponItem from "./Items/CardCouponItem"; +import LpPointItem from "./Items/LpPointItem"; +import MoneyItem from "./Items/MoneyItem"; +import { ResourceItemType } from "./ResourceItemType"; + + +class UpdateResourceEvent extends ActionWithType { +} + +export default class CSResource { + private static _event: UpdateResourceEvent; + + /** 更新資源事件 */ + public static get Event() { + return CSResource._event; + } + + public static Initialize(): void { + CSResource._event = new UpdateResourceEvent(); + // Cocos.VicKing_Bridge.GetCSResourceEvent = () => { return CSResource._event; }; + // Cocos.VicKing_Bridge.AddResourceItemFromServer = (data: JSON) => { return CSResource.AddResourceItemFromServer(data); }; + } + + /** + * 新增一筆資源(資料必須是從Server來的) + * @param data ex [1, 15] --> 新增元寶資源 + */ + public static AddResourceItemFromServer(data: ResourceInfo | JSON): IResourceItem { + let item = this.GetResourceItemFromServer(data); + item.AddToResource(); + return item; + } + + /** + * 新增多筆資源(資料必須是從Server來的) + * @param data ex: [[1, 15], [2, 30], [28, ["0000123", [124, 3, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 1, 1, 0.000, 0.00, 1, 0, 0, 0, 0, 0, 3]]]] --> 新增[元寶, 銀兩, 卡片]等資源 + */ + public static AddResourceItemsFromServer(data: ResourceInfo[] | JSON): IResourceItem[] { + let itemList: IResourceItem[] = []; + for (let i = 0, count = Object.keys(data).length; i < count; i++) { + let itemData: JSON = data[i]; + itemList.push(this.AddResourceItemFromServer(itemData)); + } + return itemList; + } + + /** + * 從Server資料還原對應的資源物件 + * @param data ex: [1, 15] --> 元寶, [2, 30] --> 銀兩 + */ + public static GetResourceItemFromServer(data: ResourceInfo | JSON): IResourceItem { + let type = data[0]; + switch (type) { + case ResourceItemType.Money: + return new MoneyItem(data); + case ResourceItemType.Card_Coupon: + return new CardCouponItem(data); + case ResourceItemType.LpPoint: + return new LpPointItem(data); + default: + throw new Error("沒有對應[" + type + "]類型的Server資源類別"); + } + } + + /** + * 從Server資料還原對應的資源物件 + * @param data ex: [[1, 15], [2, 30], [45, [1, 10], ...] --> [元寶, 銀兩, 節慶貨幣, ...] + */ + public static GetResourceItemsFromServer(data: JSON): IResourceItem[] { + let itemList: IResourceItem[] = []; + for (let i = 0, count = Object.keys(data).length; i < count; i++) { + let itemData: JSON = data[i]; + itemList.push(this.GetResourceItemFromServer(itemData)); + } + return itemList; + } + + /** + * 新增多筆資源(直接拿資料本身) + * @param items + */ + public static AddResourceItems(items: IResourceItem[]): void { + for (let item of items) { + item.AddToResource(); + } + } + + // #endregion +} \ No newline at end of file diff --git a/src/Common/ResourceItem/IResourceItem.ts b/src/Common/ResourceItem/IResourceItem.ts new file mode 100644 index 0000000..19ebc94 --- /dev/null +++ b/src/Common/ResourceItem/IResourceItem.ts @@ -0,0 +1,16 @@ +import { ResourceItemType } from "./ResourceItemType"; + +interface IResourceItem { + /** 取得資源名稱 */ + readonly Name: string; + /** 取得資源類型 */ + readonly ResourceType: ResourceItemType; + /** 資源編號 */ + readonly ID: number; + /** 數量 */ + Count: number; + + /** 加入到玩家資源中 */ + AddToResource(): void; +} +export default IResourceItem; \ No newline at end of file diff --git a/src/Common/ResourceItem/Items/CardCouponItem.ts b/src/Common/ResourceItem/Items/CardCouponItem.ts new file mode 100644 index 0000000..e875afe --- /dev/null +++ b/src/Common/ResourceItem/Items/CardCouponItem.ts @@ -0,0 +1,28 @@ +import CSSettingsV3 from "@/FormTable/CSSettingsV3"; +import { LanguageManager } from "@/FormTableExt/Manage/Language/LanguageManager"; +import { ResourceInfo } from "@/define/resource"; +import { backpackInfo } from "@/utils/setRPCData"; +import CSResource from "../CSResource"; +import IResourceItem from "../IResourceItem"; +import { ResourceItemType } from "../ResourceItemType"; + +export default class CardCouponItem implements IResourceItem { + public get Name(): string { return CSSettingsV3.ItemSetting.StringDetail[+CSSettingsV3.ItemSetting.CouponSetting[this.ID].CardName][LanguageManager.GetMsgId()]; } + public get ResourceType(): ResourceItemType { return ResourceItemType.Card_Coupon; } + public ID: number; + public Count: number; + + public AddToResource(): void { + backpackInfo([[this.ResourceType, [this.ID, this.Count]]], true); + CSResource.Event.DispatchCallback(ResourceItemType.Card_Coupon, [this.ResourceType, [this.ID, this.Count]]); + } + + /** 從db來的格式建立可數資源物件 */ + public constructor(db: ResourceInfo | JSON) { + if (!db[1]) { + return; + } + this.ID = db[1][0]; + this.Count = db[1][1]; + } +} diff --git a/src/Common/ResourceItem/Items/CollectTokenItem.ts.meta b/src/Common/ResourceItem/Items/CollectTokenItem.ts.meta new file mode 100644 index 0000000..e38c72e --- /dev/null +++ b/src/Common/ResourceItem/Items/CollectTokenItem.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "0cab7ce7-c8b2-4c65-a80b-502bb8eddc53", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/src/Common/ResourceItem/Items/LevelItem.ts.meta b/src/Common/ResourceItem/Items/LevelItem.ts.meta new file mode 100644 index 0000000..d360d8b --- /dev/null +++ b/src/Common/ResourceItem/Items/LevelItem.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "5a6fedda-63d3-4fb7-b8f7-7ca1889cf7db", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/src/Common/ResourceItem/Items/LpPointItem.ts b/src/Common/ResourceItem/Items/LpPointItem.ts new file mode 100644 index 0000000..bec0d89 --- /dev/null +++ b/src/Common/ResourceItem/Items/LpPointItem.ts @@ -0,0 +1,28 @@ +import CSSettingsV3 from "@/FormTable/CSSettingsV3"; +import { Shop } from "@/define/formkey"; +import { ResourceInfo } from "@/define/resource"; +import Player from "@/modules/player"; +import { State } from "@/modules/player/define/data"; +import { NumberEx } from "@/utils/Number/NumberEx"; +import CSResource from "../CSResource"; +import IResourceItem from "../IResourceItem"; +import { ResourceItemType } from "../ResourceItemType"; + +export default class LpPointItem implements IResourceItem { + public get Name(): string { return CSSettingsV3.prototype.ShopString(Shop.String.LpPoint); } + public get ResourceType(): ResourceItemType { return ResourceItemType.LpPoint; } + public ID: number; + public Count: number; + + public AddToResource(): void { + const playerData: State = Player.data.getState(); + playerData.account.lpPoint = NumberEx.plus(playerData.account.lpPoint, this.Count); + Player.data.setState(playerData); + CSResource.Event.DispatchCallback(ResourceItemType.LpPoint, [playerData.account.lpPoint, this.Count]); + } + + /** 從db來的格式建立可數資源物件 */ + public constructor(db: ResourceInfo | JSON) { + this.Count = db[1]; + } +} diff --git a/src/Common/ResourceItem/Items/LpPointItem.ts.meta b/src/Common/ResourceItem/Items/LpPointItem.ts.meta new file mode 100644 index 0000000..6de1ce2 --- /dev/null +++ b/src/Common/ResourceItem/Items/LpPointItem.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "db699d15-9603-4466-8ffd-d34fde6abb5f", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/src/Common/ResourceItem/Items/MoneyItem.ts b/src/Common/ResourceItem/Items/MoneyItem.ts new file mode 100644 index 0000000..0a1dcd7 --- /dev/null +++ b/src/Common/ResourceItem/Items/MoneyItem.ts @@ -0,0 +1,31 @@ +import CSSettingsV3 from "@/FormTable/CSSettingsV3"; +import Config from "@/define/Config"; +import { Shop } from "@/define/formkey"; +import { ResourceInfo } from "@/define/resource"; +import Player from "@/modules/player"; +import { NumberEx } from "@/utils/Number/NumberEx"; +import CSResource from "../CSResource"; +import IResourceItem from "../IResourceItem"; +import { ResourceItemType } from "../ResourceItemType"; + +export default class MoneyItem implements IResourceItem { + public get Name(): string { return CSSettingsV3.prototype.ShopString(Shop.String.Money); } + public get ResourceType(): ResourceItemType { return ResourceItemType.Money; } + public ID: number; + public Count: number; + + public AddToResource(): void { + const playerData = Player.data.getState(); + playerData.account.money = NumberEx.plus(playerData.account.money, this.Count); + Player.data.setState(playerData); + if (Config.ShowMoneyLog) { + console.debug(String.Format("[{0}], {1}, {2}", "Money_" + ResourceItemType.Money, playerData.account.money, this.Count)); + } + CSResource.Event.DispatchCallback(ResourceItemType.Money, [playerData.account.money, this.Count]); + } + + /** 從db來的格式建立可數資源物件 */ + public constructor(db: ResourceInfo | JSON) { + this.Count = db[1]; + } +} \ No newline at end of file diff --git a/src/Common/ResourceItem/Items/MoneyItem.ts.meta b/src/Common/ResourceItem/Items/MoneyItem.ts.meta new file mode 100644 index 0000000..dfd4a81 --- /dev/null +++ b/src/Common/ResourceItem/Items/MoneyItem.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "e03637c9-24be-42ff-960f-b3377e20efdc", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/src/Common/ResourceItem/ResourceItemType.ts b/src/Common/ResourceItem/ResourceItemType.ts new file mode 100644 index 0000000..b662a38 --- /dev/null +++ b/src/Common/ResourceItem/ResourceItemType.ts @@ -0,0 +1,12 @@ +export enum ResourceItemType { + /** 錢 */ + Money = 1, + /** 等級 */ + Level = 2, + /** 卡片 */ + Card = 5, + /** 卡片優惠券 */ + Card_Coupon = 101, + /** 來亨卷 */ + LpPoint = 102, +} diff --git a/src/Common/System/SystemEventBase.ts b/src/Common/System/SystemEventBase.ts new file mode 100644 index 0000000..e78c9c2 --- /dev/null +++ b/src/Common/System/SystemEventBase.ts @@ -0,0 +1,22 @@ +import SystemEventManager from "./SystemEventManager"; + +/** 系統事件底層 */ +export default class SystemEventBase { + constructor() { + SystemEventManager.AddSystem(this); + } + + public get name(): string { return this.constructor.name; } + + /** 首次進入大廳 */ + public ImplementFirstEnteringLobby(): void { } + + /** 進入大廳 */ + public ImplementEnteringLobby(): void { } + + /** 關閉商城頁 */ + public ImplementCloseMall(): void { } + + /** 離開機台 */ + public ImplementLeaveSlot(slotID: number): void { } +} \ No newline at end of file diff --git a/src/Common/System/SystemEventManager.ts b/src/Common/System/SystemEventManager.ts new file mode 100644 index 0000000..02d5454 --- /dev/null +++ b/src/Common/System/SystemEventManager.ts @@ -0,0 +1,34 @@ +import SystemEventBase from "./SystemEventBase"; + +/** 系統事件管理 */ +export default class SystemEventManager { + private static systems: Map = new Map(); + + public static AddSystem(system: SystemEventBase): void { + this.systems.set(system.name, system); + } + + public static DestroySystem(system: SystemEventBase): void { + this.systems.delete(system.name); + } + + /** 首次進入大廳 */ + public static FirstEnteringLobby(): void { + SystemEventManager.systems.forEach(system => system.ImplementFirstEnteringLobby()); + } + + /** 進入大廳 */ + public static EnteringLobby(): void { + SystemEventManager.systems.forEach(system => system.ImplementEnteringLobby()); + } + + /** 關閉商城頁 */ + public static CloseMall(): void { + SystemEventManager.systems.forEach(system => system.ImplementCloseMall()); + } + + /** 離開機台 */ + public static LeaveSlot(slotID: number): void { + SystemEventManager.systems.forEach(system => system.ImplementLeaveSlot(slotID)); + } +} diff --git a/src/Engine/CatanEngine/CSharp/System/Action.ts b/src/Engine/CatanEngine/CSharp/System/Action.ts new file mode 100644 index 0000000..3231b81 --- /dev/null +++ b/src/Engine/CatanEngine/CSharp/System/Action.ts @@ -0,0 +1,125 @@ +/** + * 回呼函數: fnname (arg: TArg): void + */ +interface ActionCallback { + (arg: TArg): void; +} + +interface Struct { + callback: ActionCallback; + target: any; + once?: boolean; +} + +export class Action { + private _queue: Struct[] = []; + + /** + * 監聽事件 + * @param callback 回呼函數: fnname (arg: TArg): void + * @param bindTarget 回呼時this綁定的對象 + */ + AddCallback(callback: ActionCallback, bindTarget?: any) { + let q = >{ + callback: callback, + target: bindTarget + }; + this._queue.push(q); + } + + /** + * 監聽事件 (一次性) + * @param callback 回呼函數: fnname (arg: TArg): void + * @param bindTarget 回呼時this綁定的對象 + */ + AddCallbackOnce(callback: ActionCallback, bindTarget?: any) { + let q = >{ + callback: callback, + target: bindTarget, + once: true + }; + this._queue.push(q); + } + + /** + * 移除事件 + * @param callback + */ + RemoveByCallback(callback: ActionCallback) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.callback === callback) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除事件 + * @param bindTarget 回呼時this綁定的對象 + */ + RemoveByBindTarget(bindTarget: any) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.target === bindTarget) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除全部事件 + */ + RemoveAllCallbacks() { + this._queue.forEach(q => q.callback = undefined); + this._queue.length = 0; + } + + /** + * 發送事件 + * @param arg 參數 + */ + DispatchCallback(arg: TArg) { + let index = this._queue.length; + if (index > 0) { + let cleanRemoved = false; + this._queue.slice().forEach(q => { + if (!q.callback) { + cleanRemoved = true; + return; + } + + if (q.target) { + q.callback.call(q.target, arg); + } else { + q.callback(arg); + } + + if (q.once) { + q.callback = undefined; + cleanRemoved = true; + } + }); + + if (cleanRemoved) { + index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback) { + this._queue.splice(index, 1); + } + } + } + } + } + } +} diff --git a/src/Engine/CatanEngine/CSharp/System/ActionWithType.ts b/src/Engine/CatanEngine/CSharp/System/ActionWithType.ts new file mode 100644 index 0000000..6a0ae28 --- /dev/null +++ b/src/Engine/CatanEngine/CSharp/System/ActionWithType.ts @@ -0,0 +1,165 @@ +/** + * 回呼函數: fnname (arg: TArg): void + */ +interface ActionCallback { + (arg: TArg): void; +} + +interface Struct { + callback: ActionCallback; + target: any; + type: TType; + once?: boolean; +} + +export class ActionWithType { + private _queue: Struct[] = []; + + /** + * 監聽事件 + * @param callback 回呼函數: fnname (arg: TArg): void + * @param bindTarget 回呼時this綁定的對象 + */ + AddCallback(type: TType, callback: ActionCallback, bindTarget?: any) { + let q = >{ + callback: callback, + target: bindTarget, + type: type + }; + this._queue.push(q); + } + + /** + * 監聽事件 (一次性) + * @param callback 回呼函數: fnname (arg: TArg): void + * @param bindTarget 回呼時this綁定的對象 + */ + AddCallbackOnce(type: TType, callback: ActionCallback, bindTarget?: any) { + let q = >{ + callback: callback, + target: bindTarget, + type: type, + once: true + }; + this._queue.push(q); + } + + /** + * 移除事件 + * @param callback + */ + RemoveByCallback(callback: ActionCallback) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.callback === callback) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除事件 + * @param bindTarget 回呼時this綁定的對象 + */ + RemoveByBindTarget(bindTarget: any) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.target === bindTarget) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除事件 + * @param type 事件類型 + */ + RemoveByType(type: TType) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.type === type) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除事件 + * @param type 事件類型 + * @param callback + */ + RemoveCallback(type: TType, callback: ActionCallback) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || (q.type === type && q.callback === callback)) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除全部事件 + */ + RemoveAllCallbacks() { + this._queue.forEach(q => q.callback = undefined); + this._queue.length = 0; + } + + /** + * 發送事件 + * @param type 事件類型 + * @param arg 參數 + */ + DispatchCallback(type: TType, arg: TArg) { + let index = this._queue.length; + if (index > 0) { + let cleanRemoved = false; + this._queue.slice().forEach(q => { + if (!q.callback) { + cleanRemoved = true; + return; + } + if (q.type !== type) return; + + if (q.target) { + q.callback.call(q.target, arg); + } else { + q.callback(arg); + } + + if (q.once) { + q.callback = undefined; + cleanRemoved = true; + } + }); + + if (cleanRemoved) { + index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback) { + this._queue.splice(index, 1); + } + } + } + } + } + } +} diff --git a/src/Engine/CatanEngine/CSharp/System/ActionWithType2.ts b/src/Engine/CatanEngine/CSharp/System/ActionWithType2.ts new file mode 100644 index 0000000..24c19db --- /dev/null +++ b/src/Engine/CatanEngine/CSharp/System/ActionWithType2.ts @@ -0,0 +1,165 @@ +/** + * 回呼函數: fnname (type: TType, arg: TArg): void + */ +interface ActionCallback { + (type: TType, arg: TArg): void; +} + +interface Struct { + callback: ActionCallback; + target: any; + type: TType; + once?: boolean; +} + +export class ActionWithType2 { + private _queue: Struct[] = []; + + /** + * 監聽事件 + * @param callback 回呼函數: fnname (type: TType, arg: TArg): void + * @param bindTarget 回呼時this綁定的對象 + */ + AddCallback(type: TType, callback: ActionCallback, bindTarget?: any) { + let q = >{ + callback: callback, + target: bindTarget, + type: type + }; + this._queue.push(q); + } + + /** + * 監聽事件 (一次性) + * @param callback 回呼函數: fnname (type: TType, arg: TArg): void + * @param bindTarget 回呼時this綁定的對象 + */ + AddCallbackOnce(type: TType, callback: ActionCallback, bindTarget?: any) { + let q = >{ + callback: callback, + target: bindTarget, + type: type, + once: true + }; + this._queue.push(q); + } + + /** + * 移除事件 + * @param callback + */ + RemoveByCallback(callback: ActionCallback) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.callback === callback) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除事件 + * @param bindTarget 回呼時this綁定的對象 + */ + RemoveByBindTarget(bindTarget: any) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.target === bindTarget) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除事件 + * @param type 事件類型 + */ + RemoveByType(type: TType) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || q.type === type) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除事件 + * @param type 事件類型 + * @param callback + */ + RemoveCallback(type: TType, callback: ActionCallback) { + let index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback || (q.type === type && q.callback === callback)) { + q.callback = undefined; + this._queue.splice(index, 1); + } + } + } + } + + /** + * 移除全部事件 + */ + RemoveAllCallbacks() { + this._queue.forEach(q => q.callback = undefined); + this._queue.length = 0; + } + + /** + * 發送事件 + * @param type 事件類型 + * @param arg 參數 + */ + DispatchCallback(type: TType, arg: TArg) { + let index = this._queue.length; + if (index > 0) { + let cleanRemoved = false; + this._queue.slice().forEach(q => { + if (!q.callback) { + cleanRemoved = true; + return; + } + if (q.type !== type) return; + + if (q.target) { + q.callback.call(q.target, type, arg); + } else { + q.callback(type, arg); + } + + if (q.once) { + q.callback = undefined; + cleanRemoved = true; + } + }); + + if (cleanRemoved) { + index = this._queue.length; + if (index > 0) { + while (index--) { + let q = this._queue[index]; + if (!q.callback) { + this._queue.splice(index, 1); + } + } + } + } + } + } +} diff --git a/src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts b/src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts new file mode 100644 index 0000000..37ae6c1 --- /dev/null +++ b/src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts @@ -0,0 +1,75 @@ +export module Encoding.UTF8 { + + export function GetBytes(str: string) { + let len = str.length, resPos = -1; + let resArr = new Uint8Array(len * 3); + for (let point = 0, nextcode = 0, i = 0; i !== len;) { + point = str.charCodeAt(i), i += 1; + if (point >= 0xD800 && point <= 0xDBFF) { + if (i === len) { + resArr[resPos += 1] = 0xef; + resArr[resPos += 1] = 0xbf; + resArr[resPos += 1] = 0xbd; + break; + } + + nextcode = str.charCodeAt(i); + if (nextcode >= 0xDC00 && nextcode <= 0xDFFF) { + point = (point - 0xD800) * 0x400 + nextcode - 0xDC00 + 0x10000; + i += 1; + if (point > 0xffff) { + resArr[resPos += 1] = (0x1e << 3) | (point >>> 18); + resArr[resPos += 1] = (0x2 << 6) | ((point >>> 12) & 0x3f); + resArr[resPos += 1] = (0x2 << 6) | ((point >>> 6) & 0x3f); + resArr[resPos += 1] = (0x2 << 6) | (point & 0x3f); + continue; + } + } else { + resArr[resPos += 1] = 0xef; + resArr[resPos += 1] = 0xbf; + resArr[resPos += 1] = 0xbd; + continue; + } + } + if (point <= 0x007f) { + resArr[resPos += 1] = (0x0 << 7) | point; + } else if (point <= 0x07ff) { + resArr[resPos += 1] = (0x6 << 5) | (point >>> 6); + resArr[resPos += 1] = (0x2 << 6) | (point & 0x3f); + } else { + resArr[resPos += 1] = (0xe << 4) | (point >>> 12); + resArr[resPos += 1] = (0x2 << 6) | ((point >>> 6) & 0x3f); + resArr[resPos += 1] = (0x2 << 6) | (point & 0x3f); + } + } + return resArr.subarray(0, resPos + 1); + } + + export function GetString(array: Uint8Array) { + let str = ""; + let i = 0, len = array.length; + while (i < len) { + let c = array[i++]; + switch (c >> 4) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + str += String.fromCharCode(c); + break; + case 12: + case 13: + str += String.fromCharCode(((c & 0x1F) << 6) | (array[i++] & 0x3F)); + break; + case 14: + str += String.fromCharCode(((c & 0x0F) << 12) | ((array[i++] & 0x3F) << 6) | ((array[i++] & 0x3F) << 0)); + break; + } + } + return str; + } +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts.meta b/src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts.meta new file mode 100644 index 0000000..5dd8375 --- /dev/null +++ b/src/Engine/CatanEngine/CSharp/System/Text/Encoding.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "43bf5724-e939-4189-b981-c32ef694e5a5", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/CoroutineV2/CancellationTokenSource.ts b/src/Engine/CatanEngine/CoroutineV2/CancellationTokenSource.ts new file mode 100644 index 0000000..ef9ec11 --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/CancellationTokenSource.ts @@ -0,0 +1,44 @@ +const CANCEL = Symbol(); + +export interface CancellationToken { + readonly IsCancellationRequested: boolean; + + ThrowIfCancellationRequested(): void; +} + +export class CancellationTokenSource { + readonly Token: CancellationToken; + + constructor() { + this.Token = new CancellationTokenImpl(); + } + + Cancel() { + this.Token[CANCEL](); + } +} + +export class TaskCancelledException extends Error { + constructor() { + super("Task Cancelled"); + Reflect.setPrototypeOf(this, TaskCancelledException.prototype); + } +} + +class CancellationTokenImpl implements CancellationToken { + IsCancellationRequested: boolean; + + constructor() { + this.IsCancellationRequested = false; + } + + ThrowIfCancellationRequested() { + if (this.IsCancellationRequested) { + throw new TaskCancelledException(); + } + } + + [CANCEL]() { + this.IsCancellationRequested = true; + } +} diff --git a/src/Engine/CatanEngine/CoroutineV2/Core/ActionEnumerator.ts b/src/Engine/CatanEngine/CoroutineV2/Core/ActionEnumerator.ts new file mode 100644 index 0000000..0ee257f --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/Core/ActionEnumerator.ts @@ -0,0 +1,17 @@ +import { BaseEnumerator } from "./BaseEnumerator"; + +export class ActionEnumerator extends BaseEnumerator { + private _action: Function; + + constructor(action: Function) { + super(); + this._action = action; + } + + next(value?: any): IteratorResult { + if (this._action) { + this._action(); + } + return { done: true, value: undefined }; + } +} diff --git a/src/Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator.ts b/src/Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator.ts new file mode 100644 index 0000000..75c0840 --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator.ts @@ -0,0 +1,137 @@ +import { IEnumeratorV2, IEnumeratorV2Started } from "../IEnumeratorV2"; +import { CoroutineExecutor } from "./CoroutineExecutor"; + +let EnumeratorExecutorClass: typeof import("./EnumeratorExecutor").EnumeratorExecutor = null; +let SingleEnumeratorClass: typeof import("./SingleEnumerator").SingleEnumerator = null; +let ParallelEnumeratorClass: typeof import("./ParallelEnumerator").ParallelEnumerator = null; +let WaitTimeEnumeratorClass: typeof import("./WaitTimeEnumerator").WaitTimeEnumerator = null; +let ActionEnumeratorClass: typeof import("./ActionEnumerator").ActionEnumerator = null; + +/** + * 使用前初始場景第一個事件一定要先Init過 + * @example + * 而且不能同時間有其他onLoad在跑,放start可以 + * @example + * protected async onLoad(): Promise { + * await BaseEnumerator.Init(); + * } + */ +export abstract class BaseEnumerator implements IEnumeratorV2 { + public nextEnumerator: BaseEnumerator; + + abstract next(value?: any): IteratorResult; + + public static isInit: boolean = false; + + public static async Init(): Promise { + await Promise.all([ + (async () => { + EnumeratorExecutorClass = (await import("./EnumeratorExecutor")).EnumeratorExecutor; + })(), + (async () => { + SingleEnumeratorClass = (await import("./SingleEnumerator")).SingleEnumerator; + })(), + (async () => { + ParallelEnumeratorClass = (await import("./ParallelEnumerator")).ParallelEnumerator; + })(), + (async () => { + WaitTimeEnumeratorClass = (await import("./WaitTimeEnumerator")).WaitTimeEnumerator; + })(), + (async () => { + ActionEnumeratorClass = (await import("./ActionEnumerator")).ActionEnumerator; + })(), + ]); + BaseEnumerator.isInit = true; + } + + Start(target?: any): IEnumeratorV2Started { + let executor = LazyLoad.EnumeratorExecutor(this, target); + CoroutineExecutor.instance.StartCoroutine(executor); + return executor; + } + + Then(iterator: Iterator): IEnumeratorV2 { + if (!iterator) { + return this; + } + + if (iterator instanceof BaseEnumerator) { + BaseEnumerator.getLastEnumerator(this).nextEnumerator = iterator; + return this; + } else { + let enumerator = LazyLoad.SingleEnumerator(iterator); + BaseEnumerator.getLastEnumerator(this).nextEnumerator = enumerator; + return this; + } + } + + ThenSerial(...iterators: Iterator[]): IEnumeratorV2 { + let last = BaseEnumerator.getLastEnumerator(this); + for (let iterator of iterators) { + if (iterator instanceof BaseEnumerator) { + last.nextEnumerator = iterator; + } else { + let enumerator = LazyLoad.SingleEnumerator(iterator); + last.nextEnumerator = enumerator; + } + last = last.nextEnumerator; + } + return this; + } + + ThenParallel(...iterators: Iterator[]): IEnumeratorV2 { + return this.Then(LazyLoad.ParallelEnumerator(...iterators)); + } + + ThenAction(action: Function, delaySeconds?: number): IEnumeratorV2 { + if (delaySeconds > 0) { + return this.ThenSerial(LazyLoad.WaitTimeEnumerator(delaySeconds), LazyLoad.ActionEnumerator(action)); + } else { + return this.Then(LazyLoad.ActionEnumerator(action)); + } + } + + ThenWaitTime(seconds: number): IEnumeratorV2 { + return this.Then(LazyLoad.WaitTimeEnumerator(seconds)); + } + + static getLastEnumerator(enumerator: BaseEnumerator): BaseEnumerator { + let next = enumerator; + while (next.nextEnumerator) { + next = next.nextEnumerator; + } + return next; + } +} + +module LazyLoad { + export function EnumeratorExecutor(enumerator: BaseEnumerator, target: any) { + let newclass = new EnumeratorExecutorClass(enumerator, target); + return newclass; + // return new (require("./EnumeratorExecutor") as typeof import("./EnumeratorExecutor")).EnumeratorExecutor(enumerator, target); + } + + export function SingleEnumerator(iterator: Iterator) { + let newclass: any = new SingleEnumeratorClass(iterator); + return newclass; + // return new (require("./SingleEnumerator") as typeof import("./SingleEnumerator")).SingleEnumerator(iterator); + } + + export function ParallelEnumerator(...iterators: Iterator[]) { + let newclass: any = new ParallelEnumeratorClass(iterators); + return newclass; + // return new (require("./ParallelEnumerator") as typeof import("./ParallelEnumerator")).ParallelEnumerator(iterators); + } + + export function WaitTimeEnumerator(seconds: number) { + let newclass: any = new WaitTimeEnumeratorClass(seconds); + return newclass; + // return new (require("./WaitTimeEnumerator") as typeof import("./WaitTimeEnumerator")).WaitTimeEnumerator(seconds); + } + + export function ActionEnumerator(action: Function) { + let newclass: any = new ActionEnumeratorClass(action); + return newclass; + // return new (require("./ActionEnumerator") as typeof import("./ActionEnumerator")).ActionEnumerator(action); + } +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/CoroutineV2/Core/CoroutineExecutor.ts b/src/Engine/CatanEngine/CoroutineV2/Core/CoroutineExecutor.ts new file mode 100644 index 0000000..cbfdd4c --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/Core/CoroutineExecutor.ts @@ -0,0 +1,103 @@ +import { EnumeratorExecutor } from "./EnumeratorExecutor"; + +export class CoroutineExecutor { + private static _instance: CoroutineExecutor; + static get instance() { + return CoroutineExecutor._instance = CoroutineExecutor._instance || new CoroutineExecutor(); + } + + private _executors: EnumeratorExecutor[] = []; + private _nextExecutors: EnumeratorExecutor[] = []; + private _isRunning: boolean = false; + private _cleanRemoved: boolean = false; + private _scheduler: NodeJS.Timeout = null; + private _time: number = 0; + + constructor() { + this._time = new Date().getTime(); + console.debug("[CoroutineV2] Coroutines Start"); + this._scheduler = setInterval(this.update.bind(this), 1 / 60); + } + + StartCoroutine(executor: EnumeratorExecutor) { + executor.next(0); + // TODO: 這邊要考量next後馬上接BaseEnumerator/Iterator的情形 + + if (!this._isRunning) { + this._executors.push(executor); + + if (!this._scheduler) { + console.debug("[CoroutineV2] Coroutines Start"); + this._time = new Date().getTime(); + this._scheduler = setInterval(this.update.bind(this), 1 / 60); + } else { + // console.debug(`[CoroutineV2] Coroutines add now: ${this._executors.length}`); + } + } else { + this._nextExecutors.push(executor); + } + } + + StopCoroutineBy(target: any) { + if (!target) return; + + for (let r of this._executors) { + if (target === r.target) { + r.Stop(); + } + } + + for (let r of this._nextExecutors) { + if (target === r.target) { + r.Stop(); + } + } + } + + update() { + const time: number = new Date().getTime(); + const delta: number = (time - this._time) / 1000; + this._time = time; + if (this._nextExecutors.length) { + this._executors.push(...this._nextExecutors); + // console.debug(`[CoroutineV2] Coroutines addNext now: ${this._executors.length}, next: ${this._nextExecutors.length}`); + this._nextExecutors.length = 0; + } + + if (this._cleanRemoved) { + // 移除[doneFlag=true]的協程 + let index = this._executors.length; + while (index--) { + let r = this._executors[index]; + if (r.doneFlag) { + this._executors.splice(index, 1); + // console.debug(`[CoroutineV2] Coroutines sub now: ${this._executors.length}`); + } + } + this._cleanRemoved = false; + } + + if (this._executors.length == 0) { + console.debug("[CoroutineV2] All Coroutines Done"); + clearInterval(this._scheduler); + this._scheduler = null; + return; + } + + this._isRunning = true; + + // 執行協程 + for (let r of this._executors) { + if (r.doneFlag || r.pauseFlag || r.childFlag) { + if (r.doneFlag) { + this._cleanRemoved = true; + } + continue; + } + + r.next(delta); + } + + this._isRunning = false; + } +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/CoroutineV2/Core/EnumeratorExecutor.ts b/src/Engine/CatanEngine/CoroutineV2/Core/EnumeratorExecutor.ts new file mode 100644 index 0000000..5ebe234 --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/Core/EnumeratorExecutor.ts @@ -0,0 +1,167 @@ +import { IEnumeratorV2Started } from "../IEnumeratorV2"; +import { BaseEnumerator } from "./BaseEnumerator"; +import { SingleEnumerator } from "./SingleEnumerator"; + +export class EnumeratorExecutor implements IEnumeratorV2Started { + public Current: any; + + public target: any; + public pauseFlag: boolean; + public doneFlag: boolean; + public childFlag: boolean; + public asyncFlag: boolean; + public error: any; + + private _executor: EnumeratorExecutor; + private _enumerator: BaseEnumerator; + + constructor(enumerator: BaseEnumerator, target: any) { + this.target = target; + this._enumerator = enumerator; + } + + next(delta?: any): IteratorResult { + if (this._executor && this._executor.doneFlag) { + this._executor = null; + } + + if (this.doneFlag || (!this._enumerator && !this._executor)) { + this.doneFlag = true; + return { done: true, value: undefined }; + } + + if (this.asyncFlag || this.pauseFlag) return { done: false, value: undefined }; + + let result: IteratorResult; + + if (this._executor) { + result = this._executor.next(delta); + this.Current = this._executor.Current; + if (this._executor.doneFlag) { + this._executor = null; + } else { + result.done = false; + return result; + } + } + + if (!this._enumerator) { + this.doneFlag = true; + return { done: true, value: undefined }; + } + + try { + result = this._enumerator.next(delta); + let value = result.value; + let done = result.done; + + if (value) { + // Iterator + if (typeof value[Symbol.iterator] === "function") { + value = new SingleEnumerator(>value); + } + + if (value instanceof BaseEnumerator) { + if (!done) { + BaseEnumerator.getLastEnumerator(value).nextEnumerator = this._enumerator; + } + this._enumerator = value; + result = this._enumerator.next(delta); + value = result.value; + done = result.done; + + if (value) { + // Iterator again + if (typeof value[Symbol.iterator] === "function") { + value = new SingleEnumerator(>value); + } + + if (value instanceof BaseEnumerator) { + if (!done) { + BaseEnumerator.getLastEnumerator(value).nextEnumerator = this._enumerator; + } + this._enumerator = value; + result.done = false; + done = false; + } + } + } + + if (value instanceof EnumeratorExecutor) { + if (done) { + this._enumerator = this._enumerator.nextEnumerator; + } + value.childFlag = true; + result.done = false; + done = false; + this._executor = value; + } else if (Promise.resolve(value) === value) { + this.asyncFlag = true; + result.done = false; + done = false; + (>value) + .then(v => { + this.asyncFlag = false; + this.Current = v; + if (done) { + this._enumerator = this._enumerator.nextEnumerator; + } + }) + .catch(e => { + this.asyncFlag = false; + this.doneFlag = true; + this._enumerator = null; + this.error = e; + if (e instanceof Error) { + console.error(e.stack); + } else { + console.error(`Error: ${ JSON.stringify(e) }`); + } + }); + } + + this.Current = value; + } + + if (done) { + this._enumerator = this._enumerator.nextEnumerator; + if (this._enumerator) { + result.done = false; + } + } + } catch (e) { + this.doneFlag = true; + this.error = e; + if (e instanceof Error) { + console.error(e.stack); + } else { + console.error(`Error: ${ JSON.stringify(e) }`); + } + result = { done: true, value: e }; + } + + return result; + } + + Stop(): void { + this.doneFlag = true; + if (this._executor) { + this._executor.Stop(); + } + } + + Pause(): void { + this.pauseFlag = true; + if (this._executor) { + this._executor.Pause(); + } + } + + Resume(): void { + this.pauseFlag = false; + if (this._executor) { + this._executor.Resume(); + } + } + +} diff --git a/src/Engine/CatanEngine/CoroutineV2/Core/ParallelEnumerator.ts b/src/Engine/CatanEngine/CoroutineV2/Core/ParallelEnumerator.ts new file mode 100644 index 0000000..43387e4 --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/Core/ParallelEnumerator.ts @@ -0,0 +1,46 @@ +import { BaseEnumerator } from "./BaseEnumerator"; +import { EnumeratorExecutor } from "./EnumeratorExecutor"; +import { SingleEnumerator } from "./SingleEnumerator"; + +export class ParallelEnumerator extends BaseEnumerator { + private _executors: EnumeratorExecutor[] = []; + + constructor(iterators: Iterator[]) { + super(); + if (iterators && iterators.length) { + for (let iterator of iterators) { + if (iterator instanceof BaseEnumerator) { + this._executors.push(new EnumeratorExecutor(iterator, null)); + } else { + this._executors.push(new EnumeratorExecutor(new SingleEnumerator(iterator), null)); + } + } + } + } + + next(value?: any): IteratorResult { + if (this._executors.length) { + // 先移除[doneFlag=true]協程 + let index = this._executors.length; + while (index--) { + let r = this._executors[index]; + if (r.doneFlag) { + this._executors.splice(index, 1); + } + } + + if (this._executors.length == 0) { + return { done: true, value: undefined }; + } + + // 執行協程 + for (let r of this._executors) { + r.next(value); + } + + return { done: false, value: undefined }; + } + + return { done: true, value: undefined }; + } +} diff --git a/src/Engine/CatanEngine/CoroutineV2/Core/SingleEnumerator.ts b/src/Engine/CatanEngine/CoroutineV2/Core/SingleEnumerator.ts new file mode 100644 index 0000000..fc51ed0 --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/Core/SingleEnumerator.ts @@ -0,0 +1,18 @@ +import { BaseEnumerator } from "./BaseEnumerator"; + +export class SingleEnumerator extends BaseEnumerator { + private _iterator: Iterator; + + constructor(iterator: Iterator) { + super(); + this._iterator = iterator; + } + + next(value?: any): IteratorResult { + if (!this._iterator) { + return { done: true, value: undefined }; + } + + return this._iterator.next(value); + } +} diff --git a/src/Engine/CatanEngine/CoroutineV2/Core/WaitTimeEnumerator.ts b/src/Engine/CatanEngine/CoroutineV2/Core/WaitTimeEnumerator.ts new file mode 100644 index 0000000..604d60e --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/Core/WaitTimeEnumerator.ts @@ -0,0 +1,21 @@ +import { BaseEnumerator } from "./BaseEnumerator"; + +export class WaitTimeEnumerator extends BaseEnumerator { + private _seconds: number; + + constructor(seconds: number) { + super(); + this._seconds = seconds; + } + + next(value?: any): IteratorResult { + let delta = value as number; + this._seconds -= delta; + + if (this._seconds <= 0) { + return { done: true, value: 0 }; + } else { + return { done: false, value: this._seconds }; + } + } +} diff --git a/src/Engine/CatanEngine/CoroutineV2/CoroutineExample.ts b/src/Engine/CatanEngine/CoroutineV2/CoroutineExample.ts new file mode 100644 index 0000000..5c4a3af --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/CoroutineExample.ts @@ -0,0 +1,133 @@ +import { CoroutineV2 } from "./CoroutineV2"; + +export default class CoroutineExample { + private _obj: Object = { "a": true }; + private _obj2: Object = { "b": true }; + + private _num: number = 3; + + /** + * + */ + constructor() { + CoroutineV2.Single(this.Test1_1()).Start(); + } + + *Test1_1() { + yield null; + yield* this.Test1_2(); + // CoroutineV2.Single(this.Test1_3()).Start(this); + yield this.Test1_3(); + } + + *Test1_2() { + yield null; + } + + *Test1_3() { + yield this.Test1_3_1(); + yield CoroutineV2.Single(this.Test1_4()).Start(this._obj); + // yield CoroutineV2.Single(this.Test1_4()); //.Start(this); + // yield *this.Test1_4(); + console.log("main wait 3"); + yield CoroutineV2.WaitTime(2); + console.log("done"); + } + + *Test1_3_1() { + yield this.Test1_3_2(); + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_1.1"); + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_1.2"); + } + + *Test1_3_2() { + yield this.Test1_3_3(); + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_2.1"); + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_2.2"); + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_2.3"); + } + + *Test1_3_3() { + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_3.1"); + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_3.2"); + yield CoroutineV2.WaitTime(1); + console.log("Test1_3_3.3"); + } + + *Test1_4() { + this._num++; + console.log(`WaitTime2 ${this._num}`); + yield CoroutineV2.WaitTime(2).Start(this._obj2); + this._num++; + console.log(`WaitTime2 ${this._num}`); + yield CoroutineV2.WaitTime(2).Start(this._obj2); + this._num++; + console.log(`WaitTime2 ${this._num}`); + } + + *Test2_1() { + console.log("111"); + CoroutineV2.Single(this.Test2_2()).Start(this); + console.log("333"); + } + + *Test2_2() { + console.log("222"); + return; + } + + *Coroutine1(start: number, end: number) { + for (let i = start; i <= end; i++) { + // yield CoroutineV2.WaitTime(1).Start(); // Start()可以省略, 會由外層啟動 + // yield CoroutineV2.WaitTime(1).Start(this); // target也可以省略, 由外層的target控制 + + yield CoroutineV2.WaitTime(1).Start(); + console.log(`C1 => ${i}`); + + // 嵌套 + yield CoroutineV2 + .WaitTime(1) + .ThenParallel( + // 再嵌套 + CoroutineV2.Action(() => console.log("start parallel")), + this.Coroutine2(10, 2), + this.Coroutine2(20, 2), + ) + .ThenAction(() => console.log("end parallel")) + .Start(); + + // Promise + yield this.loadItemAsync("settings.json"); + } + } + + *Coroutine2(num: number, repeat: number) { + for (let i = 0; i < repeat; i++) { + //yield CoroutineV2.WaitTime(2); + yield 0; + console.log(`C2: ${num}`); + // yield CoroutineV2.WaitTime(1); + } + } + + actionCallback() { + console.log("action callback 2"); + } + + loadItemAsync(id: string): Promise<{ id: string }> { + return new Promise((resolve) => { + console.log("loading item start:", id); + setTimeout(() => { + resolve({ id: id }); + console.log("loading item done:", id); + }, 3000); + }); + } +} diff --git a/src/Engine/CatanEngine/CoroutineV2/CoroutineV2.ts b/src/Engine/CatanEngine/CoroutineV2/CoroutineV2.ts new file mode 100644 index 0000000..75d2157 --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/CoroutineV2.ts @@ -0,0 +1,75 @@ +import { ActionEnumerator } from "./Core/ActionEnumerator"; +import { BaseEnumerator } from "./Core/BaseEnumerator"; +import { CoroutineExecutor } from "./Core/CoroutineExecutor"; +import { ParallelEnumerator } from "./Core/ParallelEnumerator"; +import { SingleEnumerator } from "./Core/SingleEnumerator"; +import { WaitTimeEnumerator } from "./Core/WaitTimeEnumerator"; +import { IEnumeratorV2, IEnumeratorV2Started } from "./IEnumeratorV2"; + +export module CoroutineV2 { + /** + * 啟動一般協程 + */ + export function StartCoroutine(iterator: Iterator, target?: any): IEnumeratorV2Started { + return Single(iterator).Start(target); + } + + /** + * 依據IEnumeratorV2.Start(target)綁定的目標, 來停止協程 + * @param target + */ + export function StopCoroutinesBy(target: any) { + CoroutineExecutor.instance.StopCoroutineBy(target); + } + + /** + * 單一協程 + */ + export function Single(iterator: Iterator): IEnumeratorV2 { + if (iterator instanceof BaseEnumerator) { + return iterator; + } else { + return new SingleEnumerator(iterator); + } + } + + /** + * 平行協程 + */ + export function Parallel(...iterators: Iterator[]): IEnumeratorV2 { + return new ParallelEnumerator(iterators); + } + + /** + * 序列協程 + */ + export function Serial(...iterators: Iterator[]): IEnumeratorV2 { + let [iterator, ...others] = iterators; + if (iterator instanceof BaseEnumerator) { + return iterator.ThenSerial(...others); + } else { + return new SingleEnumerator(iterator).ThenSerial(...others); + } + } + + /** + * 執行方法協程 + * @param action 方法 + * @param delaySeconds 延遲秒數 + */ + export function Action(action: Function, delaySeconds?: number): IEnumeratorV2 { + if (delaySeconds > 0) { + return new WaitTimeEnumerator(delaySeconds).Then(new ActionEnumerator(action)); + } else { + return new ActionEnumerator(action); + } + } + + /** + * 等待時間協程 + * @param seconds 秒數 + */ + export function WaitTime(seconds: number): IEnumeratorV2 { + return new WaitTimeEnumerator(seconds); + } +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/CoroutineV2/IEnumeratorV2.ts b/src/Engine/CatanEngine/CoroutineV2/IEnumeratorV2.ts new file mode 100644 index 0000000..2f872cb --- /dev/null +++ b/src/Engine/CatanEngine/CoroutineV2/IEnumeratorV2.ts @@ -0,0 +1,23 @@ +export interface IEnumeratorV2 extends Iterator { + Start(target?: any): IEnumeratorV2Started; + + Then(iterator: Iterator): IEnumeratorV2; + + ThenSerial(...iterators: Iterator[]): IEnumeratorV2; + + ThenParallel(...iterators: Iterator[]): IEnumeratorV2; + + ThenAction(action: Function, delaySeconds?: number): IEnumeratorV2; + + ThenWaitTime(seconds: number): IEnumeratorV2; +} + +export interface IEnumeratorV2Started { + readonly Current: any; + + Pause(): void; + + Resume(): void; + + Stop(): void; +} diff --git a/src/Engine/CatanEngine/NetManagerV2/Core/INetConnector.ts b/src/Engine/CatanEngine/NetManagerV2/Core/INetConnector.ts new file mode 100644 index 0000000..343bb96 --- /dev/null +++ b/src/Engine/CatanEngine/NetManagerV2/Core/INetConnector.ts @@ -0,0 +1,15 @@ +import { Action } from "../../CSharp/System/Action"; +import { INetRequest } from "./INetRequest"; +import { INetResponse } from "./INetResponse"; + +export interface INetConnector { + readonly OnDataReceived: Action>; + readonly OnDisconnected: Action; + readonly IsConnected: boolean; + + SendAsync(req: INetRequest): Iterator; + + Send(req: INetRequest); + + Logout(); +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/NetManagerV2/Core/INetRequest.ts b/src/Engine/CatanEngine/NetManagerV2/Core/INetRequest.ts new file mode 100644 index 0000000..8ab4f86 --- /dev/null +++ b/src/Engine/CatanEngine/NetManagerV2/Core/INetRequest.ts @@ -0,0 +1,13 @@ +import { INetResponse } from "./INetResponse"; + +export interface INetRequest { + readonly Method: string; + readonly MethodBack: string; + + Data: TRequest; + Result: INetResponse; + + SendAsync(): Iterator; + + Send(); +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/NetManagerV2/Core/INetResponse.ts b/src/Engine/CatanEngine/NetManagerV2/Core/INetResponse.ts new file mode 100644 index 0000000..91e0bb1 --- /dev/null +++ b/src/Engine/CatanEngine/NetManagerV2/Core/INetResponse.ts @@ -0,0 +1,6 @@ +export interface INetResponse { + readonly Method: string; + readonly Status: number; + readonly Data: TResponse; + readonly IsValid: boolean; +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/NetManagerV2/NetConfig.ts b/src/Engine/CatanEngine/NetManagerV2/NetConfig.ts new file mode 100644 index 0000000..dfd5645 --- /dev/null +++ b/src/Engine/CatanEngine/NetManagerV2/NetConfig.ts @@ -0,0 +1,4 @@ +export default class NetConfig { + /** 是否顯示RPC接送JSON的LOG */ + public static ShowServerLog: boolean = true; +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/NetManagerV2/NetConnector.ts b/src/Engine/CatanEngine/NetManagerV2/NetConnector.ts new file mode 100644 index 0000000..2062b65 --- /dev/null +++ b/src/Engine/CatanEngine/NetManagerV2/NetConnector.ts @@ -0,0 +1,279 @@ +import Event from "@/modules/event"; +import { Action } from "../CSharp/System/Action"; +import { Encoding } from "../CSharp/System/Text/Encoding"; +import { BaseEnumerator } from "../CoroutineV2/Core/BaseEnumerator"; +import { INetRequest } from "./Core/INetRequest"; +import { INetResponse } from "./Core/INetResponse"; +import NetConfig from "./NetConfig"; + +export namespace Socket { + export const Connect = Symbol("socket.connect"); + export const Message = Symbol("socket.message"); + export const Disconnect = Symbol("socket.disconnect"); + export const Error = Symbol("socket.error"); +} + +export interface Func { + [Socket.Connect]: () => void, + [Socket.Message]: (e) => void, + [Socket.Disconnect]: () => void, + [Socket.Error]: () => void, +} + +export class NetConnector { + /** Event */ + public readonly event: Event = new Event(); + readonly OnDataReceived: Action> = new Action>(); + readonly OnDisconnected: Action = new Action(); + readonly OnLoadUIMask: Action = new Action(); + + get IsConnected() { + return this._ws && this._ws.readyState === WebSocket.OPEN; + } + + public get ws(): WebSocket { + return this._ws; + } + + private _host: string; + private _ws: WebSocket; + private _waitings: WsRequestEnumerator[] = []; + + constructor(host: string, port: number) { + let checkHttp: string = ""; + let index: number = host.indexOf("https://"); + if (index != -1) { + checkHttp = "https"; + host = host.replace("https://", ""); + } else { + checkHttp = window.location.href.substring(0, 5); + host = host.replace("http://", ""); + } + // if (CC_DEBUG) { + console.debug("[事件]checkHttp=", checkHttp, host, port); + // } + if (checkHttp != "https") { + this._host = `ws://${host}:${port}`; + } else { + this._host = `wss://${host}:${port}`; + } + } + + ConnectAsync() { + if (this._ws) { + throw new Error("請先執行CasinoNetManager.Disconnect()中斷連線"); + } + this._ws = new WebSocket(this._host); + + this._ws.binaryType = "arraybuffer"; + this._ws.onopen = this.OnWebSocketOpen.bind(this); + this._ws.onmessage = this.OnWebSocketMessage.bind(this); + this._ws.onclose = this.OnWebSocketClose.bind(this); + this._ws.onerror = this.OnWebSocketError.bind(this); + + return new WsConnectEnumerator(this._ws); + } + + Send(req: INetRequest) { + if (!this.IsConnected) return; + + let json = [req.Method]; + if (req.Data != null && req.Data != undefined && !Number.isNaN(req.Data)) { + json[1] = req.Data; + } + + // if (CC_DEBUG && NetConfig.ShowServerLog) { + if (NetConfig.ShowServerLog) { + if (req.Data != null && req.Data != undefined && !Number.isNaN(req.Data)) { + console.debug(`[RPC] 傳送server資料: ${req.Method}(${JSON.stringify(req.Data)})`); + } else { + console.debug(`[RPC] 傳送server資料: ${req.Method}()`); + } + } + + let str = JSON.stringify(json); + if (str.length > 65535) { + throw new Error("要傳的資料太大囉"); + } + + let strary = Encoding.UTF8.GetBytes(str); + let buffer = new Uint8Array(4 + strary.byteLength); + let u16ary = new Uint16Array(buffer.buffer, 0, 3); + u16ary[0] = strary.byteLength; + buffer[3] = 0x01; + buffer.set(strary, 4); + + this._ws.send(buffer); + } + + SendAsync(req: INetRequest, mask: boolean) { + let iterator = new WsRequestEnumerator(req); + if (!this.IsConnected) { + iterator.SetResponse(ErrorResponse); + } else { + this._waitings.push(iterator); + if (mask) { + this.OnLoadUIMask.DispatchCallback(true); + } + this.Send(req); + } + return iterator; + } + + Disconnect() { + this.WebSocketEnded(); + } + + private WebSocketEnded() { + if (!this._ws) return; + + this._ws.close(); + this._ws.onopen = null; + this._ws.onmessage = null; + this._ws.onclose = () => { + }; + this._ws = null; + + this.CleanWaitings(); + this.OnDisconnected.DispatchCallback(); + } + + private CleanWaitings() { + for (let w of this._waitings) { + w.SetResponse(ErrorResponse); + this.OnLoadUIMask.DispatchCallback(false); + } + this._waitings.length = 0; + } + + private OnWebSocketOpen(e: Event) { + // if (CC_DEBUG) { + console.debug(`[RPC] ${this._host} Connected.`); + // } + this.event.emit(Socket.Connect); + } + + private OnWebSocketMessage(e: MessageEvent) { + if (e.data instanceof ArrayBuffer) { + this.ParseRpcMessage(e.data, e); + } else if (e.data instanceof Blob) { + let reader = new FileReader(); + reader.onload = (e) => { + this.ParseRpcMessage(reader.result, e); + reader.onload = null; + }; + reader.readAsArrayBuffer(e.data); + } else { + throw new Error(`未知的OnWebSocketMessage(e.data)類型: ${e.data}`); + } + } + + private ParseRpcMessage(buffer: ArrayBuffer, e: any) { + let startIndex = 0, byteLength = buffer.byteLength; + while (startIndex + 4 < byteLength) { + let strlen = new DataView(buffer, startIndex, 3).getUint16(0, true); + let str = Encoding.UTF8.GetString(new Uint8Array(buffer, startIndex + 4, strlen)); + startIndex += strlen + 4; + + try { + let json = JSON.parse(str); + let method = json[0]; + let status = json[1][0]; + let data = json[1][1]; + + let resp = >{ + Method: method, + Status: status, + Data: data, + IsValid: method && status === 0 + }; + + // if (CC_DEBUG && NetConfig.ShowServerLog) { + if (NetConfig.ShowServerLog) { + if (data) { + console.debug(`[RPC] 收到server呼叫:(${resp.Status}): ${resp.Method}(${JSON.stringify(resp.Data)})`); + } else { + console.debug(`[RPC] 收到server呼叫:(${resp.Status}): ${resp.Method}()`); + } + } + + let dispatch = true; + let isCocos = false; + for (let i = 0, len = this._waitings.length; i < len; i++) { + let w = this._waitings[i]; + if (w.MethodBack === resp.Method) { + dispatch = false; + this._waitings.splice(i, 1); + w.SetResponse(resp); + this.OnLoadUIMask.DispatchCallback(false); + break; + } + } + + if (dispatch) { + this.OnDataReceived.DispatchCallback(resp); + } + } catch { + throw new Error(`[RPC] 無法解析Server回應: ${str}`); + } + } + } + + private OnWebSocketClose(e: CloseEvent) { + this.WebSocketEnded(); + this.event.emit(Socket.Disconnect); + } + + private OnWebSocketError(e: CloseEvent) { + this.event.emit(Socket.Error); + } +} + +const ErrorResponse: INetResponse = { + Status: -1, + Method: "", + Data: {}, + IsValid: false, +}; + +class WsConnectEnumerator extends BaseEnumerator { + private _ws: WebSocket; + + constructor(ws: WebSocket) { + super(); + this._ws = ws; + } + + next(value?: any): IteratorResult { + return { + done: this._ws.readyState === WebSocket.OPEN || this._ws.readyState === WebSocket.CLOSED, + value: undefined + }; + } +} + +class WsRequestEnumerator extends BaseEnumerator { + readonly MethodBack: string; + + private _req: INetRequest; + private _done: boolean = false; + + constructor(req: INetRequest) { + super(); + + this._req = req; + this.MethodBack = req.MethodBack; + } + + SetResponse(resp: INetResponse) { + this._req.Result = resp; + this._done = true; + } + + next(value?: any): IteratorResult { + return { + done: this._done, + value: undefined + }; + } +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/NetManagerV2/NetManager.ts b/src/Engine/CatanEngine/NetManagerV2/NetManager.ts new file mode 100644 index 0000000..8062dfe --- /dev/null +++ b/src/Engine/CatanEngine/NetManagerV2/NetManager.ts @@ -0,0 +1,54 @@ +import { INetRequest } from "./Core/INetRequest"; +import { NetConnector } from "./NetConnector"; + +export class NetManager { + static get IsConnected() { + return this._connector && this._connector.IsConnected; + } + + static get HasInit() { + return this._connector != null; + } + + private static _connector: NetConnector; + + static Initialize(connector: NetConnector) { + this._connector = connector; + } + + static ConnectAsync() { + this.CheckConnector(); + return this._connector.ConnectAsync(); + } + + /** + * 斷線 + */ + static Disconnect() { + this.CheckConnector(); + this._connector.Disconnect(); + } + + /** + * 傳送資料給Server, 不等待回應 + * @param req + */ + static Send(req: INetRequest) { + this.CheckConnector(); + this._connector.Send(req); + } + + /** + * 傳送資料給Server, 並等待回應 + * @param req + */ + static SendAsync(req: INetRequest, mask: boolean) { + this.CheckConnector(); + return this._connector.SendAsync(req, mask); + } + + private static CheckConnector() { + if (!this._connector) throw new Error("請先呼叫CasinoNetManager.Initialize()初始化connector"); + } + +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/NetManagerV2/NetRequest.ts b/src/Engine/CatanEngine/NetManagerV2/NetRequest.ts new file mode 100644 index 0000000..669342a --- /dev/null +++ b/src/Engine/CatanEngine/NetManagerV2/NetRequest.ts @@ -0,0 +1,28 @@ +import { VueNetConnector } from "@/assets/VueScript/Net/VueNetConnector"; +import { INetRequest } from "./Core/INetRequest"; + +export abstract class NetRequest implements INetRequest { + abstract get Method(): string; + + get MethodBack(): string { + return this.Method; + } + + Data: TResquest; + Result: import("./Core/INetResponse").INetResponse; + + /** + * 在大廳呼叫Cocos會收到SERVER主動通知 + * 在大廳呼叫Cocos會收到SERVER主動通知 + * 在大廳呼叫Cocos會收到SERVER主動通知 + */ + SendAsync(mask: boolean = false): Iterator { + // return NetManager.SendAsync(this, mask); + return VueNetConnector.SendAsync(this, mask); + } + + Send() { + // NetManager.Send(this); + VueNetConnector.Send(this); + } +} diff --git a/src/Engine/CatanEngine/TableV3/Core/ITableJson.ts b/src/Engine/CatanEngine/TableV3/Core/ITableJson.ts new file mode 100644 index 0000000..a1a8f58 --- /dev/null +++ b/src/Engine/CatanEngine/TableV3/Core/ITableJson.ts @@ -0,0 +1,4 @@ +export interface ITableJson { + cols: string[], + rows: any[], +} diff --git a/src/Engine/CatanEngine/TableV3/Core/ITableRow.ts b/src/Engine/CatanEngine/TableV3/Core/ITableRow.ts new file mode 100644 index 0000000..b8f4b5c --- /dev/null +++ b/src/Engine/CatanEngine/TableV3/Core/ITableRow.ts @@ -0,0 +1,10 @@ +export interface ITableRow { + Id: number; +} + +/** + * 表沒有欄位 + */ +export class WithoutRow implements ITableRow { + Id: number; +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/TableV3/Core/TableBase.ts b/src/Engine/CatanEngine/TableV3/Core/TableBase.ts new file mode 100644 index 0000000..b0ff96c --- /dev/null +++ b/src/Engine/CatanEngine/TableV3/Core/TableBase.ts @@ -0,0 +1,30 @@ +import { ITableRow } from "./ITableRow"; + +export abstract class TableBase extends Array { + constructor() { + super(); + Object.setPrototypeOf(this, new.target.prototype); + } + + /** 欄位數量 */ + public get Count(): number { + return this.length; + } + + /** 取得全部鍵值 */ + public get Keys(): string[] { + return Object.keys(this); + } + + /** 取得全部欄位值 */ + public get Rows(): Array { + return Object["values"](this); + } + + // public get Rows(): Array { return this; } + + /** 是否包含該Id值的欄位 */ + public ContainsRow(id: number): boolean { + return id in this; + } +} \ No newline at end of file diff --git a/src/Engine/CatanEngine/TableV3/Examples/CSSettingsV3Example.ts b/src/Engine/CatanEngine/TableV3/Examples/CSSettingsV3Example.ts new file mode 100644 index 0000000..e6b5793 --- /dev/null +++ b/src/Engine/CatanEngine/TableV3/Examples/CSSettingsV3Example.ts @@ -0,0 +1,13 @@ +import { TableManager } from "../TableManager"; +import { StringExampleTableRow, StringTableExample } from "./Tables/StringTableExample"; + +export default class CSSettingsV3Example { + + private static _stringExample: StringTableExample; + + /** 共用_字串表#string.xlsx */ + public static get StringExample(): StringTableExample { + return this._stringExample = this._stringExample || TableManager.InitTable("#string", StringTableExample, StringExampleTableRow); + } + +} diff --git a/src/Engine/CatanEngine/TableV3/Examples/TableUseExample.ts b/src/Engine/CatanEngine/TableV3/Examples/TableUseExample.ts new file mode 100644 index 0000000..cfb6e23 --- /dev/null +++ b/src/Engine/CatanEngine/TableV3/Examples/TableUseExample.ts @@ -0,0 +1,78 @@ +import CSSettingsV3Example from "./CSSettingsV3Example"; +import { StringExampleTable } from "./Tables/StringTableExample"; + +export default class TableUseExample { + + start() { + + // #region StringExample表 + console.log("----------------#stringExample"); + console.log(CSSettingsV3Example.StringExample instanceof StringExampleTable); // true + console.log(Array.isArray(CSSettingsV3Example.StringExample)); // true, 所以Array相關的方法都可以拿來操作 + + console.log(CSSettingsV3Example.StringExample.length); + console.log(CSSettingsV3Example.StringExample.Count); // 跟length一樣 + + console.log(CSSettingsV3Example.StringExample.ContainsRow(11)); // 是否包含id=11的Row + console.log(11 in CSSettingsV3Example.StringExample); // 同上 + + console.log(CSSettingsV3Example.StringExample[1].MsgZnCh); + console.log(CSSettingsV3Example.StringExample[1]["MsgZnCh"]); // 同上 + console.log(CSSettingsV3Example["StringExample"][1]["MsgZnCh"]); // 同上 + + console.log("----------------"); + for (let row of CSSettingsV3Example.StringExample) { + if (row) { // 如果Row沒有連號, 那有可能取到undefined值, 要先判斷, 不想判斷就用 CSSettings.StringExample.Rows + console.log(row.Id, row.MsgZnCh); + } + } + + console.log("----------------"); + for (let id of CSSettingsV3Example.StringExample.Keys) { + console.log(id); // 只會列出有值的id, undefined會跳過 + } + + console.log("----------------"); + for (let row of CSSettingsV3Example.StringExample.Rows) { + console.log(row.Id, row.MsgZnCh); // 只會列出有值的Row, undefined會跳過 + } + // #endregion + + // #region StringExample表 #StringFilter表 + console.log("----------------#stringExample#string_filter"); + // console.log(CSSettings.StringExample.StringFilter instanceof StringFilterTable); // true + console.log(Array.isArray(CSSettingsV3Example.StringExample.StringFilter)); // true, 所以Array相關的方法都可以拿來操作 + + console.log(CSSettingsV3Example.StringExample.StringFilter.length); + console.log(CSSettingsV3Example.StringExample.StringFilter.Count); // 跟length一樣 + + console.log(CSSettingsV3Example.StringExample.StringFilter.ContainsRow(11)); // 是否包含id=11的Row + console.log(11 in CSSettingsV3Example.StringExample.StringFilter); // 同上 + + console.log(CSSettingsV3Example.StringExample.StringFilter[1].FilterWord); + console.log(CSSettingsV3Example.StringExample.StringFilter[1]["FilterWord"]); // 同上 + console.log(CSSettingsV3Example["StringExample"]["StringFilter"][1]["FilterWord"]); // 同上 + + console.log("----------------"); + for (let row of CSSettingsV3Example.StringExample.StringFilter) { + if (row) { // 如果Row沒有連號, 那有可能取到undefined值, 要先判斷, 不想判斷就用 CSSettings.StringExample.StringFilter.Rows + console.log(row.Id, row.FilterWord); + } + } + + console.log("----------------"); + for (let id of CSSettingsV3Example.StringExample.StringFilter.Keys) { + console.log(id); // 只會列出有值的id, undefined會跳過 + } + + console.log("----------------"); + for (let row of CSSettingsV3Example.StringExample.StringFilter.Rows) { + console.log(row.Id, row.FilterWord); // 只會列出有值的Row, undefined會跳過 + } + // #endregion + + console.log("----------------"); + // CSSettingsV3.ResetTables(); // 重置表 + + } +} diff --git a/src/Engine/CatanEngine/TableV3/Examples/Tables/StringTableExample.ts b/src/Engine/CatanEngine/TableV3/Examples/Tables/StringTableExample.ts new file mode 100644 index 0000000..d9329e8 --- /dev/null +++ b/src/Engine/CatanEngine/TableV3/Examples/Tables/StringTableExample.ts @@ -0,0 +1,50 @@ +import { ITableRow } from "../../Core/ITableRow"; +import { TableBase } from "../../Core/TableBase"; +import { TableManager } from "../../TableManager"; + +/** + * 共用_字串表#string.xlsx + * ##程式碼由工具產生, 在此做的修改都將被覆蓋## + */ +export class StringTableExample extends TableBase { + private _stringFilter: StringFilterTable; + + /** 共用_字串表#string.xlsx > #string_filter */ + public get StringFilter(): StringFilterTable { + return this._stringFilter = this._stringFilter || TableManager.InitTable("#string#string_filter", StringFilterTable, StringFilterTableRow); + } +} + +/** + * #string + */ +export class StringExampleTable extends TableBase { +} + +export class StringExampleTableRow implements ITableRow { + /** 編號 */ + Id: number; + /** 英文訊息 */ + MsgEn: string; + /** 繁體中文訊息 */ + MsgZnTw: string; + /** 簡體中文讯息 */ + MsgZnCh: string; + /** 越南文讯息 */ + MsgVi: string; + /** 泰文讯息 */ + MsgTh: string; +} + +/** + * #string_filter + */ +export class StringFilterTable extends TableBase { +} + +export class StringFilterTableRow implements ITableRow { + /** 編號 */ + Id: number; + /** 過濾字串 */ + FilterWord: string; +} diff --git a/src/Engine/CatanEngine/TableV3/TableManager.ts b/src/Engine/CatanEngine/TableV3/TableManager.ts new file mode 100644 index 0000000..b7ebfd8 --- /dev/null +++ b/src/Engine/CatanEngine/TableV3/TableManager.ts @@ -0,0 +1,53 @@ +import { ITableJson } from "./Core/ITableJson"; +import { ITableRow } from "./Core/ITableRow"; + +export class TableManager { + private static _tableJsons: { [key: string]: ITableJson } = {}; + + public static AddJsonAssets(jsonAssets: JSON[]) { + if (!jsonAssets) return; + const newAssets: JSON[] = jsonAssets.concat(); + for (const jsonAsset of newAssets) { + this.AddJsonAsset(jsonAsset); + } + } + + public static AddJsonAsset(jsonAsset: JSON) { + if (!jsonAsset) { + return; + } + for (const tableName in jsonAsset) { + console.debug(`TableV3 [${ tableName }] json loaded`); + this._tableJsons[tableName] = jsonAsset[tableName]; + } + } + + public static GetTable(name: string): ITableJson { + return this._tableJsons[name]; + } + + public static InitTable>( + name: string, + tableType: { new(): T }, + rowType: { new(): ITableRow }, + ): T { + const json = this._tableJsons[name]; + if (!json) { + return null; + // throw new Error(`TableV3 [${name}] 尚未載入json檔`); + } + const table = new tableType(); + const cols = json.cols; + const colLength = cols.length; + const rows = json.rows; + for (const r of rows) { + const trow = new rowType(); + for (let i = 0; i < colLength; i++) { + trow[cols[i]] = r[i]; + } + table[trow.Id] = trow; + } + // console.log(`TableV3 [${name}] init done`); + return table; + } +} diff --git a/src/Engine/Data/LocalStorageData.ts b/src/Engine/Data/LocalStorageData.ts new file mode 100644 index 0000000..8200bb1 --- /dev/null +++ b/src/Engine/Data/LocalStorageData.ts @@ -0,0 +1,57 @@ +/** + * 本機系統記錄(切換帳號也不可刪除EX記錄音效開關) + */ +export default class LocalStorageData { + private static _instance: LocalStorageData = null; + public static get Instance(): LocalStorageData { + return LocalStorageData._instance; + } + + constructor() { + LocalStorageData._instance = this; + } + + // ======================================================================================= + // + public get CompileVersion(): string { return cc.sys.localStorage.getItem("CompileVersion"); } + public set CompileVersion(value: string) { cc.sys.localStorage.setItem("CompileVersion", value.toString()); } + // + public get RemoteVerList(): string { return cc.sys.localStorage.getItem("RemoteVerList"); } + public set RemoteVerList(value: string) { cc.sys.localStorage.setItem("RemoteVerList", value); } + // + public get LocalVerList(): string { return cc.sys.localStorage.getItem("LocalVerList"); } + public set LocalVerList(value: string) { cc.sys.localStorage.setItem("LocalVerList", value); } + // + public get ComboDeviceID(): string { return cc.sys.localStorage.getItem("ComboDeviceID") || ""; } + public set ComboDeviceID(value: string) { cc.sys.localStorage.setItem("ComboDeviceID", value); } + // + public get BundleUrl(): string { return cc.sys.localStorage.getItem("BundleUrl"); } + public set BundleUrl(value: string) { cc.sys.localStorage.setItem("BundleUrl", value); } + // + public get Language(): string { return cc.sys.localStorage.getItem("language"); } + public set Language(value: string) { cc.sys.localStorage.setItem("language", value); } + // + public get MusicType(): string { return cc.sys.localStorage.getItem("MusicType"); } + public set MusicType(value: string) { cc.sys.localStorage.setItem("MusicType", value); } + // + public get SoundType(): string { return cc.sys.localStorage.getItem("SoundType"); } + public set SoundType(value: string) { cc.sys.localStorage.setItem("SoundType", value); } + // + public get LvUpNotifyType(): boolean { return JSON.parse(cc.sys.localStorage.getItem("LvUpNotifyType")); } + public set LvUpNotifyType(value: boolean) { cc.sys.localStorage.setItem("LvUpNotifyType", JSON.stringify(value)); } + // + public get WinNotifyType(): boolean { return JSON.parse(cc.sys.localStorage.getItem("WinNotifyType")); } + public set WinNotifyType(value: boolean) { cc.sys.localStorage.setItem("WinNotifyType", JSON.stringify(value)); } + // + public get DownloadList_Preview(): string { return cc.sys.localStorage.getItem("DownloadList_Preview"); } + public set DownloadList_Preview(value: string) { cc.sys.localStorage.setItem("DownloadList_Preview", value); } + // + public get AutoLogin(): number { return Number.parseInt(cc.sys.localStorage.getItem("AutoLogin")); } + public set AutoLogin(value: number) { cc.sys.localStorage.setItem("AutoLogin", value); } + // + public get GameInfoData(): string[] { return JSON.parse(cc.sys.localStorage.getItem("GameInfoData")); } + public set GameInfoData(value: string[]) { cc.sys.localStorage.setItem("GameInfoData", JSON.stringify(value)); } + // + public get LoginDays(): string[] { return JSON.parse(cc.sys.localStorage.getItem("LoginDays")); } + public set LoginDays(value: string[]) { cc.sys.localStorage.setItem("LoginDays", JSON.stringify(value)); } +} \ No newline at end of file diff --git a/src/Engine/Timer/Timer.ts b/src/Engine/Timer/Timer.ts new file mode 100644 index 0000000..599c3b0 --- /dev/null +++ b/src/Engine/Timer/Timer.ts @@ -0,0 +1,192 @@ +import { NumberEx } from "@/utils/Number/NumberEx"; +import { CoroutineV2 } from "../CatanEngine/CoroutineV2/CoroutineV2"; +import { ActionWithType } from "../CatanEngine/CSharp/System/ActionWithType"; + +class TimerEvent extends ActionWithType { } + +/** + * 計時器(使用CoroutineV2) + */ +export class Timer { + + //#region private + + /** 訊息資料 */ + private static Group: Map = new Map(); + + //#endregion + + //#region static + + /** + * 啟動計時 + * @param {number} time 計時(seconds) + * @param {Function} callback Function + * @param {any} type (選填) 可以識別的東西 + * @param {any} bindTarget (選填) 回呼時this綁定的對象 + * @example + * Timer.Start(1, () => { console.log(`example`); }); + * Timer.Start(1, () => { console.log(`example`); }, "example"); + * Timer.Start(1, () => { console.log(`example`); }, "example", this); + */ + public static Start(time: number, callback: Function, bindTarget?: any, type?: any): void { + let self: typeof Timer = this; + let thisType: any = type; + if (!type) { + thisType = callback; + } + if (Timer.Group.has(thisType)) { + console.error(`Timer Start Error Timer.Group.has(${thisType})`); + return; + } + let timerData: TimerDataClass = new TimerDataClass(thisType, time, callback, bindTarget); + Timer.Group.set(thisType, timerData); + let CoroutineFN: () => IterableIterator = function* (): IterableIterator { + yield CoroutineV2.WaitTime(time).Start(bindTarget); + if (Timer.Group.has(thisType)) { + self._callback(timerData.Type, timerData.Callback, timerData.BindTarget); + } + }; + CoroutineV2.Single(CoroutineFN()).Start(bindTarget); + } + + /** + * 刪除計時 By Target + * @param {any} target target + * @example + * Timer.ClearByTarget(this); + */ + public static ClearByTarget(target: any): void { + let timerDataGroup: TimerDataClass[] = []; + Timer.Group.forEach(timerData => { + if (timerData.BindTarget === target) { + timerDataGroup.push(timerData); + } + }); + if (timerDataGroup.length === 0) { + console.warn(`Timer Clear Error Timer.Group.has not target`); + return; + } + for (let i: number = 0; i < timerDataGroup.length; i++) { + let timerData: TimerDataClass = timerDataGroup[i]; + let type: any = timerData.Type; + Timer.Group.delete(type); + timerData = null; + } + CoroutineV2.StopCoroutinesBy(target); + } + + /** + * 刪除計時 By Type + * @param PS 還是會吃效能在倒數 只是時間到不會執行 + * @param {any} type type + * @example + * Timer.ClearByType("example"); + */ + public static ClearByType(type: any): void { + let timerDataGroup: TimerDataClass[] = []; + Timer.Group.forEach(timerData => { + if (timerData.Type === type) { + timerDataGroup.push(timerData); + } + }); + if (timerDataGroup.length === 0) { + console.warn(`Timer Clear Error Timer.Group.has not type`); + return; + } + for (let i: number = 0; i < timerDataGroup.length; i++) { + let timerData: TimerDataClass = timerDataGroup[i]; + let type: any = timerData.Type; + Timer.Group.delete(type); + } + } + + /** + * 結束計時時callback + * @param {Function} callback Function + */ + private static _callback(type: any, callback: Function, bindTarget: any): void { + if (Timer.Group.has(type)) { + Timer.Group.delete(type); + } + if (bindTarget) { + callback.bind(bindTarget)(); + } else { + callback(); + } + } + + /** + * 定時事件(時間用 updateTime秒跑一次fn) + * @param startNum 起始index + * @param endNum 結束index + * @param updateTime 事件刷新間隔 + * @param callbackfn 事件 + * @example + * let startNum: number = 10; + * let endNum: number = 0; + * let updateTime: number = 1; + * yield CoroutineV2.Single(Timer.Timing( + * startNum, + * endNum, + * updateTime, + * (x: number) => { + * console.log(`x: ${x}`); + * } + * )).Start(this); + */ + public static *Timing(startNum: number, endNum: number, updateTime: number, callbackfn: Function): IterableIterator { + let isIncrease: boolean = endNum >= startNum; + let totalCount: number = Math.abs(endNum - startNum) + 1; + let nowCount: number = NumberEx.divide(totalCount, updateTime); + let diff: number = NumberEx.divide(totalCount, nowCount) * (isIncrease ? 1 : -1); + let tempScore: number = startNum; + callbackfn(startNum); + while (true) { + if (endNum !== tempScore) { + yield CoroutineV2.WaitTime(updateTime); + tempScore += diff; + // 遞增 + if (isIncrease && tempScore > endNum) { + tempScore = endNum; + } + // 遞減 + if (!isIncrease && tempScore < endNum) { + tempScore = endNum; + } + callbackfn(Math.floor(tempScore)); + } else { + break; + } + } + } + + //#endregion +} + + +//#region Class + +/** Timer資料 */ +export class TimerDataClass { + /** Type */ + public Type: any = null; + + /** Time */ + public Time: number = null; + + /** Callback */ + public Callback: Function = null; + + /** BindTarget */ + public BindTarget?: any = null; + + constructor(type: any, time: number, callback: Function, bindTarget?: any) { + this.Type = type; + this.Time = time; + this.Callback = callback; + this.BindTarget = bindTarget; + } +} + +// //#endregion \ No newline at end of file diff --git a/src/Engine/Utils/Audio/CSAudio.ts b/src/Engine/Utils/Audio/CSAudio.ts new file mode 100644 index 0000000..ad4efe9 --- /dev/null +++ b/src/Engine/Utils/Audio/CSAudio.ts @@ -0,0 +1,5 @@ +export default class CSAudio { + private static _instance: CSAudio = null; + public static get Instance(): CSAudio { return this._instance; } + public AddClipsInfo(clips: Map, pathes: Map): void { } +} diff --git a/src/Engine/Utils/PSPS.ts b/src/Engine/Utils/PSPS.ts new file mode 100644 index 0000000..b2114fc --- /dev/null +++ b/src/Engine/Utils/PSPS.ts @@ -0,0 +1,120 @@ +//#region Class + +import { CoroutineV2 } from "../../Engine/CatanEngine/CoroutineV2/CoroutineV2"; + +/** 表演節目序列處理系統(playShow Sequence Processing System) */ +export default class PSPS { + //#region public + + public ShowData: ShowDataClass[] = []; + + public IsRun: boolean = false; + + // /** 可以插隊時間 */ + // public CanCutInLineTime: number = null; + + //#endregion + + //#region private + + private _playShowFunction: (data: any) => IterableIterator = null; + + //#endregion + + //#region Lifecycle + + /** + * 表演節目序列處理系統(PlayShow Sequence Processing System) + * @param playShowFunction 要表演的函式 + * @example + * let CoroutineFunction: (data: any) => IterableIterator = function* (data: any): IterableIterator {} + * new PSPS(this.CoroutineFunction.bind(this)); + */ + constructor(playShowFunction: (data: any) => IterableIterator) { + this.SetPlayShowFunction(playShowFunction); + } + + public SetPlayShowFunction(playShowFunction: (data: any) => IterableIterator): void { + this._playShowFunction = playShowFunction; + } + + //#endregion + + //#region playShow + + /** 增加表演資料 */ + public PushPlayShowData(data: any, priority: number = 0): void { + const playShowData: ShowDataClass = new ShowDataClass(data, priority); + this.ShowData.push(playShowData); + this.ShowData.ObjectSort([true], ["Priority"]); + if (!this.IsRun) { + CoroutineV2.Single(this._performanceShowData()).Start(this); + } + } + + /** 表演 */ + private *_performanceShowData(): IterableIterator { + this.IsRun = true; + if (this._playShowFunction) { + const showData: ShowDataClass = this.ShowData.shift(); + const data: any = showData.Data; + yield* this._playShowFunction(data); + } + if (this.ShowData.length > 0) { + CoroutineV2.Single(this._performanceShowData()).Start(this); + return; + } + this.StopPerformance(); + } + + /** 停止表演 */ + public StopPerformance(): void { + this.IsRun = false; + CoroutineV2.StopCoroutinesBy(this); + } + + public ClearFromPriority(priority: any): void { + let deleteDatas: ShowDataClass[] = []; + for (let i: number = 0; i < this.ShowData.length; i++) { + const showData: ShowDataClass = this.ShowData[i]; + if (showData.Priority === priority) { + deleteDatas.push(showData); + } + } + for (let i: number = 0; i < deleteDatas.length; i++) { + const deleteData: ShowDataClass = deleteDatas[i]; + for (let j: number = 0; j < this.ShowData.length; j++) { + const showData: ShowDataClass = this.ShowData[j]; + if (showData.Priority === deleteData.Priority) { + this.ShowData.splice(j, 1); + break; + } + } + } + } + + /** 清除所有表演 */ + public ClearPerformance(): void { + this.IsRun = false; + this.ShowData = []; + CoroutineV2.StopCoroutinesBy(this); + } + + //#endregion +} + +/** ShowDataClass */ +export class ShowDataClass { + /** 優先度(越低越前面) */ + public Priority: number = 0; + + /** Data */ + public Data: any = null; + + constructor(data: any, priority: number) { + this.Data = data; + this.Priority = priority; + } +} + +//#endregion \ No newline at end of file diff --git a/src/Engine/Utils/Singleton/BaseSingleton.ts b/src/Engine/Utils/Singleton/BaseSingleton.ts new file mode 100644 index 0000000..9cff221 --- /dev/null +++ b/src/Engine/Utils/Singleton/BaseSingleton.ts @@ -0,0 +1,27 @@ +/** + * 單例基類(要先new在使用) + * @example + * export default class Test extends BaseSingleton() { ...... } + * new Test(); + * Test.Instance.Init(); + */ +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type +export default function BaseSingleton() { + class BaseSingleton { + public constructor() { + if ((this)._instance == null) { + BaseSingleton._instance = this; + } + } + private static _instance: BaseSingleton = null; + public static get Instance(): T { + return (this)._instance; + } + + /** 銷毀 */ + public Destroy(): void { + (this)._instance = null; + } + } + return BaseSingleton; +} \ No newline at end of file diff --git a/src/UI/Game.tsx b/src/UI/Game.tsx new file mode 100644 index 0000000..b0d8114 --- /dev/null +++ b/src/UI/Game.tsx @@ -0,0 +1,7 @@ +const Game = () => { + return ( + <>Game + ); +}; + +export default Game; \ No newline at end of file diff --git a/src/UI/Lobby.tsx b/src/UI/Lobby.tsx new file mode 100644 index 0000000..37702df --- /dev/null +++ b/src/UI/Lobby.tsx @@ -0,0 +1,7 @@ +const Lobby = () => { + return ( + <>Lobby + ); +}; + +export default Lobby; \ No newline at end of file diff --git a/src/UI/Login.tsx b/src/UI/Login.tsx new file mode 100644 index 0000000..dcc5f3f --- /dev/null +++ b/src/UI/Login.tsx @@ -0,0 +1,53 @@ +import { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting"; +import { useGameItems } from "@/context/GameItemsContext"; +import { Button, Cascader } from "antd"; +import React, { useState } from "react"; + +interface Option { + value: string; + label: string; + children?: Option[]; +} + +const Login = () => { + const { onLoad } = useGameItems(); + const serverType: typeof BusinessEnum.ServerType = BusinessEnum.ServerType; + const [type, setType] = useState(BusinessEnum.ServerType.Internal_Dev); + const [isLogin, setIsLogin] = useState(false); + const options: Option[] = []; + for (let i = 0, names: string[] = Object.keys(serverType); i < names.length; i++) { + const key: string = names[i]; + if (!Number.isNaN(+key)) { + options.push({ + value: key, + label: serverType[key], + }); + } + } + + async function login() { + setIsLogin(true); + await onLoad(type); + } + + return ( + <>{!isLogin && +
+ setType(+v[0])} /> + +
+ } + ); +}; + +export default Login; + +const boxStyle: React.CSSProperties = { + width: "100%", + height: "100vh", + borderRadius: 6, + border: "1px solid #40a9ff", + display: "flex", + alignItems: "center", + justifyContent: "center", +}; \ No newline at end of file diff --git a/src/_BusinessTypeSetting/BusinessTypeSetting.ts b/src/_BusinessTypeSetting/BusinessTypeSetting.ts new file mode 100644 index 0000000..f9d7011 --- /dev/null +++ b/src/_BusinessTypeSetting/BusinessTypeSetting.ts @@ -0,0 +1,255 @@ +export module BusinessEnum { + export enum BusinessType { + Type1 = "LP1", + Type2 = "LP2" + } + + export enum ServerType { + /** 外版 */ + Out = 2, + /** 內版開發(內網&4G) */ + Internal_Dev = 5, + /** 外部商業DEMO(B2B) */ + Out_B2B = 6, + /** QA */ + QA = 7, + /** Test */ + Test = 8 + } + + export enum LogoType { + /** 完美(目前只有WEB) */ + // WM = 1 + } +} + +/** +產品商業類別設定檔 +@explain 讀不同表就代表不同商業類別.要多開GIT並設定新測試環境 +@explain 遊戲一定都一樣不能改動介面 + */ +export default class BusinessTypeSetting { + /** 產品商業類別字串(組合判斷用) */ + public static readonly TYPE_BUSINESS: string = BusinessEnum.BusinessType.Type1; + + /** 必要JSON載入結束 */ + public static GetLoadInitEnd(): boolean { + return this.SetLoadInitEnd; + } + + public static SetLoadInitEnd: boolean = false; + + /** + * 執行環境ProductEnum.ServerType + * @description 請統一從Cocos掛載Loading的面板去設定ServerType + */ + public static UseServerType: BusinessEnum.ServerType = BusinessEnum.ServerType[import.meta.env.VITE_Deploy] as unknown as BusinessEnum.ServerType; + + /** 連線IP(網頁版會接網址參數所以要多開變數直接指定) */ + public static UseHost: string = BusinessTypeSetting.GetHostUrl(BusinessTypeSetting.UseServerType); + + /** 連接阜(網頁版會接網址參數所以要多開變數直接指定) */ + public static UsePort: number = BusinessTypeSetting.GetPortNum(BusinessTypeSetting.UseServerType); + + /** 資源伺服器網址 */ + public static UsePatch: string = BusinessTypeSetting.GetPatchUrl(BusinessTypeSetting.UseServerType); + + /** 靜態伺服器網址 */ + public static UseDownloadUrl: string = BusinessTypeSetting.GetDownloadUrl(BusinessTypeSetting.UseServerType); + + /** Line Liff */ + public static UseLiffID: string = BusinessTypeSetting.GetLiffID(BusinessTypeSetting.UseServerType); + + /** Line Liff */ + public static UseLineID: string = BusinessTypeSetting.GetLineID(BusinessTypeSetting.UseServerType); + + /** 編譯版本 */ + public static get COMPILE_VERSION(): string { + return BusinessTypeSetting.SET_COMPILE_VERSION; + } + + public static SET_COMPILE_VERSION: string = null; + + // ======================================================================================= + /** 網頁測試讀取對應資源的位置 */ + public static readonly FolderUrl: string = "shared/"; + public static readonly FolderUrlImg: string = "shared/img/"; + public static readonly FolderUrlBg: string = "shared/bg/"; + public static readonly FolderUrlJson: string = "shared/jsons/"; + public static readonly FolderUrlTxt: string = "shared/txt/"; + public static readonly FolderUrlLoading: string = "shared/loading/"; + public static readonly FolderUrlMp3: string = "shared/"; + + /** Line */ + public static readonly LineFriendUrl: string = "https://line.me/R/ti/p/@"; + /** 原始Liff開啟方式(電腦也支援) */ + public static readonly LiffUrl: string = "https://liff.line.me/"; + /** 電腦開會導向Line官網 */ + public static readonly LiffUrlTypeA: string = "https://line.me/R/app/"; + /** 電腦無法打開 */ + public static readonly LiffUrlTypeB: string = "line://app/"; + + /** + * 取得PATH資原路徑 + * @param type 執行環境() + * @returns + */ + public static GetPatchUrl(type: BusinessEnum.ServerType): string { + switch (type) { + case BusinessEnum.ServerType.Out: + return "https://patch.lybobet.com/"; + + case BusinessEnum.ServerType.Internal_Dev: + return "https://patch-dev.lybobet.com/"; + + case BusinessEnum.ServerType.Out_B2B: + return "https://patch-b2b.lybobet.com/"; + + case BusinessEnum.ServerType.QA: + return "https://patch-qa.lybobet.com/"; + + case BusinessEnum.ServerType.Test: + return "https://patch-testing.lybobet.com/"; + } + } + + /** + * 取得連線伺服器IP + * @param type 執行環境 + * @returns + */ + public static GetHostUrl(type: BusinessEnum.ServerType): string { + switch (type) { + case BusinessEnum.ServerType.Out: + return "https://game.lybobet.com"; + + case BusinessEnum.ServerType.Internal_Dev: + return "https://dev.lybobet.com"; + + case BusinessEnum.ServerType.QA: + return "https://qa.lybobet.com"; + + case BusinessEnum.ServerType.Test: + return "https://testing.lybobet.com"; + + case BusinessEnum.ServerType.Out_B2B: + return "https://b2b.lybobet.com"; + } + } + + /** + * 取得伺服器連接端口 + * @param type 執行環境 + * @returns + */ + public static GetPortNum(type: BusinessEnum.ServerType): number { + switch (type) { + case BusinessEnum.ServerType.Out: + return 9005; + + case BusinessEnum.ServerType.Internal_Dev: + return 9005; + + case BusinessEnum.ServerType.QA: + return 9005; + + case BusinessEnum.ServerType.Test: + return 9005; + + case BusinessEnum.ServerType.Out_B2B: + return 9005; + + } + } + + public static GetDownloadUrl(type: BusinessEnum.ServerType): string { + switch (type) { + case BusinessEnum.ServerType.Out: + return "https://static.lybobet.com/"; + + case BusinessEnum.ServerType.Internal_Dev: + return "https://static-dev.lybobet.com/"; + + case BusinessEnum.ServerType.QA: + return "https://static-qa.lybobet.com/"; + + case BusinessEnum.ServerType.Test: + return "https://static-testing.lybobet.com/"; + + case BusinessEnum.ServerType.Out_B2B: + return "https://static-b2b.lybobet.com/"; + } + } + + public static GetUploadUrl(type: BusinessEnum.ServerType): string { + let port: string = ":9080"; + switch (type) { + case BusinessEnum.ServerType.Internal_Dev: { + let url: string = this.GetHostUrl(type); + url = url.replace("http://", ""); + url = url.replace("https://", ""); + return "https://static-" + url + port; + } + default: + return this.GetHostUrl(type) + port; + } + } + + public static GetLiffID(type: BusinessEnum.ServerType): string { + switch (type) { + case BusinessEnum.ServerType.Out: + return "1657864491-kA7gnVMp"; + + case BusinessEnum.ServerType.Internal_Dev: + return "1657713613-we8Gk929"; + + case BusinessEnum.ServerType.QA: + return "1657864462-xM7dgPGK"; + + case BusinessEnum.ServerType.Test: + return "1657864500-N3YEgz6p"; + + case BusinessEnum.ServerType.Out_B2B: + return "1657864484-YeqWEV9O"; + } + } + + public static GetLineID(type: BusinessEnum.ServerType): string { + switch (type) { + case BusinessEnum.ServerType.QA: + case BusinessEnum.ServerType.Test: + case BusinessEnum.ServerType.Out: + return "070hdlum"; + + case BusinessEnum.ServerType.Internal_Dev: + return "349pbusa"; + + case BusinessEnum.ServerType.Out_B2B: + return "114pcwux"; + } + } + + // ======================================================================================= + +} + +export enum FileType { + PNG = ".png", + JPG = ".jpg", + MP3 = ".mp3", + TXT = ".txt", +} + +export enum FolderName { + Logo = "Logo/", + SlotImg = "SlotImg/", + Avatar = "Avatar/", + Report = "report/", + PA = "pa/", + LobbyAd = "lobby_ad/", + CoverAd = "inter_ad/", + Activity = "Activity/", + Game = "game/", + Dlygo = "dlygo/", + Event = "event/", +} \ No newline at end of file diff --git a/src/context/GameItemsContext.tsx b/src/context/GameItemsContext.tsx new file mode 100644 index 0000000..616342d --- /dev/null +++ b/src/context/GameItemsContext.tsx @@ -0,0 +1,45 @@ +import { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting"; +import { IGameItems } from "@/types"; +import { LineTools } from "@/utils/LineTools"; +import { ReactNode, createContext, useContext, useState } from "react"; + +type GameItemsProviderProps = { + children: ReactNode; +}; +const GameItemsContext = createContext(undefined); + +export function useGameItems() { + return useContext(GameItemsContext); +} +export let gameObj: IGameItems = null; + +export function GameItemsProvider({ children }: GameItemsProviderProps) { + const [gameId, setGameId] = useState(null); + + const game: IGameItems = gameObj = { + onLoad, + gameId, + setGameId + }; + + async function onLoad(serverType: BusinessEnum.ServerType) { + await Promise.all([ + // // 設定執行環境 + // setBusinessType(), + + // // 設定LineTools環境 + // await setLineTools(), + ]); + } + + /** 設定LineTools環境 */ + async function setLineTools() { + await LineTools.onLoad(); + } + + return ( + + {children} + + ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..3b36766 --- /dev/null +++ b/src/index.css @@ -0,0 +1,5 @@ +body { + margin: 0; + padding: 0; + height: 100vh; + } \ No newline at end of file diff --git a/src/index.tsx b/src/index.tsx new file mode 100644 index 0000000..bece000 --- /dev/null +++ b/src/index.tsx @@ -0,0 +1,38 @@ +import "@/FormTableExt/TableExt/CSSettingsV3Ext"; +import { GameItemsProvider } from "@/context/GameItemsContext"; +import "@/utils/ArrayExtension"; +import "@/utils/NumberExtension"; +import "@/utils/String"; +import type { Router } from "@remix-run/router"; +import dayjs from "dayjs"; +import "dayjs/locale/zh-tw"; +import ReactDOM from "react-dom/client"; +import { RouterProvider, createHashRouter } from "react-router-dom"; +import { BaseEnumerator } from "./Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator"; +import Game from "./UI/Game"; +import Lobby from "./UI/Lobby"; +import Login from "./UI/Login"; +import "./index.css"; + +BaseEnumerator.Init(); +dayjs.locale("zh-tw"); +const hashRouter: Router = createHashRouter([ + { + path: "/", + element: , + }, + { + path: "/lobby", + element: , + }, + { + path: "/game/:id", + element: , + }, +]); + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + +); diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..022a78a --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,7 @@ +import { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting"; + +export interface IGameItems { + onLoad: (serverType: BusinessEnum.ServerType) => Promise; + gameId: number; + setGameId: (gameId: number) => void; +} \ No newline at end of file diff --git a/src/utils/ArrayExtension.ts b/src/utils/ArrayExtension.ts new file mode 100644 index 0000000..4c40afb --- /dev/null +++ b/src/utils/ArrayExtension.ts @@ -0,0 +1,140 @@ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +declare interface Array { + /** + * 移除一個值並且回傳 + * @param index + */ + ExRemoveAt(index: number): T + + /** + * 移除全部值(注意. 參考的也會被清空) + * @example + * + * let bar: number[] = [1, 2, 3]; + * let bar2: number[] = bar; + * bar.Clear(); + * console.log(bar, bar2); + * + * // { + * // "bar": [], + * // "bar2": [] + * // } + */ + Clear(): void + + /** + * 拷貝 + * PS. pass by value 多維陣列也OK + */ + Copy(): T[] + + /** + * 物件陣列排序,asc&key陣列長度請一樣 + * PS. boolean 帶false是先true在false + * @link JavaScript Object 排序 http://www.eion.com.tw/Blogger/?Pid=1170#:~:text=JavaScript%20Object%20排序 + * @param asc 是否升序排列(小到大) + * @param key 需排序的key(優先順序左到右)(沒有就放空) + */ + ObjectSort(asc?: boolean[], key?: string[]): T[] + + /** + * 設計給ArrayforHoldButton使用 + * Add a none persistent listener to the UnityEvent. + * @param call Callback function. + */ + // eslint-disable-next-line @typescript-eslint/ban-types + AddListener(call: Function): void +} + +Array.prototype.ExRemoveAt || + Object.defineProperty(Array.prototype, "ExRemoveAt", { + enumerable: false, + value: function (index: number): any { + const item: any = this.splice(index, 1); + return item[0]; + }, + }); + +Array.prototype.Clear || + Object.defineProperty(Array.prototype, "Clear", { + enumerable: false, + value: function (): void { + this.length = 0; + + // let foo: number[] = [1, 2, 3]; + // let bar: number[] = [1, 2, 3]; + // let foo2: number[] = foo; + // let bar2: number[] = bar; + // foo = []; + // bar.length = 0; + // console.log(foo, bar, foo2, bar2); + + // { + // "foo": [], + // "bar": [], + // "foo2": [ + // 1, + // 2, + // 3 + // ], + // "bar2": [] + // } + }, + }); + +Array.prototype.Copy || + Object.defineProperty(Array.prototype, "Copy", { + enumerable: false, + value: function (): any[] { + return Array.from(this); + }, + }); + +Array.prototype.ObjectSort || + Object.defineProperty(Array.prototype, "ObjectSort", { + enumerable: false, + /** + * @param asc 是否升序排列(小到大) + * @param key 需排序的key(優先順序左到右)(沒有就放空) + */ + value: function (asc: boolean[] = [true], key?: string[]): any[] { + if (this.length === 0) { + return this; + } else if (!key || key.length === 0) { + console.error("ObjectSort key error"); + return this; + } else if (asc.length !== key.length) { + console.error( + `ObjectSort key asc error asc.length: ${asc.length}, key.length: ${key.length}`, + ); + return this; + } + for (let i: number = 0; i < key.length; i++) { + const keyname: string = key[i]; + if (this[0][keyname] === undefined) { + console.error(`ObjectSort has not key[${i}]: ${keyname}`); + return this; + } + } + const count: number = key ? key.length : 1; + let arr: any[]; + for (let i: number = count - 1; i >= 0; i--) { + arr = this.sort(function (a: any, b: any): 1 | -1 { + let mya: any = a; + let myb: any = b; + if (key) { + mya = a[key[i]]; + myb = b[key[i]]; + } + + // 加個等於數字相同不要再去排序到 + if (asc[i]) { + return mya >= myb ? 1 : -1; + } else { + return mya <= myb ? 1 : -1; + } + }); + } + return arr; + }, + }); diff --git a/src/utils/LineTools.ts b/src/utils/LineTools.ts new file mode 100644 index 0000000..b7474cb --- /dev/null +++ b/src/utils/LineTools.ts @@ -0,0 +1,565 @@ +import BusinessTypeSetting from "@/_BusinessTypeSetting/BusinessTypeSetting"; +import liff from "@line/liff"; +/** + * Line工具 + * @doc https://developers.line.biz/en/docs/messaging-api/message-types + */ +export class LineTools { + //#region Lifecycle + + public static async onLoad(): Promise { + const hasToken: boolean = location.search.includes("token=") || location.hash.includes("token="); + if (hasToken) { + return; + } + await LineTools.init(); + const isLoggedIn: boolean = await LineTools.checkLogin(); + if (!isLoggedIn) { + await LineTools.login(); + return; + } + console.debug(`[Line] Line is Login`); + } + + //#endregion + + //#region Custom + + public static GetAccessToken(): string { + const accessToken: string = liff.getAccessToken(); + return accessToken; + } + + //#endregion + + //#region FriendShip + /** 確認是否加官方賬號好友 */ + public static async CheckAddFriend(): Promise { + const ans: boolean = (await liff.getFriendship()).friendFlag; + return ans; + } + + //#endregion + + //#region Custom Message + + /** + * Text message + * @param {string} text Message text. Max character limit: 5000 + * @doc https://developers.line.biz/en/reference/messaging-api/#text-message + * @example LineTools.MakeText("Hello, world"); + */ + public static async MakeText(text: string): Promise { + if (!text) { + return false; + } + const data: any[] = [{ + "type": "text", + "text": text + }]; + + return await LineTools._sendMessages(data); + } + + /** + * Text message + * @deprecated 有問題用不了 + * @param {string} text Message text. Max character limit: 5000 + * @doc https://developers.line.biz/en/reference/messaging-api/#text-message + * @LINE_Emoji https://developers.line.biz/en/docs/messaging-api/emoji-list/#line-emoji-definitions + * @example LineTools.MakeText("Hello, world"); + */ + public static async MakeTextEmoji(text: string): Promise { + if (!text) { + return false; + } + const data: any[] = [{ + "type": "text", + "text": "$$$ LINE emoji", + "emojis": [ + { + "index": 0, + "productId": "5ac21a8c040ab15980c9b43f", + "emojiId": "004" + }, + { + "index": 1, + "productId": "5ac21a8c040ab15980c9b43f", + "emojiId": "001" + }, + { + "index": 2, + "productId": "5ac21a8c040ab15980c9b43f", + "emojiId": "025" + } + ] + }]; + + return await LineTools._sendMessages(data); + } + + /** + * Sticker message + * @param packageId Package ID for a set of stickers. For information on package IDs + * @param stickerId Sticker ID. For a list of sticker IDs for stickers that can be sent with the Messaging API + * @param isAnim isAnim + * @doc https://developers.line.biz/en/reference/messaging-api/#audio-message + * @example LineTools.MakeSticker(26162, 505588336, true); + */ + public static async MakeSticker(packageId: string, stickerId: string, isAnim: boolean = false): Promise { + if (!packageId || !stickerId) { + return false; + } + let pngtype: string = ""; + if (isAnim) { + pngtype = "/IOS/sticker@2x.png"; + } else { + pngtype = "/IOS/sticker_animation@2x.png"; + } + + const data: any[] = [{ + "type": "template", + "altText": "Sticker", + "template": { + "type": "image_carousel", + "columns": [{ + "imageUrl": "https://stickershop.line-scdn.net/stickershop/v1/sticker/" + stickerId + pngtype, + "action": { + "type": "uri", + "uri": "line://shop/sticker/detail/" + packageId + } + }] + } + }]; + + return await LineTools._sendMessages(data); + } + + /** + * Image message + * @param {string} originalContentUrl Image URL (Max character limit: 2000) HTTPS over TLS 1.2 or later JPEG or PNG Max image size: No limits Max file size: 10 MB + * @param {string} previewImageUrl Preview image URL (Max character limit: 2000) HTTPS over TLS 1.2 or later JPEG or PNG Max image size: No limits Max file size: 1 MB + * @doc https://developers.line.biz/en/reference/messaging-api/#image-message + * @example LineTools.MakeImage("https://example.com/original.jpg", "https://example.com/preview.jpg"); + */ + public static async MakeImage(originalContentUrl: string, previewImageUrl: string = originalContentUrl): Promise { + if (!originalContentUrl) { + return false; + } + const data: any[] = [{ + "type": "image", + "originalContentUrl": originalContentUrl, + "previewImageUrl": previewImageUrl + }]; + + return await LineTools._sendMessages(data); + } + + /** + * Video message + * If the video isn't playing properly, make sure the video is a supported file type and the HTTP server hosting the video supports HTTP range requests. + * @param {string} originalContentUrl URL of video file (Max character limit: 2000) HTTPS over TLS 1.2 or later mp4 Max file size: 200 MB + * @param {string} previewImageUrl URL of preview image (Max character limit: 2000) HTTPS over TLS 1.2 or later JPEG or PNG Max file size: 1 MB + * @doc https://developers.line.biz/en/reference/messaging-api/#video-message + */ + public static async MakeVideo(originalContentUrl: string, previewImageUrl: string): Promise { + if (!originalContentUrl || !previewImageUrl) { + return false; + } + const data: any[] = [{ + "type": "video", + "originalContentUrl": originalContentUrl, + "previewImageUrl": previewImageUrl + }]; + + return await LineTools._sendMessages(data); + } + + /** + * Audio message + * @param {string} originalContentUrl URL of audio file (Max character limit: 2000) HTTPS over TLS 1.2 or later m4a Max file size: 200 MB + * @param {number} duration Length of audio file (milliseconds) + * @doc https://developers.line.biz/en/reference/messaging-api/#audio-message + */ + public static async MakeAudio(originalContentUrl: string, duration: number = 60000): Promise { + if (!originalContentUrl) { + return false; + } + const data: any[] = [{ + "type": "audio", + "originalContentUrl": originalContentUrl, + "duration": duration + }]; + + return await LineTools._sendMessages(data); + } + + /** + * Buttons template + * @param altText Alternative text. When a user receives a message, it will appear as an alternative to the template message in the notification or chat list of their device. Max character limit: 400 + * @param thumbnailImageUrl Image URL (Max character limit: 2,000) HTTPS over TLS 1.2 or later JPEG or PNG Max width: 1024px Max file size: 10 MB + * @param title Title Max character limit: 40 + * @param text Message text Max character limit: 160 (no image or title) Max character limit: 60 (message with an image or title) + * @param defaultAction Action when image, title or text area is tapped. + * @param actions Action when tapped Max objects: 4 + * @param imageAspectRatio rectangle: 1.51:1 + * @param imageAspectRatio square: 1:1 + * @param imageSize cover: The image fills the entire image area. Parts of the image that do not fit in the area are not displayed. + * @param imageSize contain: The entire image is displayed in the image area. A background is displayed in the unused areas to the left and right of vertical images and in the areas above and below horizontal images. + * @doc https://developers.line.biz/en/reference/messaging-api/#buttons + */ + public static async MakeTemplate(altText: string, thumbnailImageUrl: string, title: string, text: string, defaultAction: any = null, actions: any[] = [], imageAspectRatio: string = "square", imageSize: string = "cover"): Promise { + if (actions.length === 0) { + return false; + } + + const data: any[] = [{ + "type": "template", + "altText": altText, + "template": { + "type": "buttons", + "thumbnailImageUrl": thumbnailImageUrl, + "imageAspectRatio": imageAspectRatio, + "imageSize": imageSize, + "title": title, + "text": text + } + }]; + + if (defaultAction) { + data["defaultAction"] = defaultAction; + // data["defaultAction"] = { + // "type": "uri", + // "label": "View detail", + // "uri": "http://example.com/page/123" + // }; + } + + if (actions) { + data["actions"] = actions; + // data["actions"] = [{ + // "type": "uri", + // "label": "立即玩", + // "uri": "https://liff.line.me/1657713613-we8Gk929" + // }]; + } + return await LineTools._sendMessages(data); + } + //#region SendImageTemplate + /** + * MeProfile + * @param altText Alternative text. When a user receives a message, it will appear as an alternative to the template message in the notification or chat list of their device. Max character limit: 400 + * @param text Message text Max character limit: 160 (no image or title) Max character limit: 60 (message with an image or title) + * @simulator https://developers.line.biz/flex-simulator/ + */ + public static async MakeImageTemplate(altText: string, text?: string): Promise { + let data: any[] = [{ + "type": "flex", + "altText": altText, + "contents": + { + "type": "bubble", + "size": "giga", + "body": { + "type": "box", + "layout": "vertical", + "contents": [ + { + "type": "image", + "url": "https://scontent.ftpe8-3.fna.fbcdn.net/v/t39.30808-6/313961998_137927952344738_4107082514038089088_n.jpg?stp=dst-jpg_p526x296&_nc_cat=111&ccb=1-7&_nc_sid=730e14&_nc_ohc=3jmqu3srEAYAX9drH1H&_nc_ht=scontent.ftpe8-3.fna&oh=00_AfDe36ZgvY6aqmN3nge4Fmw9ZGuOwxdS5fj9eAMLe6wtBg&oe=63A4C088", + "size": "full", + "aspectMode": "cover" + } + ], + "paddingAll": "none" + }, + "action": { + "type": "uri", + "label": "action", + "uri": `https://liff.line.me/${BusinessTypeSetting.UseLiffID}}` + } + } + }]; + if (text) { + data[0].contents.body.contents.push({ + "type": "text", + "text": text, + "size": "md", + "align": "center", + "color": "#0000FF", + "margin": "50px", + "gravity": "center", + "offsetBottom": "20px" + }); + } + + return await LineTools._sendMessages(data); + } + //#endregion + + //#region MakeShareBigWinGame + /** + * 分享遊戲 + * @param {number} slotID 遊戲編號 + * @param {number} ratio 倍率 + * @param {string} altText 列表顯示的訊息 + * @param {string} text 弟一行文字 + * @param {string} btnText 按鈕文字 + * @param {string} btnUrl 按鈕連結 + */ + public static async MakeShareBigWinGame(slotID: number, ratio: number, altText: string, text: string, btnText: string, ...param: any[]): Promise { + text = String.Format(text, ratio); + let data: any[] = [{ + "type": "flex", + "altText": altText, + "contents": + { + "type": "bubble", + "size": "mega", + "body": { + "type": "box", + "layout": "vertical", + "contents": [ + { + "type": "box", + "layout": "vertical", + "contents": [ + { + "type": "image", + "url": `${BusinessTypeSetting.UseDownloadUrl}game/${slotID}/s`, + "position": "absolute", + "offsetTop": "11%", + "offsetStart": "71%", + "size": "75px" + }, + { + "type": "image", + "url": `${BusinessTypeSetting.UsePatch}shared/img/LineShareUI/ShareAward01.png`, + "size": "full", + "aspectRatio": "20:13", + "aspectMode": "cover" + } + ], + "paddingAll": "none" + }, + { + "type": "box", + "layout": "vertical", + "contents": [ + { + "type": "text", + "text": text, + "weight": "bold", + "size": "md", + "align": "center", + "wrap": true + } + ], + "margin": "xl" + } + ], + "paddingAll": "none" + }, + "footer": { + "type": "box", + "layout": "vertical", + "spacing": "sm", + "contents": [ + { + "type": "button", + "style": "link", + "height": "sm", + "action": { + "type": "uri", + "label": btnText, + "uri": `https://line.me/R/app/${BusinessTypeSetting.UseLiffID}/?gamein=${slotID}` + } + } + ], + "flex": 0 + }, + "action": { + "type": "uri", + "label": btnText, + "uri": `https://line.me/R/app/${BusinessTypeSetting.UseLiffID}/?gamein=${slotID}` + } + } + }]; + + return await LineTools._sendMessages(data); + } + + //#endregion + + //#region SelfProfile + /** + * MeProfile + * @simulator https://developers.line.biz/flex-simulator/ + */ + public static async MeProfile(): Promise { + const altText: string = "立即玩爆機娛樂城"; + // eslint-disable-next-line @typescript-eslint/typedef + liff.getProfile().then(function (profileData): void { + let statusMessage: string = profileData.statusMessage ?? ""; + if (statusMessage.length > 60) { + statusMessage = "Status Message is to long! Max 60 words"; + } + const data: any[] = [ + { + "type": "flex", + "altText": altText, + "contents": + { + "type": "bubble", + // "size": "giga", + "size": "kilo", + "body": { + "type": "box", + "layout": "vertical", + "contents": [ + { + "type": "image", + "url": profileData.pictureUrl, + "size": "full", + "aspectMode": "cover" + }, + { + "type": "box", + "layout": "vertical", + "contents": [ + { + "type": "text", + "text": profileData.displayName, + "weight": "bold", + "size": "lg", + "margin": "lg" + }, + { + "type": "text", + "text": statusMessage, + "size": "sm", + "margin": "md", + "wrap": true + } + ], + "paddingEnd": "5%", + "paddingStart": "5%" + }, + { + "type": "text", + "text": "立即玩", + "size": "md", + "align": "center", + "color": "#0000FF", + "margin": "50px", + "gravity": "center", + "offsetBottom": "20px" + } + ], + "paddingAll": "none" + }, + "action": { + "type": "uri", + "label": "action", + "uri": `https://liff.line.me/${BusinessTypeSetting.UseLiffID}` + } + } + } + ]; + + LineTools._sendMessages(data); + }).catch(function (error: any): void { + alert(`[Line] Failed to getProfile: \n${error}`); + }); + } + + public static async GetLineProfile(): Promise { + return await liff.getProfile(); + } + + //#endregion + + /** + * 傳送 + * @param {SendMessagesParams} messages + * @param {boolean} isMultiple If you set the isMultiple property to true, the user can select multiple message recipients in the target picker. If you set it to false, the user can select only one friend as the message recipient. The default value is true. + */ + private static async _sendMessages(messages: any[], isMultiple: boolean = true): Promise { + // 這邊是為了防止token過期 + const isLoggedIn: boolean = await LineTools.checkLogin(); + if (!isLoggedIn) { + await LineTools.login(); + } + let isSuccess: boolean = false; + if (liff.isApiAvailable("shareTargetPicker")) { + try { + const res = await liff.shareTargetPicker(messages, { isMultiple: isMultiple }); + if (res) { + if (res.status === "success") { + isSuccess = true; + console.log(`[Line] 分享成功`); + } else { + console.error(`[Line] 分享失敗: \n${JSON.stringify(res)}`); + } + } else { + console.log(`[Line] 分享取消`); + } + } catch (error) { + console.error(`[Line] Failed to launch ShareTargetPicker: \n${error}`); + } + } else { + alert("[Line] 你的 LINE App 暫時不支援 Share Target Picker"); + } + return isSuccess; + } + + private static sleep(ms: any): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); + } + + private static async init(): Promise { + const liffId: string = BusinessTypeSetting.UseLiffID; + const myLIFF_STORE: Object = LineTools.getLIFF_STORE(); + await liff.init({ liffId: liffId }); + LineTools.setLIFF_STORE(myLIFF_STORE); + } + + private static async checkLogin(): Promise { + let isLoggedIn: boolean = liff.isLoggedIn(); + try { + const a = await liff.getProfile(); + } catch (error) { + isLoggedIn = false; + } + return isLoggedIn; + } + + private static async login(): Promise { + if (liff.isInClient()) { + liff.login({ redirectUri: parent.location.href }); + } else { + const search: string = location.search ? location.search : location.hash; + const callbackURL: string = BusinessTypeSetting.UsePatch + "/" + search; + liff.login({ redirectUri: callbackURL }); + } + } + + private static getLIFF_STORE(): Object { + const LIFF_STORE: Object = {}; + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i); + if (key.includes("LIFF_STORE")) { + LIFF_STORE[key] = localStorage.getItem(key); + } + } + return LIFF_STORE; + } + + private static setLIFF_STORE(LIFF_STORE: Object) { + for (let i = 0, keys = Object.keys(LIFF_STORE); i < keys.length; i++) { + const key = keys[i]; + const item = LIFF_STORE[key]; + localStorage.setItem(key, item); + } + } +} \ No newline at end of file diff --git a/src/utils/Number/NumberEx.ts b/src/utils/Number/NumberEx.ts new file mode 100644 index 0000000..f4a6411 --- /dev/null +++ b/src/utils/Number/NumberEx.ts @@ -0,0 +1,181 @@ + +import { CoroutineV2 } from "@/Engine/CatanEngine/CoroutineV2/CoroutineV2"; +import { RandomEx } from "./RandomEx"; + +export module NumberEx { + /** + * 數字滾動 + * @param startNum 開始 + * @param endNum 結束 + * @param callbackfn 結束回呼 + * @param toInt 是否只顯示整數(預設FALSE) + */ + export function* ChangeScore(startNum: number, endNum: number, callbackfn: (num: number) => void, sec: number, toInt: boolean = true) { + let fps = 30; + let waitTime = 0.03; + let changeRate = sec * fps; + changeRate = changeRate - 1 <= 0 ? changeRate : changeRate - 1; + changeRate = 1 / changeRate; + let diff = endNum - startNum; + let isIncrease = endNum >= startNum; + let tempScore = startNum; + let counter = 0; + while (true) { + if (endNum != tempScore) { + tempScore += diff * changeRate; + // 遞增 + if (isIncrease && tempScore > endNum) { + tempScore = endNum; + } + // 遞減 + if (!isIncrease && tempScore < endNum) { + tempScore = endNum; + } + if (toInt) { + callbackfn(tempScore.ExToInt()); + } else { + callbackfn(tempScore); + } + counter++; + yield CoroutineV2.WaitTime(waitTime); + } + else { + callbackfn(endNum); + break; + } + } + } + + /** + * 數字跳動(時間內循環EX:1~4=>1.2.3.4.1.2.3.4.1.2.3.4...) + * @param minNum 起始數字 + * @param maxNum 最終數字 + * @param callbackfn callbackfn + * @param sec 時間 + */ + export function* BeatScore(minNum: number, maxNum: number, endNum: number, callbackfn: (num: number) => void, sec: number): IterableIterator { + let fps: number = 13; + let waitTime: number = 0.07; + let changeRate: number = sec * fps; // -1為了讓changeRate數字能混亂點 + changeRate = changeRate - 1 <= 0 ? changeRate : changeRate - 1; + changeRate = 1 / changeRate; + let diff: number = maxNum - minNum; + let isIncrease: boolean = maxNum >= minNum; + let tempScore: number = minNum; + let counter: number = 0; + let randomRate: number = 0; + let lastNum: number = minNum; + let nowNum: number = minNum; + while (true) { + if (maxNum !== tempScore) { + if (counter % 2 === 0) { + if (isIncrease) { + randomRate = RandomEx.GetFloat(0, diff * changeRate).ExToNumFloorDecimal(2); + } else { + randomRate = RandomEx.GetFloat(0, -diff * changeRate).ExToNumFloorDecimal(2); + } + } else { + randomRate = -randomRate; + } + + tempScore += diff * changeRate + randomRate; + // 遞增 + if (isIncrease && tempScore > maxNum) { + tempScore = maxNum; + } + // 遞減 + if (!isIncrease && tempScore < maxNum) { + tempScore = maxNum; + } + while (nowNum === lastNum) { + nowNum = RandomEx.GetInt(minNum, maxNum + 1); + } + lastNum = nowNum; + callbackfn(nowNum); + // yield null; + counter++; + yield CoroutineV2.WaitTime(waitTime); + } else { + callbackfn(endNum); + break; + } + } + } + + /**是否进行边界检查 */ + let _boundaryCheckingState = false; + + /** + * 检测数字是否越界,如果越界给出提示 + * @param {*number} num 输入数 + */ + function checkBoundary(num: number) { + if (_boundaryCheckingState) { + if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) { + console.warn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`); + } + } + } + + /** + * 精确乘法 + */ + export function times(num1: number, num2: number, ...others: number[]): number { + if (others.length > 0) { + return times(times(num1, num2), others[0], ...others.slice(1)); + } + const num1Changed = num1.Float2Fixed(); + const num2Changed = num2.Float2Fixed(); + const baseNum = num1.DigitLength() + num2.DigitLength(); + const leftValue = num1Changed * num2Changed; + + checkBoundary(leftValue); + + return leftValue / Math.pow(10, baseNum); + } + + /** + * 精确加法 + */ + export function plus(num1: number, num2: number, ...others: number[]): number { + if (others.length > 0) { + return plus(plus(num1, num2), others[0], ...others.slice(1)); + } + const baseNum = Math.pow(10, Math.max(num1.DigitLength(), num2.DigitLength())); + return (times(num1, baseNum) + times(num2, baseNum)) / baseNum; + } + + /** + * 精确减法 + */ + export function minus(num1: number, num2: number, ...others: number[]): number { + if (others.length > 0) { + return minus(minus(num1, num2), others[0], ...others.slice(1)); + } + const baseNum = Math.pow(10, Math.max(num1.DigitLength(), num2.DigitLength())); + return (times(num1, baseNum) - times(num2, baseNum)) / baseNum; + } + + /** + * 精确除法 + */ + export function divide(num1: number, num2: number, ...others: number[]): number { + if (others.length > 0) { + return divide(divide(num1, num2), others[0], ...others.slice(1)); + } + const num1Changed = num1.Float2Fixed(); + const num2Changed = num2.Float2Fixed(); + checkBoundary(num1Changed); + checkBoundary(num2Changed); + return times((num1Changed / num2Changed), Math.pow(10, num2.DigitLength() - num1.DigitLength())); + } + + /** + * 四舍五入 + */ + export function round(num: number, ratio: number): number { + const base = Math.pow(10, ratio); + return divide(Math.round(times(num, base)), base); + } + +} \ No newline at end of file diff --git a/src/utils/Number/NumberEx.ts.meta b/src/utils/Number/NumberEx.ts.meta new file mode 100644 index 0000000..87eb62b --- /dev/null +++ b/src/utils/Number/NumberEx.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "363f5f7f-0623-4013-8571-0bb5c1dc95e6", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/src/utils/Number/RandomEx.ts b/src/utils/Number/RandomEx.ts new file mode 100644 index 0000000..46d81c6 --- /dev/null +++ b/src/utils/Number/RandomEx.ts @@ -0,0 +1,92 @@ +export module RandomEx { + + /** + * 取得隨機布林值 + */ + export function GetBool() { + return GetInt() >= 0; + } + + /** + * 取得隨機整數(回傳min ~ max - 1) + * @param min + * @param max + */ + export function GetInt(min: number = Number.MIN_VALUE, max: number = Number.MAX_VALUE): number { + return Math.floor(Math.random() * (max - min)) + min; + } + + /** + * 取得隨機小數 + * @param min + * @param max + */ + export function GetFloat(min: number = Number.MIN_VALUE, max: number = Number.MAX_VALUE): number { + return Math.random() * (max - min) + min; + } + + /** + * 隨機取得複數個不重複回傳 + * @param num 取得數量 + * @param items 陣列 + */ + export function GetMultiNoRepeat(num: number, items: any[]): any[] { + let result: any[] = []; + for (let i: number = 0; i < num; i++) { + let ran: number = Math.floor(Math.random() * items.length); + let item = items.splice(ran, 1)[0]; + if (result.indexOf(item) == -1) { + result.push(item); + } + } + return result; + } + + /** + * 根據權重取得複數個不重複回傳 + * @param prize 獎項 + * @param weights 機率 + * @param count 數量 + */ + export function GetMultiNoRepeatByWeight(prize: any[], weights: number[] = null, count: number = 1): any[] { + if (weights === null) { + weights = []; + for (let i: number = 0; i < prize.length; i++) { + weights.push(1); + } + } + let target: any[] = []; + for (let i: number = 0; i < count; i++) { + let results: number[] = RandomEx.GetPrizeByWeight(prize, weights); + prize.splice(results[0], 1); + weights.splice(results[0], 1); + target.push(results[1]); + } + return target; + } + + + /** + * 根據權重隨機取值 + * @param prize 獎項 + * @param weights 機率 + */ + export function GetPrizeByWeight(prize: any[], weights: number[]): any[] { + if (prize.length !== weights.length) { + console.error(`GetWeight error -> prize.length:${ prize.length } !== weights.length:${ weights.length }`); + return null; + } + let totalWeight: number = 0; + for (let i: number = 0; i < weights.length; i++) { + totalWeight += weights[i]; + } + let random: number = RandomEx.GetInt(0, totalWeight) + 1; + let nowWeight: number = weights[0]; + for (let i: number = 0; i < weights.length; i++) { + if (nowWeight >= random) { + return [i, prize[i]]; + } + nowWeight += weights[i + 1]; + } + } +} diff --git a/src/utils/Number/RandomEx.ts.meta b/src/utils/Number/RandomEx.ts.meta new file mode 100644 index 0000000..3b2c3db --- /dev/null +++ b/src/utils/Number/RandomEx.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "ba4dee5b-ca5b-4435-a068-c4f5dd832bab", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/src/utils/NumberExtension.ts b/src/utils/NumberExtension.ts new file mode 100644 index 0000000..945072c --- /dev/null +++ b/src/utils/NumberExtension.ts @@ -0,0 +1,192 @@ +// eslint-disable-next-line @typescript-eslint/no-unused-vars +declare interface Number { + + /** + * 金額每三位數(千)加逗號, 並且補到小數點第2位 + * 輸出 41,038,560.00 + * @param precision 補到小數點第幾位 + * @param isPadZero 是否要補零(預設FALSE) + * */ + ExFormatNumberWithComma(precision?: number, isPadZero?: boolean): string; + + /** + * 基本4位數(9,999-999B-T) + * */ + ExTransferToBMK(precision?: number, offset?: number): string; + + /** + * 數字轉字串, 頭補0 + * @param size + */ + Pad(size: number): string; + + /** + * 四捨五入到小數點第X位 (同server計算規則) + * @param precision + */ + ExToNumRoundDecimal(precision: number): number; + + /** + * 無條件捨去到小數點第X位 + * @param precision + */ + ExToNumFloorDecimal(precision: number): number; + + /** + * 無條件捨去強制保留X位小數,如:2,會在2後面補上00.即2.00 + * @param precision 補到小數點第幾位 + * @param isPadZero 是否要補零(預設FALSE) + */ + ExToStringFloorDecimal(precision: number, isPadZero?: boolean): string; + + /** + * 取整數) + */ + ExToInt(): number; + + /** + * 小數轉整數(支援科學符號) + */ + Float2Fixed(): number; + + /** + * 數字長度(支援科學符號) + */ + DigitLength(): number; + + target: number; + + +} + +Number.prototype.ExFormatNumberWithComma || Object.defineProperty(Number.prototype, "ExFormatNumberWithComma", { + enumerable: false, + value: function (precision: number = 2, isPadZero: boolean = false) { + + // let arr = String(this).split('.'); + const arr = this.ExToStringFloorDecimal(precision, isPadZero).split("."); + let num = arr[0], result = ""; + while (num.length > 3) { + result = "," + num.slice(-3) + result; + num = num.slice(0, num.length - 3); + } + if (num.length > 0) result = num + result; + return arr[1] ? result + "." + arr[1] : result; + } +}); + + +Number.prototype.ExTransferToBMK || Object.defineProperty(Number.prototype, "ExTransferToBMK", { + enumerable: false, + value: function (precision: number = 2, offset: number = 0) { + /** 千 */ + const MONEY_1K: number = 1000; + /** 萬 */ + // let MONEY_10K: number = 10000; + /** 十萬 */ + // let MONEY_100K: number = 100000; + /** 百萬 */ + const MONEY_1M: number = 1000000; + /** 千萬 */ + // let MONEY_10M: number = 10000000; + /** 億 */ + // let MONEY_100M: number = 100000000; + /** 十億 */ + const MONEY_1B: number = 1000000000; + /** 百億 */ + // let MONEY_10B: number = 10000000000; + /** 千億 */ + // let MONEY_100B: number = 100000000000; + /** 兆 */ + // let MONEY_1T: number = 1000000000000; + offset = Math.pow(10, offset); + // if (this >= MONEY_1T * offset) { + // //(3)1,000T + // //1T~ + // return (~~(this / MONEY_1T)).ExFormatNumberWithComma(0) + "T"; + // } + if (this >= MONEY_1B * offset) { + // 1,000B~900,000B + // 1B~900B + return (this / MONEY_1B).ExFormatNumberWithComma(3, false) + "B"; + } else if (this >= MONEY_1M * offset) { + // 1,000M~900,000M + // 1M~900M + return (this / MONEY_1M).ExFormatNumberWithComma(3, false) + "M"; + } else if (this >= MONEY_1K * offset) { + // 1,000K~900,000K + // 1K~90K + return (this / MONEY_1K).ExFormatNumberWithComma(3, false) + "K"; + } else { + // 0~9,000,000 + // 0~9,000 + return this.ExFormatNumberWithComma(precision); + } + } +}); +Number.prototype.Pad || Object.defineProperty(Number.prototype, "Pad", { + enumerable: false, + value: function (size: number) { + let s = this + ""; + while (s.length < size) s = "0" + s; + return s; + } +}); +Number.prototype.ExToNumRoundDecimal || Object.defineProperty(Number.prototype, "ExToNumRoundDecimal", { + enumerable: false, + value: function (precision: number) { + return Math.round(Math.round(this * Math.pow(10, (precision || 0) + 1)) / 10) / Math.pow(10, (precision || 0)); + } +}); +Number.prototype.ExToInt || Object.defineProperty(Number.prototype, "ExToInt", { + enumerable: false, + value: function () { + return ~~this; + } +}); +Number.prototype.ExToNumFloorDecimal || Object.defineProperty(Number.prototype, "ExToNumFloorDecimal", { + enumerable: false, + value: function (precision: number) { + const str = this.toPrecision(12); + const dotPos = str.indexOf("."); + return dotPos == -1 ? this : +`${ str.substr(0, dotPos + 1 + precision) }`; + } +}); +Number.prototype.ExToStringFloorDecimal || Object.defineProperty(Number.prototype, "ExToStringFloorDecimal", { + enumerable: false, + value: function (precision: number, isPadZero: boolean = false) { + // 取小數點第X位 + const f = this.ExToNumFloorDecimal(precision); + let s = f.toString(); + // 補0 + if (isPadZero) { + let rs = s.indexOf("."); + if (rs < 0) { + rs = s.length; + s += "."; + } + while (s.length <= rs + precision) { + s += "0"; + } + } + return s; + } +}); +Number.prototype.Float2Fixed || Object.defineProperty(Number.prototype, "Float2Fixed", { + enumerable: false, + value: function () { + if (this.toString().indexOf("e") === -1) { + return Number(this.toString().replace(".", "")); + } + const dLen = this.DigitLength(); + return dLen > 0 ? +parseFloat((this * Math.pow(10, dLen)).toPrecision(12)) : this; + } +}); +Number.prototype.DigitLength || Object.defineProperty(Number.prototype, "DigitLength", { + enumerable: false, + value: function () { + const eSplit = this.toString().split(/[eE]/); + const len = (eSplit[0].split(".")[1] || "").length - (+(eSplit[1] || 0)); + return len > 0 ? len : 0; + } +}); diff --git a/src/utils/PWANotification.ts b/src/utils/PWANotification.ts new file mode 100644 index 0000000..2a39cd0 --- /dev/null +++ b/src/utils/PWANotification.ts @@ -0,0 +1,99 @@ +import BusinessTypeSetting, { BusinessEnum } from "@/_BusinessTypeSetting/BusinessTypeSetting"; +import { initializeApp } from "firebase/app"; +import { getMessaging, getToken } from "firebase/messaging"; + + +// Public Key: +// BPxB0rLAHuETo-CFw6xe2_ZlQ8qm6WAg-i45UTStiYYU0pPYR1wuO0jwt8S_gRl_hYFNoI1l0l4vFksncHC5yUs + +// Private Key: +// 2-dDtLj8ibIOj51RD9ASV3DtTjkmFQyn_zId3V4OtwA +const applicationServerPublicKey: string = `BPxB0rLAHuETo-CFw6xe2_ZlQ8qm6WAg-i45UTStiYYU0pPYR1wuO0jwt8S_gRl_hYFNoI1l0l4vFksncHC5yUs`; +const swjsPath: string = "./assets/sw.js"; + +export function PWAOnLoad() { + if (BusinessTypeSetting.UseServerType !== BusinessEnum.ServerType.Internal_Dev) { + return; + } + if ("serviceWorker" in navigator) { + navigator.serviceWorker + .register(swjsPath) + .then((reg: ServiceWorkerRegistration) => { + console.debug("Service Worker Registered"); + askForNotificationPermission(); + setFCM(reg); + }); + } +} + +/** + * + * @url https://stackoverflow.com/questions/50399170/what-bearer-token-should-i-be-using-for-firebase-cloud-messaging-testing + */ +function setFCM(reg: ServiceWorkerRegistration) { + // Your web app's Firebase configuration + // For Firebase JS SDK v7.20.0 and later, measurementId is optional + const firebaseConfig = { + apiKey: "AIzaSyAZ1Hkr-tmF5xqnNWy0jprXDy1xEZUyYy8", + authDomain: "jm-webpush.firebaseapp.com", + projectId: "jm-webpush", + storageBucket: "jm-webpush.appspot.com", + messagingSenderId: "903093229309", + appId: "1:903093229309:web:54a3006e1e1afdeaefd094", + measurementId: "G-SBKR7HBFBB" + }; + + // Initialize Firebase + const app = initializeApp(firebaseConfig); + // const analytics = getAnalytics(app); + + // Initialize Firebase Cloud Messaging and get a reference to the service + const messaging = getMessaging(app); + + // Add the public key generated from the console here. + getToken(messaging, { vapidKey: applicationServerPublicKey, serviceWorkerRegistration: reg }).then((currentToken) => { + if (currentToken) { + // Send the token to your server and update the UI if necessary + console.debug(`[Test] Firebase Token: ${currentToken}`); + } else { + // Show permission request UI + console.debug("[Test] No registration token available. Request permission to generate one."); + // ... + } + }).catch((err) => { + console.debug("[Test] An error occurred while retrieving token. ", err); + // ... + }); +} + +export function askForNotificationPermission() { + if ("Notification" in window) { + // console.log("Notification permission default status:", Notification.permission); + Notification.requestPermission(function (result: NotificationPermission) { + // 這裡result只會有兩種結果:一個是用戶允許(granted),另一個是用戶封鎖(denied) + // console.log("Notification permission status:", status); + if (result !== "granted") { + console.log("No notification permission granted!"); + } else { + displayConfirmNotification(); + } + }); + } +} + +function displayConfirmNotification() { + // pushNotification("成功訂閱!! (from Service Worker)", "您已成功訂閱我們的推播服務!"); +} + +export function pushNotification(title: string, content: string) { + if ("serviceWorker" in navigator && Notification.permission == "granted") { + const options = { + body: content, + icon: "../img/jpg/logo512.jpg" + }; + // navigator.serviceWorker.ready.then(function (swreg: ServiceWorkerRegistration) { + navigator.serviceWorker.getRegistration(swjsPath).then(function (swreg: ServiceWorkerRegistration) { + swreg.showNotification(title, options); + }); + } +} \ No newline at end of file diff --git a/src/utils/String.ts b/src/utils/String.ts new file mode 100644 index 0000000..9c947f5 --- /dev/null +++ b/src/utils/String.ts @@ -0,0 +1,20 @@ +declare global { + interface StringConstructor { + IsNullOrEmpty: (value: string) => boolean; + Format: (format: string, ...args: any[]) => string; + } +} + +String.IsNullOrEmpty = function (value: string): boolean { + return value === undefined || value === null || value.trim() === ""; +}; + +String.Format = function (format: string, ...args: any[]): string { + return format.replace(/{(\d+)}/g, (match, index) => { + const value = args[index]; + if (value === null || value === undefined) return ""; + return "" + value; + }); +}; + +export {}; diff --git a/src/utils/catan.ts b/src/utils/catan.ts new file mode 100644 index 0000000..1d51471 --- /dev/null +++ b/src/utils/catan.ts @@ -0,0 +1,48 @@ +declare namespace cc { } +declare namespace cc._decorator { + // export function ccclass(name?: string): Function; + // export function ccclass(_class?: Function): void; +} +declare let CC_PREVIEW: boolean; +namespace cc._decorator { + // export function ccclass(name?: string): Function { return () => { }; } + export const ccclass: any = undefined; +} + +namespace cc { + export class path { + static basename(pathStr: string, extname?: string): any { } + } + export class sys { + static localStorage: any; + } + export class AudioClip { + name: string; + } + export class Prefab { + + } + export class Asset { + constructor(name?: string) { } + name: string; + } + export class assetManager { + static loadRemote(url: string, onComplete: (err: Error, asset: T) => void): void { } + } + export class Node extends Asset { + getChildByName(name: string): Node { return undefined; } + ExAddChild(childObj: cc.Prefab | cc.Node, childActive?: boolean): cc.Node { return undefined; } + setParent(value: Node): void { } + active: boolean; + children: Node[]; + } + export function log(msg: string | any, ...subst: any[]): void { + console.log(msg, ...subst); + } + export function warn(msg: string | any, ...subst: any[]): void { + console.warn(msg, ...subst); + } + export function error(msg: string | any, ...subst: any[]): void { + console.error(msg, ...subst); + } +} \ No newline at end of file diff --git a/src/utils/iframeUtils.ts b/src/utils/iframeUtils.ts new file mode 100644 index 0000000..3809ce7 --- /dev/null +++ b/src/utils/iframeUtils.ts @@ -0,0 +1,47 @@ +import { CSSProperties } from "react"; +import { sleep } from "."; + +/** + * 動態創建iframe + * @param parent 容器節點 + * @param url 遊戲網址 + * @param style CSSProperties + */ +export function createIframe(parent: string, url: string, style?: CSSProperties): HTMLIFrameElement { + const iframe: HTMLIFrameElement = document.createElement("iframe"); + iframe.src = url; + iframe.frameBorder = "0"; + iframe.scrolling = "0"; + for (let i: number = 0, keys: string[] = Object.keys(style); i < keys.length; i++) { + const key: string = keys[i]; + iframe.style[key] = style[key]; + } + document.getElementById(parent).appendChild(iframe); + return iframe; +} + +/** + * 銷毀 iframe + * @param parent 容器節點 + */ +export async function destroyIframe(parent: string) { + const iframeContent: HTMLElement = document.getElementById(parent); + for (let i = 0; i < iframeContent.children.length; i++) { + const iframeNode: HTMLIFrameElement = iframeContent.children[i] as HTMLIFrameElement; + try { + iframeNode.src = "about:blank"; + await sleep(10); + const iframeWindow = iframeNode.contentWindow; + iframeWindow.document.open(); + iframeWindow.document.write(""); + iframeWindow.document.clear && iframeWindow.document.clear(); + iframeWindow.document.close(); + } catch (error) { + console.warn(error); + } + iframeNode.remove(); + iframeNode.parentNode && iframeContent.removeChild(iframeNode); + // Cocos.CocosEventListener.RemoveAllCallbacks(); + // await sleep(2000); + } +} \ No newline at end of file diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..acb480c --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,652 @@ +import { ResourceItemType } from "@/Common/ResourceItem/ResourceItemType"; +import { BaseEnumerator } from "@/Engine/CatanEngine/CoroutineV2/Core/BaseEnumerator"; +import { TableManager } from "@/Engine/CatanEngine/TableV3/TableManager"; +import CSSettingsV3 from "@/FormTable/CSSettingsV3"; +import { ShopMycardTableRow, ShopShow2TableRow } from "@/FormTable/Tables/ShopTable"; +import { Cocos } from "@/assets/VueScript/Cocos"; +import { CocosVueScript } from "@/assets/VueScript/CocosVueScript"; +import GameData_Cocos from "@/assets/VueScript/share/GameData_Cocos"; +import { FriendRequest } from "@/define/Request/FriendRequest"; +import { TxnRequest } from "@/define/Request/TxnRequest"; +import { VIPLevelMapForChat } from "@/map"; +import Player from "@/modules/player"; +import { UserBindFlag } from "@/modules/player/define/userbind_flag"; +import { ChatRoomRole, Games, ItemCodeList, ItemPropsType, ItemSize, PriceList, SelectorItemProps, StringContentType, TagTypes, TxnCenterData } from "@/types"; +import liff from "@line/liff"; +import axios, { AxiosResponse } from "axios"; +import { isMobile } from "react-device-detect"; +import * as Scroll from "react-scroll"; +import stringWidth from "string-width"; +import BusinessTypeSetting, { FolderName } from "../_BusinessTypeSetting/BusinessTypeSetting"; + +export const transArray = (array: T[], split: number): T[][] => { + const newArr = []; + const copiedArr = array ? array?.slice() : []; + const length = copiedArr?.length; + for (let i = 0, j = 0; i < length; i += split, j++) { + newArr[j] = copiedArr.splice(0, split); + } + return newArr; +}; + +/** 去掉英文+百分比% */ +export function onlyNumber(stringText: string): number { + const str = +stringText.replace(/[A-Za-z%]/g, ""); + return str; +} + +export function wordsLimit(limit: number, string: string) { + const length = string?.length; + const isOverLimit = length > limit; + const result = isOverLimit ? "..." : ""; + return string?.substring(0, limit) + result; +} + +export const capitalize = (str: string) => + `${str.charAt(0).toUpperCase()}${str.slice(1)}`; + +export function checkForUnique(str: string): boolean { + const chineseCharacterMatch = + /[\p{Unified_Ideograph}\u3006\u3007][\ufe00-\ufe0f\u{e0100}-\u{e01ef}]?/gmu; + const arr = str.match(chineseCharacterMatch); + if (arr === null) return true; + return !hasDuplicates(arr); +} + +export function onlyChinese(str: string) { + const chineseCharacterMatch = + /[\p{Unified_Ideograph}\u3006\u3007][\ufe00-\ufe0f\u{e0100}-\u{e01ef}]?/gmu; + const arr = str.match(chineseCharacterMatch); + return arr.join(""); +} + +export function hasDuplicates(array: string[]): boolean { + return new Set(array).size !== array.length; +} + +export function generatePriceList( + arr: [ID: number, ProductId: number, ShowMoney: number][], + items: { [id: string]: [ID: number, price: number] }, + priceRef: ShopMycardTableRow[], + itemCodeList?: Map, +): PriceList[] { + if (itemCodeList) { + arr = arr.filter((item) => itemCodeList.has(item[0])); + } + const MyCardPriceRefMap = new Map( + priceRef.map((item) => [item.Id, item.Price]), + ); + const newArr: [ID: number, ProductId: number, ShowMoney: number][] = []; + for (const item of Object.values(items)) { + arr.forEach((v: [ID: number, ProductId: number, ShowMoney: number]) => { + if (v[1] === item[0]) { + newArr.push(v); + } + }); + } + return newArr + .map((item) => ({ + ID: item[0], + points: item[2], + price: MyCardPriceRefMap.get(item[1]), + })) + .sort((a, b) => b.price - a.price); +} + +/** 支付列表 */ +export function generatePaymentList( + arr: string[], + priceRef: ShopShow2TableRow[], +): ShopShow2TableRow[] { + const newArr: ShopShow2TableRow[] = []; + for (const item of Object.values(priceRef)) { + arr.forEach((x) => { + if (item.Show && x === item.Key) newArr.push(item); + }); + } + + // priceRef.forEach((value: ShopShow2TableRow) => { + // arr.includes(value.Key); + // }) + return newArr; +} + +/** getQueryParameters */ +export function getQueryParameters(v: string): string { + const queryParameters = new URLSearchParams(location.search); + return queryParameters.get(v); +} + +export function createMap(obj: unknown) { + return new Map(Object.entries(obj)); +} + +export function isArray(itemCode: string | string[]): boolean { + return Array.isArray(itemCode); +} + +export function formatTime(date: Date): string { + const hours = date.getHours(); + const minutes = date.getMinutes(); + const amPm = hours >= 12 ? "pm" : "am"; + const formattedHours = hours % 12 === 0 ? 12 : hours % 12; + const formattedMinutes = minutes < 10 ? "0" + minutes : minutes; + return `${formattedHours}:${formattedMinutes} ${amPm}`; +} + +export function getCurrentLocalTime() { + const date = new Date(); + const utcTime = date.getTime(); + return new Date(utcTime).toLocaleTimeString(); +} + +export function transferColorText(str: string): string { + const regex = /color=/g; + const replacement = "span style=color:"; + const result = str.replace(regex, replacement); + const regex2 = /color>/g; + const replacement2 = "span>"; + return result.replace(regex2, replacement2); +} + +export function generateItemsData( + games: Map, + favoriteGames: number[], +): ItemPropsType[] { + let itemsData: boolean | ItemPropsType[] = []; + const s = new Set(favoriteGames); + if (games.size) { + // @ts-ignore + for (const [gameID, [vendorID, id, VIPLimit, status, tag]] of games) { + const dataObj: ItemPropsType = { + id: gameID, + vendorID: vendorID.toString(), + img: { + url: `${BusinessTypeSetting.UseDownloadUrl}${FolderName.Game}${id}/b`, + }, + size: ItemSize.small, + tag: tag as unknown as TagTypes, + lockBtn: VIPLimit, + like: s.has(id), + status, + }; + + itemsData.push(dataObj); + } + } else { + itemsData = []; + } + + return itemsData; +} + +export function generateItemsDataMap(games: Games): Map { + const map = new Map(); + for (const [gameID, value] of Object.entries(games)) { + map.set(gameID, value); + } + return map; +} + +export function sortedGames(sorts: number[], map: Map) { + const obj = new Map(); + sorts?.forEach((gameID) => { + obj.set("" + gameID, map?.get("" + gameID)); + }); + return obj; +} + +export function addPropertiesToDefaultItem( + games: any[], + selectedID: number, +): SelectorItemProps[] { + const index = games.findIndex((item) => parseInt(item.id) === selectedID); + const newGames = games.slice(); + + return newGames.map((g, i) => + i === index + ? { ...g, selected: true, defaultItem: true } + : { + ...g, + selected: false, + defaultItem: false, + }, + ); +} + +export function switchObjToMap(games: Games) { + // for (const [gameID, value] of Object.entries(games)) { + // map.set(gameID, value) + // } + return new Map(Object.entries(games)); +} + +export function hexToRgb( + hex: string, + // eslint-disable-next-line @typescript-eslint/typedef + result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex), +) { + const x = result ? result.map((i) => parseInt(i, 16)).slice(1) : null; + return { + r: x[0], + g: x[1], + b: x[2], + }; +} + +export function replaceBorderColor(string: string, color: string) { + const hasComma = string.includes(","); + if (hasComma) { + const result = string.split(",").map((s, i) => { + const index = s.indexOf("#"); + const replaceStr = s.substring(index); + return s.replace(replaceStr, i === 0 ? "black" : color); + }); + return result.join(","); + } else { + const index = string.indexOf("#"); + const replaceStr = string.substring(index); + return string.replace(replaceStr, color); + } +} + +export function generateMessage(message: string) { + return { + AID: "10000000063", + nickName: "masterkai", + profileIMG: "./img/png/avatar.png", + role: ChatRoomRole.player, + message: message, + created: getCurrentLocalTime(), + vip: VIPLevelMapForChat.get(4), + }; +} + +export function getVIPLevelFromStr(vipStr: string) { + const arr = vipStr.split("."); + const str = arr[0]; + return str.at(-1); +} + +interface Accumulator { + [AID: number]: { + AID: number; + nickName: string; + avatar: number; + role: number; + vip: number; + messages: { + message: string; + created: number; + }[]; + }; +} + +export function sleep(ms: any): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +export async function downloadJSON(formname: string) { + const patchUrl: string = + BusinessTypeSetting.UsePatch + BusinessTypeSetting.FolderUrlJson; + let fileUrl: string = `${patchUrl}${formname}.json`; + fileUrl = fileUrl + "?v=" + Date.now(); + let resp: AxiosResponse = null; + axios.get(fileUrl).then((res: AxiosResponse) => { + loadJsonProcess(null, res, formname); + resp = res; + }); + while (!resp) { + await sleep(0.1); + } +} + +function loadJsonProcess( + err: any, + res: AxiosResponse, + formname: string, +) { + res["name"] = formname; + TableManager.AddJsonAsset(res.data); +} + +export function getProfileImgUrl(avatar: number, aId: number) { + return avatar === 1 + ? `${BusinessTypeSetting.UseDownloadUrl}avatar/${aId}` + : "./img/common/DefaultAvatar.png"; +} + +export const CssStringContent = ( + StringKey: number, + StringID: number | string, +): string => { + switch (StringKey) { + case StringContentType.String: + return StringID?.toString(); + case StringContentType.CSSString: + return CSSettingsV3.prototype.CommonString(+StringID); + case StringContentType.CSSMailString: + return CSSettingsV3.prototype.CSSMailString(+StringID); + case StringContentType.CSSNetworkString: + return ""; // CSSettingsV3.Network.Priority[StringID][LanguageManager.GetMsgId()]; + case StringContentType.HallString: + /* 廳管1~4 但表格是從2號位開始 */ + return CSSettingsV3.prototype.LobbyString(1 + +StringID); + + default: + break; + } + return; +}; + +export function txnDataTransformer( + arr: TxnRequest.TxnInfo[], + playerAid: number, +): TxnCenterData[] { + return arr.map( + ([ + sn, + time, + giver, + receiver, + status, + fee, + [[category, categoryId, quantity]], + ]) => ({ + serialNum: sn, + createdAt: time, + giverAid: giver[0], + giverName: giver[1], + isGiver: giver[0] === playerAid, + receiverAid: receiver[0], + receiverName: receiver[1], + status: +status, + quantity, + fee, + }), + ); +} + +export function calculatedReward(rewards: [number, number][]) { + const maximum = 6; + const result = []; + const couponType = ResourceItemType.Card_Coupon; + rewards.forEach(([type, quantity]) => { + if (type === couponType && quantity > maximum) { + const packNum = Math.floor(quantity / maximum); + const returnPack = Array.from({ length: packNum }, () => [ + couponType, + maximum, + ]); + const remainder = quantity % maximum; + const returnRemainder = remainder ? [couponType, remainder] : null; + if (returnRemainder) { + returnPack.push(returnRemainder); + } + returnPack.forEach((item) => result.push(item)); + } else { + result.push([type, quantity]); + } + }); + return result; +} + +export const random = (min: number, max: number) => + Math.floor(Math.random() * (max - min)) + min; + +// Default color is a bright yellow +const DEFAULT_COLOR = "hsl(50deg, 100%, 50%)"; +export const generateSparkle = (color = DEFAULT_COLOR) => { + return { + id: "" + random(10000, 99999), + createdAt: Date.now(), + // Bright yellow color: + color, + size: random(20, 60), + style: { + // Pick a random spot in the available space + top: random(0, 100) + "%", + left: random(0, 100) + "%", + // Float sparkles above sibling content + zIndex: 2, + }, + }; +}; + +export const range = (start, end, step = 1) => { + const output = []; + if (typeof end === "undefined") { + end = start; + start = 0; + } + for (let i = start; i < end; i += step) { + output.push(i); + } + return output; +}; + +export async function waitSetBusinessType() { + while (!BusinessTypeSetting.UseHost) { + await sleep(100); + } +} + +/** + * 是否為好友 + * @param {number} aId AID + */ +export function isMyFriend(aId: number): boolean { + let isTrue: boolean = false; + const playerData = Player.data.getState(); + const lists: FriendRequest.ListFriendData = playerData.account.allowList; + for (let i = 0; i < lists.length; i++) { + const list: FriendRequest.SingleFriendData = lists[i]; + if (list[0] === aId) { + isTrue = true; + break; + } + } + return isTrue; +} + +/** + * 是否為黑單 + * @param {number} aId AID + */ +export function isMyDeny(aId: number): boolean { + let isTrue: boolean = false; + const playerData = Player.data.getState(); + const lists: FriendRequest.ListFriendData = playerData.account.denyList; + for (let i = 0; i < lists.length; i++) { + const list: FriendRequest.SingleFriendData = lists[i]; + if (list[0] === aId) { + isTrue = true; + break; + } + } + return isTrue; +} + +export const sheetNameResourceTypeSwitcher = ( + resourceType: ResourceItemType, +) => { + switch (resourceType) { + case ResourceItemType.Card_Coupon: + return "CouponSetting"; + case ResourceItemType.Card: + return "Card1Setting"; + default: + return "Card1Setting"; + } +}; + +export function escapeCodesNToBr(v: string): string { + return v.replace(/\n/g, "
"); +} + +/** + * 切割顯示字串長度 + * @param str + * @param showBytes 字元數(1中文2BYTES) + * @returns + */ +export function trimString( + str: string, + showBytes: number = 12, + ellipses: boolean = true, +): string { + if (!str) { + return str; + } + let bytes: number = stringWidth(str); + if (bytes <= showBytes) { + return str; + } + let byteAmount: number = 0; + let strLength: number = str.length; + for (let i: number = 0; i < strLength; i++) { + let word: string = str[i]; + bytes = stringWidth(word); + byteAmount += bytes; + if (byteAmount > showBytes) { + let checkStr: string = str.substring(0, i + 1); + let checkByte: number = stringWidth(checkStr); + if (checkByte < showBytes) { + byteAmount = checkByte; + continue; + } + let result: string = str.substring(0, i); + if (ellipses) { + return result + "..."; + } else { + return result; + } + } + } + console.error("Trim Nickname Error."); + return str; +} + +/** CommonEventType */ +export enum CommonEventType { + /** Maintenance */ + Maintenance, + /**ActivityReRender */ + ActivityReRender, +} + + +export function responsiveText(characters: number): number { + if (characters <= 10) return 1.125; + if (characters > 10 && characters <= 20) return 0.9; + if (characters > 20) return 0.8; +} + +export function discount(numberOff: number): number { + return (100 - numberOff) / 100; +} + +/** 預載字體 */ +export function PreloadFont(fonts: string[]): void { + // Check if API exists + if (document && document.fonts) { + // Do not block page loading + setTimeout(function (): void { + let successCount: number = 0; + for (let i: number = 0; i < fonts.length; i++) { + const font: string = fonts[i]; + // eslint-disable-next-line no-loop-func + document.fonts.load(`16px ${font}`).then(() => { + // Make font using elements visible + successCount++; + if (successCount === fonts.length) { + document.documentElement.classList.add("font-loaded"); + } + }); + } + }, 0); + } else { + // Fallback if API does not exist + document.documentElement.classList.add("font-loaded"); + } +} + +// PWA +/** BeforeInstallPromptEvent */ +export let deferredPrompt: any; +window.addEventListener("beforeinstallprompt", (e) => { + // Prevent Chrome 67 and earlier from automatically showing the prompt + e.preventDefault(); + // Stash the event so it can be triggered later. + deferredPrompt = e; + // Update UI to notify the user they can add to home screen + Cocos.CocosEventListener.DispatchCallback(GameData_Cocos.CELT.PWAInitOK, e); +}); +export function addToHomeScreen(): void { + if (isMobile) { + let url: string = + BusinessTypeSetting.UsePatch + + "addtohomescreen/index.html" + + "?v=" + + Date.now(); + liff.openWindow({ + url: url, + external: true, + }); + } else { + if (deferredPrompt) { + // Show the prompt + deferredPrompt.prompt(); + // Wait for the user to respond to the prompt + deferredPrompt.userChoice.then((choiceResult) => { + if (choiceResult.outcome === "accepted") { + // console.log("User accepted the A2HS prompt"); + Cocos.CocosEventListener.DispatchCallback(GameData_Cocos.CELT.PWAInitOK, false); + } else { + // console.log("User dismissed the A2HS prompt"); + } + deferredPrompt = null; + }); + } + } +} + +export function getArray(count: number): number[] { + const array: number[] = []; + for (let i: number = 0; i < count; i++) { + array.push(i); + } + return array; +} + +/** 判斷登入並且Line綁定完 */ +export function checkWait(): boolean { + const playerData = Player.data.getState(); + const isLineBind: boolean = Player.hasUserBindFlag(UserBindFlag.LineBind); + if (!BaseEnumerator.isInit) { + return true; + } else if (!CocosVueScript.Instance || !CocosVueScript.Instance?.GetLoginData()) { + return true; + } else if (!playerData.account.role && !isLineBind) { + return true; + } + return false; +} + +export function scrollToBottom(dynamicListHeight: number, duration: number = 200) { + Scroll.animateScroll.scrollTo(dynamicListHeight, { + duration: duration, + smooth: "easeInQuad", + containerId: "scrollableDiv", + offset: 50 + }); +} + +export function Copy(serialNum: string) { + try { + navigator.clipboard.writeText(serialNum); + } + catch (error) { + console.error(error); + } +} \ No newline at end of file diff --git a/src/utils/setRPCData.ts b/src/utils/setRPCData.ts new file mode 100644 index 0000000..ce0efb0 --- /dev/null +++ b/src/utils/setRPCData.ts @@ -0,0 +1,235 @@ +import MainControl from "@/Common/MainControl/MainControl"; +import { CoroutineV2 } from "@/Engine/CatanEngine/CoroutineV2/CoroutineV2"; +import { TTeamBattleData } from "@/UI/RouterPage/GameContent/GameContentUtils"; +import { Cocos } from "@/assets/VueScript/Cocos"; +import { CommonEventCallBack } from "@/assets/VueScript/CocosVueScript"; +import GameData_Cocos from "@/assets/VueScript/share/GameData_Cocos"; +import { GiftCallBack, GiftEventEnum, PanelType, UpdateOneListInfo } from "@/components/ModalContent/TxnModal/txnUtils"; +import { gameObj } from "@/context/GameItemsContext"; +import { LocalStorage } from "@/define"; +import { EActivitySyncType, RpcActivityComSyncResponse, TActivityComSyncData, TActivitySyncData } from "@/define/Request/ActivityRequest"; +import { ResponseBackpackInfo } from "@/define/Request/BackpackRequest"; +import { FriendRequest } from "@/define/Request/FriendRequest"; +import { ProfileRequest } from "@/define/Request/ProfileRequest"; +import { TxnRequest } from "@/define/Request/TxnRequest"; +import { VipRequest } from "@/define/Request/VIPRequest"; +import Player from "@/modules/player"; +import { State } from "@/modules/player/define/data"; +import { BackpackItemData } from "@/modules/player/define/data/backpack"; +import { CommonEventType } from "."; + +let SN: number = 0; + +export function profileInfo(data: ProfileRequest.InfoResponse): void { + const playerData: State = Player.data.getState(); + if (data.aId !== playerData.account.aId) { + return; + } + playerData.account.name = data.name; + playerData.account.message = data.msg; + playerData.account.phone = data.phone; + playerData.account.money = data.money; + playerData.vip.level = data.vip; + Player.data.setState(playerData); +} + +export function vipInfo(data: VipRequest.InfoResponse): void { + const playerData: State = Player.data.getState(); + playerData.vip.level = data.level; + playerData.vip.totalBet = data.bet; + playerData.vip.totalCharge = data.sv; + playerData.vip.rich = data.rich; + playerData.vip.et = data.et; + Player.data.setState(playerData); +} + +export function friendAllowList(data: FriendRequest.ListFriendData): void { + const playerData: State = Player.data.getState(); + playerData.account.allowList = data; + Player.data.setState(playerData); +} + +export function friendDenyList(data: FriendRequest.ListFriendData): void { + const playerData: State = Player.data.getState(); + playerData.account.denyList = data; + Player.data.setState(playerData); +} + +export function activityComSync(data: RpcActivityComSyncResponse): void { + const { teamBattleData, setTeamBattleData } = gameObj; + for (let i = 0; i < data.length; i++) { + const activityComSyncData: TActivityComSyncData = data[i]; + const [id, activitySyncDatas] = activityComSyncData; + // for (let j = 0; j < teamBattleData.length; j++) { + // const teamBattle: TTeamBattleData = teamBattleData[j]; + // const [teamBattleId, , ,] = teamBattle; + // if (id === teamBattleId) { + // for (let k = 0; k < activitySyncDatas.length; k++) { + // const activitySyncData: TActivitySyncData = activitySyncDatas[k]; + // const [type, value] = activitySyncData; + // switch (type) { + // case EActivitySyncType.IsOpen: { + // teamBattleData[j][1] = -1; + // setTeamBattleData(teamBattleData); + // break; + // } + + // case EActivitySyncType.Sync: { + // teamBattleData[j][1] = value; + // setTeamBattleData(teamBattleData); + // break; + // } + + // case EActivitySyncType.Task: { + + // break; + // } + + // default: + // break; + // } + // } + // break; + // } + // } + + + for (let j = 0; j < activitySyncDatas.length; j++) { + const activitySyncData: TActivitySyncData = activitySyncDatas[j]; + const [type, value] = activitySyncData; + switch (type) { + case EActivitySyncType.IsOpen: { + // for (let k = 0; k < teamBattleData.length; k++) { + // const teamBattle: TTeamBattleData = teamBattleData[k]; + // const [teamBattleId, , ,] = teamBattle; + // if (id === teamBattleId) { + // teamBattleData[j][1] = value; + // setTeamBattleData(teamBattleData); + // break; + // } + // } + break; + } + + case EActivitySyncType.Sync: { + for (let k = 0; k < teamBattleData.length; k++) { + const teamBattle: TTeamBattleData = teamBattleData[k]; + const [teamBattleId, , ,] = teamBattle; + if (id === teamBattleId) { + teamBattleData[j][1] = value; + setTeamBattleData(teamBattleData); + break; + } + } + break; + } + + case EActivitySyncType.Task: { + + break; + } + + default: + break; + } + } + } + CommonEventCallBack.DispatchCallback(CommonEventType.ActivityReRender, null); +} + +export function backpackInfo(data: ResponseBackpackInfo[], isAdd: boolean = false): void { + const playerData: State = Player.data.getState(); + const backpackList: BackpackItemData[] = isAdd ? playerData.backpack.Copy() : []; + for (let i = 0; i < data.length; i++) { + const backpackServerData = data[i]; + const id: number = backpackServerData[1][0]; + const count: number = backpackServerData[1][1]; + for (let j = 0; j < count; j++) { + const backpackClientData: BackpackItemData = { + SN: SN, + ResourceType: backpackServerData[0], + ID: id, + Viewed: false, + }; + backpackList.push(backpackClientData); + SN++; + } + } + if (!isAdd) { + const oldBackpackListStr: string = localStorage.getItem(LocalStorage.Key.Backpack); + if (oldBackpackListStr) { + const oldBackpackList: BackpackItemData[] = JSON.parse(oldBackpackListStr); + for (let i = 0; i < backpackList.length; i++) { + const backpack: BackpackItemData = backpackList[i]; + for (let j = 0; j < oldBackpackList.length; j++) { + const oldBackpack: BackpackItemData = oldBackpackList[j]; + if (backpack.ID === oldBackpack.ID && backpack.ResourceType === oldBackpack.ResourceType) { + backpackList[i].Viewed = oldBackpack.Viewed; + oldBackpackList.splice(j, 1); + break; + } + } + } + } + } + playerData.backpack = backpackList; + localStorage.setItem(LocalStorage.Key.Backpack, JSON.stringify(playerData.backpack)); + Player.data.setState(playerData); + + const totalUnreadCount: number = playerData.backpack.filter((item) => !item.Viewed).length; + if (!MainControl.Instance.IsInGame) { + Cocos.CocosEventListener.DispatchCallback(GameData_Cocos.CELT.SetBackpackUnreadCount, totalUnreadCount); + } +} + +export function txnNew(data: TxnRequest.TxnInfo): void { + const playerData = Player.data.getState(); + const centerList = playerData.txn.centerList.slice(); + centerList.push(data); + playerData.txn.centerList = centerList; + GiftCallBack.DispatchCallback(GiftEventEnum.ReFlash, null); + Cocos.CocosEventListener.DispatchCallback(GameData_Cocos.CELT.SetTxnUnreadCount, playerData.txn.centerList.length); + Player.data.setState(playerData); +} + +export function txnCenter(data: TxnRequest.TxnInfo[]): void { + const playerData = Player.data.getState(); + playerData.txn.centerList = data; + GiftCallBack.DispatchCallback(GiftEventEnum.ReFlash, null); + Cocos.CocosEventListener.DispatchCallback(GameData_Cocos.CELT.SetTxnUnreadCount, playerData.txn.centerList.length); + Player.data.setState(playerData); +} + +export function txnTrade(data: TxnRequest.TradeResponse): void { + const playerData: State = Player.data.getState(); + const centerList: TxnRequest.TxnInfo[] = playerData.txn.centerList; + let type: number = PanelType.RecordPanel; + let status: number = +data.s; + if (status < 20) { + type = PanelType.CenterPanel; + switch (status) { + case 11: + case 12: + case 13: { + for (let i: number = 0; i < centerList.length; i++) { + const centerData: TxnRequest.TxnInfo = centerList[i]; + if (centerData[0] == +data.id && centerData[3][0] == playerData.account.aId) { + type = PanelType.RecordPanel; + break; + } + } + break; + } + default: + break; + } + } + + CoroutineV2.Single(UpdateOneListInfo(data.id, type)).Start(); +} + +export function txnUserAdd(data: TxnRequest.UserAddResponse): void { + const playerData: State = Player.data.getState(); + playerData.txn.receiverList.push(data.u); + Player.data.setState(playerData); +} \ No newline at end of file diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/zSbmoduleUpdate.bat b/src/zSbmoduleUpdate.bat new file mode 100644 index 0000000..4d3e783 --- /dev/null +++ b/src/zSbmoduleUpdate.bat @@ -0,0 +1,38 @@ +@echo off +title Git Working +goto selectAll + +:selectAll +echo --------------------------------------------------- +set n=0 +echo 1.Ĥ@M׳]wһݤlxsw +echo 2.ҦlxswIspQtPULL +echo *`Nxsw]|۩Is.S~|۰ + +set/p n= пܡG + +if "%n%"=="1" ( goto change ) + +if "%n%"=="2" ( goto childupdate ) +goto exit + +:change +echo Ĥ@M׳]wһݤlxsw +echo. +git.exe clone --progress -v "git@git.catan.com.tw:Line_Project_1/Plan-Form_Table.git" FormTable +git.exe clone --progress -v "git@git.catan.com.tw:Frontend/FormTableExt.git" FormTableExt +echo +goto selectAll + +:childupdate +echo ҦlxswIspQtPULL +cd FormTable +TortoiseGitProc -command:pull /closeonend:2 +echo path:FormTable done. +cd .. +cd FormTableExt +TortoiseGitProc -command:pull /closeonend:2 +echo path:FormTableExt done. +cd .. +echo +goto selectAll \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..17eb0f9 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "target": "es2015", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "sourceMap": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": false, + "strictNullChecks": false, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": false, + "noEmit": true, + "jsx": "react-jsx", + "types": [ + "node" + ], + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "src", + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..d94ff00 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": [ + "vite.config.ts" + ] +} \ No newline at end of file diff --git a/vite.config.d.ts b/vite.config.d.ts new file mode 100644 index 0000000..340562a --- /dev/null +++ b/vite.config.d.ts @@ -0,0 +1,2 @@ +declare const _default: import("vite").UserConfig; +export default _default; diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..1674cf2 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import path from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + define: { + "AppVersion": JSON.stringify(process.env.npm_package_version), + }, + resolve: { + alias: [ + { find: "@", replacement: path.resolve(__dirname, "src") }, + { find: "@views", replacement: path.resolve(__dirname, "src/views") }, + { find: "@assets", replacement: path.resolve(__dirname, "src/assets") }, + { find: "@css", replacement: path.resolve(__dirname, "src/assets/css") }, + { find: "@less", replacement: path.resolve(__dirname, "src/assets/less") }, + { find: "@images", replacement: path.resolve(__dirname, "src/assets/images") }, + { find: "@components", replacement: path.resolve(__dirname, "src/components") }, + ], + }, + publicDir: "build-templates", + build: { + outDir: "./build" + }, + base: "./", + envDir: "./viteEnv", +}); \ No newline at end of file