├── .husky ├── .gitignore ├── pre-commit └── commit-msg ├── .prettierignore ├── .babelrc ├── .commitlintrc.json ├── images ├── image001.png ├── image002.png └── image003.png ├── commitlint.config.js ├── .prettierrc.json ├── src ├── components │ ├── LoadingScreen.tsx │ ├── HLTBContextMenuItem.tsx │ ├── GameStats │ │ ├── style.tsx │ │ └── GameStats.tsx │ └── QuickAccessView │ │ └── QuickAccessView.tsx ├── utils.ts ├── hooks │ ├── useStatPreferences.ts │ ├── useStyle.ts │ ├── useLocalization.ts │ ├── GameInfoData.ts │ ├── Cache.ts │ └── useHltb.ts ├── index.tsx ├── localizations │ ├── bg.json │ ├── cs.json │ ├── da.json │ ├── de.json │ ├── el.json │ ├── en.json │ ├── es-419.json │ ├── es.json │ ├── fi.json │ ├── fr.json │ ├── hu.json │ ├── it.json │ ├── ja.json │ ├── ko.json │ ├── nl.json │ ├── no.json │ ├── pl.json │ ├── pt.json │ ├── ro.json │ ├── ru.json │ ├── sv.json │ ├── th.json │ ├── tr.json │ ├── uk.json │ ├── vi.json │ ├── zh-cn.json │ ├── zh-tw.json │ └── pt-br.json ├── languages.ts └── patches │ ├── LibraryApp.tsx │ └── LibraryContextMenu.tsx ├── plugin.json ├── tsconfig.json ├── Readme.md ├── LICENSE ├── release.md ├── rollup.config.js ├── package.json ├── .github └── workflows │ └── build.yml ├── .gitignore └── pnpm-lock.yaml /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | *.yaml -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { "presets": ["@babel/preset-env", "@babel/preset-react"] } 2 | -------------------------------------------------------------------------------- /.commitlintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["@commitlint/config-conventional"] 3 | } 4 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | pnpm lint-staged 5 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | pnpm commitlint --edit $1 -------------------------------------------------------------------------------- /images/image001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulkrelax/hltb-for-deck/HEAD/images/image001.png -------------------------------------------------------------------------------- /images/image002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulkrelax/hltb-for-deck/HEAD/images/image002.png -------------------------------------------------------------------------------- /images/image003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hulkrelax/hltb-for-deck/HEAD/images/image003.png -------------------------------------------------------------------------------- /commitlint.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@commitlint/config-conventional'], 3 | }; 4 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "tabWidth": 4, 4 | "semi": true, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /src/components/LoadingScreen.tsx: -------------------------------------------------------------------------------- 1 | import { SteamSpinner } from 'decky-frontend-lib'; 2 | 3 | export const LoadingScreen = () => { 4 | return ; 5 | }; 6 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | export const normalize = (str: string) => { 2 | return str 3 | .toLowerCase() 4 | .normalize('NFD') 5 | .replace(/[\u0300-\u036f]/g, '') 6 | .replace(/[^a-zA-Z0-9\-\/\s]/g, '') 7 | .trim(); 8 | }; 9 | -------------------------------------------------------------------------------- /plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "HLTB for Deck", 3 | "author": "hulkrelax", 4 | "flags": [], 5 | "publish": { 6 | "tags": ["how long to beat", "backlog", "utility"], 7 | "description": "A plugin to show you game lengths according to How Long To Beat", 8 | "image": "https://raw.githubusercontent.com/hulkrelax/hltb-for-deck/main/images/image001.png" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "./dist/", 4 | "noImplicitAny": true, 5 | "module": "ESNext", 6 | "target": "ES2020", 7 | "jsx": "react-jsx", 8 | "noUnusedLocals": true, 9 | "noUnusedParameters": true, 10 | "esModuleInterop": true, 11 | "noImplicitReturns": true, 12 | "noImplicitThis": true, 13 | "strict": true, 14 | "allowSyntheticDefaultImports": true, 15 | "moduleResolution": "node", 16 | "resolveJsonModule": true 17 | }, 18 | "include": ["src"], 19 | "exclude": ["node_modules"] 20 | } 21 | -------------------------------------------------------------------------------- /src/hooks/useStatPreferences.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { getStatPreferences } from './Cache'; 3 | 4 | export type StatPreferences = { 5 | showMain: boolean; 6 | showMainPlus: boolean; 7 | showComplete: boolean; 8 | showAllStyles: boolean; 9 | }; 10 | export const useStatPreferences = () => { 11 | const [statPrefs, setStatPrefs] = useState({ 12 | showMain: true, 13 | showMainPlus: true, 14 | showComplete: true, 15 | showAllStyles: true, 16 | }); 17 | useEffect(() => { 18 | const getData = async () => { 19 | let prefs = await getStatPreferences(); 20 | if (prefs === null) prefs = statPrefs; 21 | setStatPrefs(prefs); 22 | }; 23 | getData(); 24 | }, []); 25 | 26 | return statPrefs; 27 | }; 28 | -------------------------------------------------------------------------------- /src/components/HLTBContextMenuItem.tsx: -------------------------------------------------------------------------------- 1 | import { MenuItem, Navigation } from 'decky-frontend-lib'; 2 | import { setShowHide } from '../hooks/Cache'; 3 | import useLocalization from '../hooks/useLocalization'; 4 | 5 | type HLTBContextMenuItemProps = { 6 | appId: string; 7 | }; 8 | 9 | export const HLTBContextMenuItem = ({ appId }: HLTBContextMenuItemProps) => { 10 | const lang = useLocalization(); 11 | return ( 12 | { 15 | // little hacky but it works 16 | setShowHide(appId); 17 | Navigation.Navigate('/hltb-for-deck/loading'); 18 | setTimeout(() => Navigation.NavigateBack(), 1000); 19 | }} 20 | > 21 | {lang('showHideStats')} 22 | 23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /src/hooks/useStyle.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react'; 2 | import { getPreference, getStyle } from './Cache'; 3 | 4 | export type HLTBStyle = 5 | | 'default' 6 | | 'clean' 7 | | 'clean-left' 8 | | 'clean-default' 9 | | null; 10 | 11 | export const useStyle = () => { 12 | const [style, setStyle] = useState(null); 13 | useEffect(() => { 14 | const getData = async () => { 15 | setStyle(await getStyle()); 16 | }; 17 | getData(); 18 | }, []); 19 | 20 | return style; 21 | }; 22 | 23 | export const usePreference = () => { 24 | const [pref, setPref] = useState(false); 25 | useEffect(() => { 26 | const getData = async () => { 27 | setPref(await getPreference()); 28 | }; 29 | getData(); 30 | }, []); 31 | 32 | return pref; 33 | }; 34 | -------------------------------------------------------------------------------- /src/hooks/useLocalization.ts: -------------------------------------------------------------------------------- 1 | import { useState } from 'react'; 2 | import languages from '../languages'; 3 | 4 | function getCurrentLanguage(): keyof typeof languages { 5 | const steamLang = window.LocalizationManager.m_rgLocalesToUse[0]; 6 | const lang = steamLang.replace(/-([a-z])/g, (_, letter: string) => 7 | letter.toUpperCase() 8 | ) as keyof typeof languages; 9 | return languages[lang] ? lang : 'en'; 10 | } 11 | 12 | export default function useLocalization() { 13 | const [lang] = useState(getCurrentLanguage()); 14 | return function (key: keyof typeof languages['en']): string { 15 | if (languages[lang]?.[key]?.length) { 16 | return languages[lang]?.[key]; 17 | } else if (languages.en?.[key]?.length) { 18 | return languages.en?.[key]; 19 | } else { 20 | return key; 21 | } 22 | }; 23 | } 24 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # HLTB for Deck 2 | 3 | ## Description 4 | 5 | A plugin to show you game lengths according to How Long To Beat. 6 | 7 | Built with [Decky Loader](https://github.com/SteamDeckHomebrew/decky-loader). 8 | 9 | ## Features 10 | 11 | - On an app page, shows four main stats offered by How Long to Beat 12 | - Clicking View Details will take you to their site for the game 13 | - Results are cached for two hours (cache can be cleared from QAM page for HLTB for Deck) 14 | 15 | ## Screenshots 16 | 17 | ![](images/image001.png) 18 | 19 | ## New Features (as of 1.4.0) 20 | 21 | ### Customize visbility of plugin per game 22 | 23 | ![](images/image002.png) 24 | 25 | On the game's page, click the gear icon and then Show/Hide HLTB Stats to toggle whether or not the plugin is displayed for the current game. This allows you to customize whether you want to see the stats for a game or not. 26 | 27 | ### Customize which stats are displayed 28 | 29 | ![](images/image003.png) 30 | From the Quick Access Menu HLTB For Deck settings page, toggle each stat individually. 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 hulkrelax 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /release.md: -------------------------------------------------------------------------------- 1 | ## HLTB for Deck, How Long to Beat integration for the Steam Deck (v1.4.0) 2 | 3 | ### Localization support 4 | Added the ability to localize the plugin. Currently supported languages are English and Brazilian Portuguese. Reach out to me if you would like this plugin localized in your language. Thanks to vincentvanvega on the SteamDeckHomebrew Discord for the Portuguese translation! 5 | 6 | ### Customize visbility of plugin per game 7 | 8 | ![](images/image002.png) 9 | 10 | On the game's page, click the gear icon and then Show/Hide HLTB Stats to toggle whether or not the plugin is displayed for the current game. This allows you to customize whether you want to see the stats for a game or not. [(Issue #22)](https://github.com/hulkrelax/hltb-for-deck/issues/22). 11 | 12 | ### Customize which stats are displayed 13 | 14 | ![](images/image003.png) 15 | From the Quick Access Menu HLTB For Deck settings page, toggle each stat individually. Thanks to geenaxion from the Decky Loader Discord for the feature request. 16 | 17 | ### Other changes 18 | When starting a game, the stats no longer show up while the game is loading [(Issue #10)](https://github.com/hulkrelax/hltb-for-deck/issues/10). 19 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import commonjs from '@rollup/plugin-commonjs'; 2 | import json from '@rollup/plugin-json'; 3 | import { nodeResolve } from '@rollup/plugin-node-resolve'; 4 | import replace from '@rollup/plugin-replace'; 5 | import typescript from '@rollup/plugin-typescript'; 6 | import { defineConfig } from 'rollup'; 7 | import importAssets from 'rollup-plugin-import-assets'; 8 | import { name } from './plugin.json'; 9 | 10 | export default defineConfig({ 11 | input: './src/index.tsx', 12 | plugins: [ 13 | commonjs(), 14 | nodeResolve(), 15 | typescript(), 16 | json(), 17 | replace({ 18 | preventAssignment: false, 19 | 'process.env.NODE_ENV': JSON.stringify('production'), 20 | }), 21 | importAssets({ 22 | publicPath: `http://127.0.0.1:1337/plugins/${name}/`, 23 | }), 24 | ], 25 | context: 'window', 26 | external: ['react', 'react-dom'], 27 | output: { 28 | file: 'dist/index.js', 29 | globals: { 30 | react: 'SP_REACT', 31 | 'react-dom': 'SP_REACTDOM', 32 | }, 33 | format: 'iife', 34 | exports: 'default', 35 | plugins: [], 36 | }, 37 | }); 38 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import { definePlugin, ServerAPI, staticClasses } from 'decky-frontend-lib'; 2 | import { FaGamepad } from 'react-icons/fa'; 3 | import { patchAppPage } from './patches/LibraryApp'; 4 | import { QuickAccessView } from './components/QuickAccessView/QuickAccessView'; 5 | import contextMenuPatch, { 6 | LibraryContextMenu, 7 | } from './patches/LibraryContextMenu'; 8 | import { LoadingScreen } from './components/LoadingScreen'; 9 | 10 | export default definePlugin((serverAPI: ServerAPI) => { 11 | const libraryContextMenuPatch = contextMenuPatch(LibraryContextMenu); //patchAppPage(serverAPI); 12 | const libraryAppPagePatch = patchAppPage(serverAPI); 13 | serverAPI.routerHook.addRoute('/hltb-for-deck/loading', LoadingScreen); 14 | return { 15 | title:
HLTB for Deck
, 16 | icon: , 17 | content: , 18 | onDismount() { 19 | libraryContextMenuPatch?.unpatch(); 20 | serverAPI.routerHook.removePatch( 21 | '/library/app/:appid', 22 | libraryAppPagePatch 23 | ); 24 | serverAPI.routerHook.removeRoute('/hltb-for-deck/loading'); 25 | }, 26 | }; 27 | }); 28 | -------------------------------------------------------------------------------- /src/localizations/bg.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/da.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/es-419.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/fi.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/fr.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/hu.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/ja.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/ko.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/nl.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/no.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/pt.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/ro.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/ru.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/sv.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/th.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/tr.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/uk.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/vi.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/zh-cn.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /src/localizations/zh-tw.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Default", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" Left", 5 | "cleanDefault": "\"Clean\" Default", 6 | "hltbStyle": "HLTB Style", 7 | "cleanDesc": "The \"Clean\" styles are intended to work with the CSS Loader Theme \"Clean Gameview\"", 8 | "hideViewDetails": "Hide \"View Details\"", 9 | "hideViewDetailsDesc": "Hides \"View Details\" button on HLTB Stats", 10 | "toggleMainStat": "Toggle main stat", 11 | "toggleMainStatDesc": "Shows/Hides just the main stat", 12 | "toggleMainPlusStat": "Toggle main+ stat", 13 | "toggleMainPlusStatDesc": "Shows/Hides just the main+ stat", 14 | "toggleCompletionistStat": "Toggle completionist stat", 15 | "toggleCompletionistStatDesc": "Shows/Hides just the completionist stat", 16 | "toggleAllPlayStylesStat": "Toggle \"all play styles\" stat", 17 | "toggleAllPlayStylesStatDesc": "Shows/Hides just the all play styles stat", 18 | "clearCache": "Clear Cache", 19 | "hours": "hours", 20 | "mainStory": "Main Story", 21 | "mainPlusExtras": "Main + Extras", 22 | "completionist": "Completionist", 23 | "allStyles": "All Styles", 24 | "viewDetails": "View Details", 25 | "showHideStats": "Show/Hide HLTB Stats" 26 | } 27 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hltb-for-deck", 3 | "version": "1.4.1", 4 | "description": "A plugin to show you game lengths according to How Long To Beat", 5 | "scripts": { 6 | "build": "rollup -c", 7 | "prepare": "husky install" 8 | }, 9 | "author": "hulkrelax", 10 | "license": "MIT", 11 | "private": true, 12 | "devDependencies": { 13 | "@commitlint/cli": "^17.8.1", 14 | "@commitlint/config-conventional": "^17.8.1", 15 | "@rollup/plugin-commonjs": "^22.0.2", 16 | "@rollup/plugin-json": "^4.1.0", 17 | "@rollup/plugin-node-resolve": "^13.3.0", 18 | "@rollup/plugin-replace": "^4.0.0", 19 | "@rollup/plugin-typescript": "^8.5.0", 20 | "@types/fast-levenshtein": "^0.0.2", 21 | "@types/react": "^17.0.70", 22 | "@types/react-dom": "^18.2.15", 23 | "husky": "^8.0.3", 24 | "lint-staged": "^13.3.0", 25 | "prettier": "2.7.1", 26 | "rollup": "^2.79.1", 27 | "rollup-plugin-import-assets": "^1.1.1", 28 | "tslib": "^2.6.2", 29 | "typescript": "^4.9.5" 30 | }, 31 | "dependencies": { 32 | "decky-frontend-lib": "^3.23.1", 33 | "fast-levenshtein": "^3.0.0", 34 | "localforage": "^1.10.0", 35 | "react": "^18.2.0", 36 | "react-icons": "^4.12.0" 37 | }, 38 | "lint-staged": { 39 | "*.{ts,tsx}": "prettier --write" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/localizations/pt-br.json: -------------------------------------------------------------------------------- 1 | { 2 | "default": "Padrão", 3 | "clean": "\"Clean\"", 4 | "cleanLeft": "\"Clean\" de Esquerda", 5 | "cleanDefault": "\"Clean\" Padrão", 6 | "hltbStyle": "Estilo HLTB", 7 | "cleanDesc": "Os estilos \"Clean\" são foram feitos para funcionar com o tema \"Clean Gameview\" do CSS Loader", 8 | "hideViewDetails": "Ocultar \"Ver Detalhes\"", 9 | "hideViewDetailsDesc": "Oculta o botão \"Ver Detalhes\" sobre os atributos do HLTB", 10 | "toggleMainStat": "Ajusta o atributo história principal", 11 | "toggleMainStatDesc": "Exibe/Oculta apenas o atributo história principal", 12 | "toggleMainPlusStat": "Ajusta o atributo história principal+", 13 | "toggleMainPlusStatDesc": "Exibe/Oculta apenas o atributo história principal+", 14 | "toggleCompletionistStat": "Ajusta o atributo completista", 15 | "toggleCompletionistStatDesc": "Exibe/Oculta apenas o atributo completista", 16 | "toggleAllPlayStylesStat": "Ajusta o atributo \"todas modalidades de jogo\"", 17 | "toggleAllPlayStylesStatDesc": "Exibe/Oculta apenas o atributo todas modalidades", 18 | "clearCache": "Limpar Cache", 19 | "hours": "horas", 20 | "mainStory": "História Principal", 21 | "mainPlusExtras": "Principal + Extras", 22 | "completionist": "Completista", 23 | "allStyles": "Todas Modalidades", 24 | "viewDetails": "Ver Detalhes", 25 | "showHideStats": "Exibir/Ocultar Atributos HLTB" 26 | } 27 | -------------------------------------------------------------------------------- /src/hooks/GameInfoData.ts: -------------------------------------------------------------------------------- 1 | export type SearchResults = { 2 | category: string; 3 | color: string; 4 | count: number; 5 | data: GameStatsData[]; 6 | pageCurrent: number; 7 | pageSize: number; 8 | pageTotal: number; 9 | title: string; 10 | }; 11 | 12 | export type HLTBStats = { 13 | mainStat: string; 14 | mainPlusStat: string; 15 | completeStat: string; 16 | allStylesStat: string; 17 | lastUpdatedAt: Date; 18 | gameId?: number; 19 | showStats: boolean; 20 | }; 21 | 22 | export type GameStatsData = { 23 | count: number; 24 | game_id: number; 25 | game_name: string; 26 | game_name_date: number; 27 | game_alias: string; 28 | game_type: string; 29 | game_image: string; 30 | comp_lvl_combine: number; 31 | comp_lvl_sp: number; 32 | comp_lvl_co: number; 33 | comp_lvl_mp: number; 34 | comp_lvl_spd: number; 35 | comp_main: number; 36 | comp_plus: number; 37 | comp_100: number; 38 | comp_all: number; 39 | comp_main_count: number; 40 | comp_plus_count: number; 41 | comp_100_count: number; 42 | comp_all_count: number; 43 | invested_co: number; 44 | invested_mp: number; 45 | invested_co_count: number; 46 | invested_mp_count: number; 47 | count_comp: number; 48 | count_speedrun: number; 49 | count_backlog: number; 50 | count_review: number; 51 | review_score: number; 52 | count_playing: number; 53 | count_retired: number; 54 | profile_dev: string; 55 | profile_popular: number; 56 | profile_steam: number; 57 | profile_platform: string; 58 | release_world: number; 59 | }; 60 | -------------------------------------------------------------------------------- /src/languages.ts: -------------------------------------------------------------------------------- 1 | import bg from './localizations/bg.json'; 2 | import cs from './localizations/cs.json'; 3 | import da from './localizations/da.json'; 4 | import de from './localizations/de.json'; 5 | import el from './localizations/el.json'; 6 | import en from './localizations/en.json'; 7 | import es from './localizations/es.json'; 8 | import es419 from './localizations/es-419.json'; 9 | import fi from './localizations/fi.json'; 10 | import fr from './localizations/fr.json'; 11 | import hu from './localizations/hu.json'; 12 | import it from './localizations/it.json'; 13 | import ja from './localizations/ja.json'; 14 | import ko from './localizations/ko.json'; 15 | import nl from './localizations/nl.json'; 16 | import no from './localizations/no.json'; 17 | import pl from './localizations/pl.json'; 18 | import pt from './localizations/pt.json'; 19 | import ptBr from './localizations/pt-br.json'; 20 | import ro from './localizations/ro.json'; 21 | import ru from './localizations/ru.json'; 22 | import sv from './localizations/sv.json'; 23 | import th from './localizations/th.json'; 24 | import tr from './localizations/tr.json'; 25 | import uk from './localizations/uk.json'; 26 | import vi from './localizations/vi.json'; 27 | import zhCn from './localizations/zh-cn.json'; 28 | import zhTw from './localizations/zh-tw.json'; 29 | 30 | const languages = { 31 | bg, 32 | cs, 33 | da, 34 | de, 35 | el, 36 | en, 37 | es, 38 | es419, 39 | fi, 40 | fr, 41 | hu, 42 | it, 43 | ja, 44 | ko, 45 | nl, 46 | no, 47 | pl, 48 | pt, 49 | ptBr, 50 | ro, 51 | ru, 52 | sv, 53 | th, 54 | tr, 55 | uk, 56 | vi, 57 | zhCn, 58 | zhTw, 59 | } as const; 60 | 61 | export default languages; 62 | -------------------------------------------------------------------------------- /src/hooks/Cache.ts: -------------------------------------------------------------------------------- 1 | import localforage from 'localforage'; 2 | import { HLTBStyle } from './useStyle'; 3 | import { HLTBStats } from './GameInfoData'; 4 | import { StatPreferences } from './useStatPreferences'; 5 | 6 | const database = 'hltb-for-deck'; 7 | export const styleKey = 'hltb-style'; 8 | export const hideDetailsKey = 'hltb-hide-details'; 9 | export const statPreferencesKey = 'hltb-stat-preferences'; 10 | 11 | localforage.config({ 12 | name: database, 13 | }); 14 | 15 | export async function updateCache(key: string, value: T) { 16 | await localforage.setItem(key, value); 17 | } 18 | 19 | export async function getCache(key: string): Promise { 20 | return await localforage.getItem(key); 21 | } 22 | 23 | export async function setShowHide(appId: string) { 24 | const stats = await localforage.getItem(appId); 25 | if (stats) { 26 | stats.showStats = !stats.showStats; 27 | await localforage.setItem(appId, stats); 28 | } 29 | } 30 | 31 | export async function getStyle(): Promise { 32 | const hltbStyle = await localforage.getItem(styleKey); 33 | return hltbStyle === null ? 'default' : hltbStyle; 34 | } 35 | 36 | export async function getPreference(): Promise { 37 | const hideViewDetails = await localforage.getItem(hideDetailsKey); 38 | return hideViewDetails === null ? false : hideViewDetails; 39 | } 40 | 41 | export async function getStatPreferences(): Promise { 42 | const preferences = await localforage.getItem( 43 | statPreferencesKey 44 | ); 45 | return preferences; 46 | } 47 | 48 | export const clearCache = () => { 49 | const style = getStyle(); 50 | localforage.clear(); 51 | updateCache(styleKey, style); 52 | }; 53 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build and Release HLTB for Deck 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | pull_request: 8 | branches: ['main'] 9 | 10 | # Allows you to run this workflow manually from the Actions tab 11 | workflow_dispatch: 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v3 18 | 19 | - name: Setup Node 20 | uses: actions/setup-node@v1 21 | with: 22 | node-version: '18.3' 23 | 24 | - name: Install pnpm 25 | run: npm install -g pnpm 26 | 27 | - name: Install Dependencies 28 | run: pnpm install 29 | 30 | - name: build 31 | run: pnpm run build 32 | 33 | - name: copy files into build 34 | run: | 35 | cp plugin.json ./dist/ 36 | cp package.json ./dist/ 37 | mkdir ./dist/dist 38 | mv ./dist/index.js ./dist/dist/ 39 | 40 | - name: Upload package 41 | uses: actions/upload-artifact@v2 42 | with: 43 | name: hltb-for-deck 44 | path: | 45 | ./dist/* 46 | release: 47 | needs: build 48 | if: startsWith(github.ref, 'refs/tags/v') 49 | runs-on: ubuntu-latest 50 | steps: 51 | - uses: actions/checkout@v2 52 | 53 | - uses: actions/download-artifact@v3 54 | with: 55 | name: hltb-for-deck 56 | path: hltb-for-deck 57 | 58 | - name: zip/tar release 59 | run: | 60 | zip -r hltb-for-deck.zip hltb-for-deck/* 61 | tar -czvf hltb-for-deck.tar.gz hltb-for-deck 62 | 63 | - name: Create a release 64 | uses: ncipollo/release-action@v1 65 | with: 66 | artifacts: 'hltb-for-deck.zip,hltb-for-deck.tar.gz' 67 | bodyFile: 'release.md' 68 | token: ${{ secrets.GITHUB_TOKEN }} 69 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /src/components/GameStats/style.tsx: -------------------------------------------------------------------------------- 1 | export default ( 2 | 106 | ); 107 | -------------------------------------------------------------------------------- /src/patches/LibraryApp.tsx: -------------------------------------------------------------------------------- 1 | import { ServerAPI, afterPatch, wrapReactType } from 'decky-frontend-lib'; 2 | import { ReactElement } from 'react'; 3 | import { GameStats } from '../components/GameStats/GameStats'; 4 | import { normalize } from '../utils'; 5 | 6 | // I hate this method 7 | export const patchAppPage = (serverApi: ServerAPI) => { 8 | return serverApi.routerHook.addPatch( 9 | '/library/app/:appid', 10 | (props: { path: string; children: ReactElement }) => { 11 | afterPatch( 12 | props.children.props, 13 | 'renderFunc', 14 | (_: Record[], ret1: ReactElement) => { 15 | const game: string = normalize( 16 | ret1.props.children.props.overview.display_name 17 | ); 18 | const appId: number = 19 | ret1.props.children.props.overview.appid; 20 | wrapReactType(ret1.props.children); 21 | afterPatch( 22 | ret1.props.children.type, 23 | 'type', 24 | (_1: Record[], ret2: ReactElement) => { 25 | const componentToSplice = 26 | ret2.props.children?.[1]?.props.children.props 27 | .children; 28 | // This always seems to be -1 29 | const hltbComponentIndex = 30 | componentToSplice?.findIndex( 31 | (child: ReactElement) => { 32 | return ( 33 | child?.props?.id === 'hltb-for-deck' 34 | ); 35 | } 36 | ); 37 | 38 | // We want to splice into the component before this point 39 | const spliceIndex = componentToSplice?.findIndex( 40 | (child: ReactElement) => { 41 | return ( 42 | child?.props?.childFocusDisabled !== 43 | undefined && 44 | child?.props?.navRef !== undefined && 45 | child?.props?.children?.props 46 | ?.details !== undefined && 47 | child?.props?.children?.props 48 | ?.overview !== undefined && 49 | child?.props?.children?.props 50 | ?.bFastRender !== undefined 51 | ); 52 | } 53 | ); 54 | 55 | const component = ( 56 | 62 | ); 63 | 64 | if (hltbComponentIndex < 0) { 65 | if (spliceIndex > -1) { 66 | componentToSplice?.splice( 67 | spliceIndex, 68 | 0, 69 | component 70 | ); 71 | } else { 72 | console.error( 73 | 'hltb-for-deck could not find where to splice!' 74 | ); 75 | } 76 | } else { 77 | componentToSplice?.splice( 78 | hltbComponentIndex, 79 | 1, 80 | component 81 | ); 82 | } 83 | return ret2; 84 | } 85 | ); 86 | return ret1; 87 | } 88 | ); 89 | return props; 90 | } 91 | ); 92 | }; 93 | -------------------------------------------------------------------------------- /src/patches/LibraryContextMenu.tsx: -------------------------------------------------------------------------------- 1 | // Credit to https://github.com/SteamGridDB/decky-steamgriddb/ for most of this 2 | import { 3 | afterPatch, 4 | fakeRenderComponent, 5 | findInReactTree, 6 | findModuleChild, 7 | Patch, 8 | } from 'decky-frontend-lib'; 9 | 10 | import { HLTBContextMenuItem } from '../components/HLTBContextMenuItem'; 11 | 12 | const addStatsSettingsMenuItem = (children: any[], appId: number) => { 13 | children.find((x: any) => x?.key === 'properties'); 14 | // Find the index of the menu item for the game's properties 15 | const propertiesMenuItem = children.findIndex((item) => 16 | findInReactTree( 17 | item, 18 | (x) => 19 | x?.onSelected && 20 | x.onSelected.toString().includes('AppProperties') 21 | ) 22 | ); 23 | // Add the HLTB Stats Setting Menu Item before the Properties Menu Item 24 | children.splice( 25 | propertiesMenuItem, 26 | 0, 27 | 28 | ); 29 | }; 30 | 31 | const contextMenuPatch = (LibraryContextMenu: any) => { 32 | // Variable for all patches applied to LibraryContextMenu 33 | const patches: { 34 | patchOne?: Patch; 35 | patchTwo?: Patch; 36 | unpatch: () => void; 37 | } = { 38 | unpatch: () => null, 39 | }; 40 | 41 | patches.patchOne = afterPatch( 42 | LibraryContextMenu.prototype, 43 | 'render', 44 | (_: Record[], component: any) => { 45 | // Get the current app's ID 46 | const appid: number = component._owner.pendingProps.overview.appid; 47 | if (!patches.patchTwo) { 48 | patches.patchTwo = afterPatch( 49 | component.type.prototype, 50 | 'shouldComponentUpdate', 51 | ([nextProps]: any, shouldUpdate: boolean) => { 52 | const hltbIndex = nextProps.children.findIndex( 53 | (x: any) => 54 | x?.key === 'hltb-for-deck-stats-settings' 55 | ); 56 | hltbIndex != -1 && 57 | nextProps.children.splice(hltbIndex, 1); 58 | 59 | if (shouldUpdate === true) { 60 | let updatedAppid = appid; 61 | // find the first menu component where there is a different app id than the current one 62 | const parentOverview = nextProps.children.find( 63 | (x: any) => 64 | x?._owner?.pendingProps?.overview?.appid && 65 | x._owner.pendingProps.overview.appid !== 66 | appid 67 | ); 68 | // if found then use that appid 69 | if (parentOverview) { 70 | updatedAppid = 71 | parentOverview._owner.pendingProps.overview 72 | .appid; 73 | } 74 | addStatsSettingsMenuItem( 75 | nextProps.children, 76 | updatedAppid 77 | ); 78 | } 79 | 80 | return shouldUpdate; 81 | } 82 | ); 83 | } else { 84 | // Add the Menu Item if we've already patched 85 | addStatsSettingsMenuItem(component.props.children, appid); 86 | } 87 | 88 | return component; 89 | } 90 | ); 91 | patches.unpatch = () => { 92 | patches.patchOne?.unpatch(); 93 | patches.patchTwo?.unpatch(); 94 | }; 95 | return patches; 96 | }; 97 | 98 | export const LibraryContextMenu = fakeRenderComponent( 99 | findModuleChild((m) => { 100 | if (typeof m !== 'object') return; 101 | for (const prop in m) { 102 | if ( 103 | m[prop]?.toString() && 104 | m[prop].toString().includes('().LibraryContextMenu') 105 | ) { 106 | return Object.values(m).find( 107 | (sibling) => 108 | sibling?.toString().includes('createElement') && 109 | sibling?.toString().includes('navigator:') 110 | ); 111 | } 112 | } 113 | return; 114 | }) 115 | ).type; 116 | 117 | export default contextMenuPatch; 118 | -------------------------------------------------------------------------------- /src/components/QuickAccessView/QuickAccessView.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | PanelSection, 3 | PanelSectionRow, 4 | ButtonItem, 5 | Router, 6 | DropdownItem, 7 | ToggleField, 8 | } from 'decky-frontend-lib'; 9 | import { 10 | clearCache, 11 | hideDetailsKey, 12 | statPreferencesKey, 13 | styleKey, 14 | updateCache, 15 | } from '../../hooks/Cache'; 16 | import { usePreference, useStyle } from '../../hooks/useStyle'; 17 | import { useStatPreferences } from '../../hooks/useStatPreferences'; 18 | import useLocalization from '../../hooks/useLocalization'; 19 | 20 | export const QuickAccessView = () => { 21 | const handleClearCache = () => { 22 | clearCache(); 23 | Router.CloseSideMenus(); 24 | }; 25 | const style = useStyle(); 26 | // probably overkill for something so simple but it's fine :) 27 | const hideDetails = usePreference(); 28 | 29 | const preferences = useStatPreferences(); 30 | 31 | const lang = useLocalization(); 32 | 33 | const styleOptions = [ 34 | { data: 0, label: lang('default'), value: 'default' }, 35 | { data: 1, label: lang('clean'), value: 'clean' }, 36 | { data: 2, label: lang('cleanLeft'), value: 'clean-left' }, 37 | { data: 3, label: lang('cleanDefault'), value: 'clean-default' }, 38 | ] as const; 39 | 40 | const toggleShowMain = () => { 41 | preferences.showMain = !preferences.showMain; 42 | updateCache(statPreferencesKey, preferences); 43 | }; 44 | 45 | const toggleShowMainPlus = () => { 46 | preferences.showMainPlus = !preferences.showMainPlus; 47 | updateCache(statPreferencesKey, preferences); 48 | }; 49 | 50 | const toggleShowComplete = () => { 51 | preferences.showComplete = !preferences.showComplete; 52 | updateCache(statPreferencesKey, preferences); 53 | }; 54 | 55 | const toggleShowAllStyles = () => { 56 | preferences.showAllStyles = !preferences.showAllStyles; 57 | updateCache(statPreferencesKey, preferences); 58 | }; 59 | return ( 60 | 61 | 62 | ({ 67 | data: o.data, 68 | label: o.label, 69 | }))} 70 | selectedOption={ 71 | styleOptions.find((o) => o.value === style)?.data || 0 72 | } 73 | onChange={(newVal: { data: number; label: string }) => { 74 | const newStyle = 75 | styleOptions.find((o) => o.data === newVal.data) 76 | ?.value || 'default'; 77 | updateCache(styleKey, newStyle); 78 | }} 79 | /> 80 | 81 | 82 | updateCache(hideDetailsKey, checked)} 87 | /> 88 | 89 | 90 | toggleShowMain()} 95 | /> 96 | 97 | 98 | toggleShowMainPlus()} 103 | /> 104 | 105 | 106 | toggleShowComplete()} 111 | /> 112 | 113 | 114 | toggleShowAllStyles()} 119 | /> 120 | 121 | 122 | 123 | {lang('clearCache')} 124 | 125 | 126 | 127 | ); 128 | }; 129 | -------------------------------------------------------------------------------- /src/components/GameStats/GameStats.tsx: -------------------------------------------------------------------------------- 1 | import { DialogButtonPrimary, Navigation, ServerAPI } from 'decky-frontend-lib'; 2 | import useHltb from '../../hooks/useHltb'; 3 | import { usePreference, useStyle } from '../../hooks/useStyle'; 4 | import style from './style'; 5 | import { useEffect, useState } from 'react'; 6 | import { useStatPreferences } from '../../hooks/useStatPreferences'; 7 | import useLocalization from '../../hooks/useLocalization'; 8 | 9 | type GameStatsProps = { 10 | serverApi: ServerAPI; 11 | game: string; 12 | appId: number; 13 | id: string; 14 | }; 15 | 16 | export const GameStats = ({ serverApi, game, appId, id }: GameStatsProps) => { 17 | const [gameLaunching, setGameLaunching] = useState(false); 18 | const lang = useLocalization(); 19 | const handleGameActionStart = ( 20 | _actionType: number, 21 | strAppId: string, 22 | actionName: string 23 | ) => { 24 | const gameActionAppId = parseInt(strAppId); 25 | if ( 26 | actionName == 'LaunchApp' && 27 | appId == gameActionAppId && 28 | !gameLaunching 29 | ) { 30 | setGameLaunching(true); 31 | } else { 32 | setGameLaunching(false); 33 | } 34 | }; 35 | 36 | const onGameActionStart = SteamClient.Apps.RegisterForGameActionStart( 37 | handleGameActionStart 38 | ); 39 | const onGameActionEnd = SteamClient.Apps.RegisterForGameActionEnd( 40 | handleGameActionStart 41 | ); 42 | useEffect(() => { 43 | return function cleanup() { 44 | onGameActionStart.unregister(); 45 | onGameActionEnd.unregister(); 46 | }; 47 | }, []); 48 | const { 49 | mainStat, 50 | mainPlusStat, 51 | completeStat, 52 | allStylesStat, 53 | gameId, 54 | showStats, 55 | } = useHltb(appId, game, serverApi); 56 | const { showMain, showMainPlus, showComplete, showAllStyles } = 57 | useStatPreferences(); 58 | const hltbStyle = useStyle(); 59 | const hideDetails = usePreference(); 60 | const baseClass = hltbStyle === null ? 'hltb-info-absolute' : 'hltb-info'; 61 | // Hide if there are no stats, show stats is false, all stats are hidden, or the game is launching 62 | const hide = 63 | (mainStat === mainPlusStat && 64 | mainPlusStat === completeStat && 65 | completeStat === allStylesStat && 66 | allStylesStat === '--') || 67 | !showStats || 68 | gameLaunching; 69 | let hltbInfoStyle = ''; 70 | switch (hltbStyle) { 71 | case 'clean': 72 | case 'clean-left': 73 | hltbInfoStyle = 'hltb-info-clean'; 74 | break; 75 | case 'clean-default': 76 | hltbInfoStyle = 'hltb-info-clean-default'; 77 | break; 78 | } 79 | const hltbInfoPosition = 80 | hltbStyle === 'clean-left' ? 'hltb-info-clean-left' : ''; 81 | const btnStyle = 82 | hltbStyle === 'default' || hltbStyle === 'clean-default' 83 | ? '' 84 | : 'hltb-details-btn-clean'; 85 | 86 | return ( 87 |
88 | {style} 89 |
92 |
    98 |
  • 99 |

    100 | {mainStat} {lang('hours')} 101 |

    102 |

    {lang('mainStory')}

    103 |
  • 104 |
  • 109 |

    110 | {mainPlusStat} {lang('hours')} 111 |

    112 |

    {lang('mainPlusExtras')}

    113 |
  • 114 |
  • 119 |

    120 | {completeStat} {lang('hours')} 121 |

    122 |

    {lang('completionist')}

    123 |
  • 124 |
  • 129 |

    130 | {allStylesStat} {lang('hours')} 131 |

    132 |

    {lang('allStyles')}

    133 |
  • 134 | {gameId && !hideDetails && ( 135 |
  • 136 | 139 | Navigation.NavigateToExternalWeb( 140 | `https://howlongtobeat.com/game/${gameId}` 141 | ) 142 | } 143 | > 144 | {lang('viewDetails')} 145 | 146 |
  • 147 | )} 148 |
149 |
150 |
151 | ); 152 | }; 153 | -------------------------------------------------------------------------------- /src/hooks/useHltb.ts: -------------------------------------------------------------------------------- 1 | import { ServerAPI, ServerResponse } from 'decky-frontend-lib'; 2 | import { get } from 'fast-levenshtein'; 3 | import { useState, useEffect } from 'react'; 4 | import { normalize } from '../utils'; 5 | import { GameStatsData, HLTBStats, SearchResults } from './GameInfoData'; 6 | import { getCache, updateCache } from './Cache'; 7 | 8 | type HLTBResult = { body: string; status: number }; 9 | 10 | // update cache after 12 hours 11 | const needCacheUpdate = (lastUpdatedAt: Date) => { 12 | const now = new Date(); 13 | const durationMs = Math.abs(lastUpdatedAt.getTime() - now.getTime()); 14 | 15 | const hoursBetweenDates = durationMs / (60 * 60 * 1000); 16 | return hoursBetweenDates > 12; 17 | }; 18 | 19 | // Hook to get data from HLTB 20 | const useHltb = (appId: number, game: string, serverApi: ServerAPI) => { 21 | const [stats, setStats] = useState({ 22 | mainStat: '--', 23 | mainPlusStat: '--', 24 | completeStat: '--', 25 | allStylesStat: '--', 26 | gameId: undefined, 27 | lastUpdatedAt: new Date(), 28 | showStats: true, 29 | }); 30 | const data = { 31 | searchType: 'games', 32 | searchTerms: game.split(' '), 33 | searchPage: 1, 34 | size: 50, 35 | searchOptions: { 36 | games: { 37 | userId: 0, 38 | platform: '', 39 | sortCategory: 'name', 40 | rangeCategory: 'main', 41 | rangeTime: { min: 0, max: 0 }, 42 | gameplay: { perspective: '', flow: '', genre: '' }, 43 | modifier: 'hide_dlc', 44 | }, 45 | users: {}, 46 | filter: '', 47 | sort: 0, 48 | randomizer: 0, 49 | }, 50 | }; 51 | useEffect(() => { 52 | const getData = async () => { 53 | const cache = await getCache(`${appId}`); 54 | if (cache && !needCacheUpdate(cache.lastUpdatedAt)) { 55 | setStats(cache); 56 | } else { 57 | console.log(`get HLTB data for ${appId} and ${game}`); 58 | const res: ServerResponse = 59 | await serverApi.fetchNoCors( 60 | 'https://howlongtobeat.com/api/search', 61 | { 62 | method: 'POST', 63 | headers: { 64 | 'Content-Type': 'application/json', 65 | Origin: 'https://howlongtobeat.com', 66 | Referer: 'https://howlongtobeat.com/', 67 | Authority: 'howlongtobeat.com', 68 | 'User-Agent': 69 | 'Chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36', 70 | }, 71 | //@ts-ignore 72 | json: data, 73 | } 74 | ); 75 | const result = res.result as HLTBResult; 76 | if (result.status === 200) { 77 | const results: SearchResults = JSON.parse(result.body); 78 | results.data.forEach((game) => { 79 | game.game_name = normalize(game.game_name); 80 | }); 81 | // Search by appId first 82 | let gameStats: GameStatsData | undefined = 83 | results.data.find( 84 | (elem) => elem.profile_steam === appId 85 | ); 86 | // Search by game name if not found by appId 87 | if (gameStats === undefined) 88 | gameStats = results.data.find( 89 | (elem) => elem.game_name === game 90 | ); 91 | // Couldn't find anything, find a close match 92 | if (gameStats === undefined && results.data.length > 0) { 93 | const possibleChoices = results.data 94 | .map((gameStat) => { 95 | return { 96 | minEditDistance: get( 97 | game, 98 | gameStat.game_name, 99 | { useCollator: true } 100 | ), 101 | gameStat, 102 | }; 103 | }) 104 | .sort((a, b) => { 105 | if (a.minEditDistance === b.minEditDistance) { 106 | return ( 107 | b.gameStat.comp_all_count - 108 | a.gameStat.comp_all_count 109 | ); 110 | } else { 111 | return ( 112 | a.minEditDistance - b.minEditDistance 113 | ); 114 | } 115 | }); 116 | gameStats = possibleChoices[0].gameStat; 117 | } 118 | let newStats = stats; 119 | if (gameStats) { 120 | newStats = { 121 | mainStat: 122 | gameStats.comp_main > 0 123 | ? (gameStats.comp_main / 60 / 60).toFixed(1) 124 | : '--', 125 | mainPlusStat: 126 | gameStats.comp_plus > 0 127 | ? (gameStats.comp_plus / 60 / 60).toFixed(1) 128 | : '--', 129 | completeStat: 130 | gameStats.comp_100 > 0 131 | ? (gameStats.comp_100 / 60 / 60).toFixed(1) 132 | : '--', 133 | allStylesStat: 134 | gameStats.comp_all > 0 135 | ? (gameStats.comp_all / 60 / 60).toFixed(1) 136 | : '--', 137 | gameId: gameStats.game_id, 138 | lastUpdatedAt: new Date(), 139 | showStats: cache?.showStats ?? true, 140 | }; 141 | } 142 | setStats(newStats); 143 | updateCache(`${appId}`, newStats); 144 | } else { 145 | console.error(result); 146 | } 147 | } 148 | }; 149 | if (appId) { 150 | getData(); 151 | } 152 | }, [appId]); 153 | 154 | return { 155 | ...stats, 156 | }; 157 | }; 158 | 159 | export default useHltb; 160 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | dependencies: 4 | decky-frontend-lib: 5 | specifier: ^3.23.1 6 | version: 3.23.1 7 | fast-levenshtein: 8 | specifier: ^3.0.0 9 | version: 3.0.0 10 | localforage: 11 | specifier: ^1.10.0 12 | version: 1.10.0 13 | react: 14 | specifier: ^18.2.0 15 | version: 18.2.0 16 | react-icons: 17 | specifier: ^4.12.0 18 | version: 4.12.0(react@18.2.0) 19 | 20 | devDependencies: 21 | '@commitlint/cli': 22 | specifier: ^17.8.1 23 | version: 17.8.1 24 | '@commitlint/config-conventional': 25 | specifier: ^17.8.1 26 | version: 17.8.1 27 | '@rollup/plugin-commonjs': 28 | specifier: ^22.0.2 29 | version: 22.0.2(rollup@2.79.1) 30 | '@rollup/plugin-json': 31 | specifier: ^4.1.0 32 | version: 4.1.0(rollup@2.79.1) 33 | '@rollup/plugin-node-resolve': 34 | specifier: ^13.3.0 35 | version: 13.3.0(rollup@2.79.1) 36 | '@rollup/plugin-replace': 37 | specifier: ^4.0.0 38 | version: 4.0.0(rollup@2.79.1) 39 | '@rollup/plugin-typescript': 40 | specifier: ^8.5.0 41 | version: 8.5.0(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5) 42 | '@types/fast-levenshtein': 43 | specifier: ^0.0.2 44 | version: 0.0.2 45 | '@types/react': 46 | specifier: ^17.0.70 47 | version: 17.0.70 48 | '@types/react-dom': 49 | specifier: ^18.2.15 50 | version: 18.2.15 51 | husky: 52 | specifier: ^8.0.3 53 | version: 8.0.3 54 | lint-staged: 55 | specifier: ^13.3.0 56 | version: 13.3.0 57 | prettier: 58 | specifier: 2.7.1 59 | version: 2.7.1 60 | rollup: 61 | specifier: ^2.79.1 62 | version: 2.79.1 63 | rollup-plugin-import-assets: 64 | specifier: ^1.1.1 65 | version: 1.1.1(rollup@2.79.1) 66 | tslib: 67 | specifier: ^2.6.2 68 | version: 2.6.2 69 | typescript: 70 | specifier: ^4.9.5 71 | version: 4.9.5 72 | 73 | packages: 74 | 75 | /@babel/code-frame@7.23.4: 76 | resolution: {integrity: sha512-r1IONyb6Ia+jYR2vvIDhdWdlTGhqbBoFqLTQidzZ4kepUFH15ejXvFHxCVbtl7BOXIudsIubf4E81xeA3h3IXA==} 77 | engines: {node: '>=6.9.0'} 78 | dependencies: 79 | '@babel/highlight': 7.23.4 80 | chalk: 2.4.2 81 | dev: true 82 | 83 | /@babel/helper-validator-identifier@7.22.20: 84 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 85 | engines: {node: '>=6.9.0'} 86 | dev: true 87 | 88 | /@babel/highlight@7.23.4: 89 | resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} 90 | engines: {node: '>=6.9.0'} 91 | dependencies: 92 | '@babel/helper-validator-identifier': 7.22.20 93 | chalk: 2.4.2 94 | js-tokens: 4.0.0 95 | dev: true 96 | 97 | /@commitlint/cli@17.8.1: 98 | resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} 99 | engines: {node: '>=v14'} 100 | hasBin: true 101 | dependencies: 102 | '@commitlint/format': 17.8.1 103 | '@commitlint/lint': 17.8.1 104 | '@commitlint/load': 17.8.1 105 | '@commitlint/read': 17.8.1 106 | '@commitlint/types': 17.8.1 107 | execa: 5.1.1 108 | lodash.isfunction: 3.0.9 109 | resolve-from: 5.0.0 110 | resolve-global: 1.0.0 111 | yargs: 17.7.2 112 | transitivePeerDependencies: 113 | - '@swc/core' 114 | - '@swc/wasm' 115 | dev: true 116 | 117 | /@commitlint/config-conventional@17.8.1: 118 | resolution: {integrity: sha512-NxCOHx1kgneig3VLauWJcDWS40DVjg7nKOpBEEK9E5fjJpQqLCilcnKkIIjdBH98kEO1q3NpE5NSrZ2kl/QGJg==} 119 | engines: {node: '>=v14'} 120 | dependencies: 121 | conventional-changelog-conventionalcommits: 6.1.0 122 | dev: true 123 | 124 | /@commitlint/config-validator@17.8.1: 125 | resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} 126 | engines: {node: '>=v14'} 127 | dependencies: 128 | '@commitlint/types': 17.8.1 129 | ajv: 8.12.0 130 | dev: true 131 | 132 | /@commitlint/ensure@17.8.1: 133 | resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==} 134 | engines: {node: '>=v14'} 135 | dependencies: 136 | '@commitlint/types': 17.8.1 137 | lodash.camelcase: 4.3.0 138 | lodash.kebabcase: 4.1.1 139 | lodash.snakecase: 4.1.1 140 | lodash.startcase: 4.4.0 141 | lodash.upperfirst: 4.3.1 142 | dev: true 143 | 144 | /@commitlint/execute-rule@17.8.1: 145 | resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} 146 | engines: {node: '>=v14'} 147 | dev: true 148 | 149 | /@commitlint/format@17.8.1: 150 | resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==} 151 | engines: {node: '>=v14'} 152 | dependencies: 153 | '@commitlint/types': 17.8.1 154 | chalk: 4.1.2 155 | dev: true 156 | 157 | /@commitlint/is-ignored@17.8.1: 158 | resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==} 159 | engines: {node: '>=v14'} 160 | dependencies: 161 | '@commitlint/types': 17.8.1 162 | semver: 7.5.4 163 | dev: true 164 | 165 | /@commitlint/lint@17.8.1: 166 | resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==} 167 | engines: {node: '>=v14'} 168 | dependencies: 169 | '@commitlint/is-ignored': 17.8.1 170 | '@commitlint/parse': 17.8.1 171 | '@commitlint/rules': 17.8.1 172 | '@commitlint/types': 17.8.1 173 | dev: true 174 | 175 | /@commitlint/load@17.8.1: 176 | resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} 177 | engines: {node: '>=v14'} 178 | dependencies: 179 | '@commitlint/config-validator': 17.8.1 180 | '@commitlint/execute-rule': 17.8.1 181 | '@commitlint/resolve-extends': 17.8.1 182 | '@commitlint/types': 17.8.1 183 | '@types/node': 20.5.1 184 | chalk: 4.1.2 185 | cosmiconfig: 8.3.6(typescript@4.9.5) 186 | cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@4.9.5) 187 | lodash.isplainobject: 4.0.6 188 | lodash.merge: 4.6.2 189 | lodash.uniq: 4.5.0 190 | resolve-from: 5.0.0 191 | ts-node: 10.9.1(@types/node@20.5.1)(typescript@4.9.5) 192 | typescript: 4.9.5 193 | transitivePeerDependencies: 194 | - '@swc/core' 195 | - '@swc/wasm' 196 | dev: true 197 | 198 | /@commitlint/message@17.8.1: 199 | resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==} 200 | engines: {node: '>=v14'} 201 | dev: true 202 | 203 | /@commitlint/parse@17.8.1: 204 | resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==} 205 | engines: {node: '>=v14'} 206 | dependencies: 207 | '@commitlint/types': 17.8.1 208 | conventional-changelog-angular: 6.0.0 209 | conventional-commits-parser: 4.0.0 210 | dev: true 211 | 212 | /@commitlint/read@17.8.1: 213 | resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==} 214 | engines: {node: '>=v14'} 215 | dependencies: 216 | '@commitlint/top-level': 17.8.1 217 | '@commitlint/types': 17.8.1 218 | fs-extra: 11.1.1 219 | git-raw-commits: 2.0.11 220 | minimist: 1.2.8 221 | dev: true 222 | 223 | /@commitlint/resolve-extends@17.8.1: 224 | resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} 225 | engines: {node: '>=v14'} 226 | dependencies: 227 | '@commitlint/config-validator': 17.8.1 228 | '@commitlint/types': 17.8.1 229 | import-fresh: 3.3.0 230 | lodash.mergewith: 4.6.2 231 | resolve-from: 5.0.0 232 | resolve-global: 1.0.0 233 | dev: true 234 | 235 | /@commitlint/rules@17.8.1: 236 | resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==} 237 | engines: {node: '>=v14'} 238 | dependencies: 239 | '@commitlint/ensure': 17.8.1 240 | '@commitlint/message': 17.8.1 241 | '@commitlint/to-lines': 17.8.1 242 | '@commitlint/types': 17.8.1 243 | execa: 5.1.1 244 | dev: true 245 | 246 | /@commitlint/to-lines@17.8.1: 247 | resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==} 248 | engines: {node: '>=v14'} 249 | dev: true 250 | 251 | /@commitlint/top-level@17.8.1: 252 | resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==} 253 | engines: {node: '>=v14'} 254 | dependencies: 255 | find-up: 5.0.0 256 | dev: true 257 | 258 | /@commitlint/types@17.8.1: 259 | resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} 260 | engines: {node: '>=v14'} 261 | dependencies: 262 | chalk: 4.1.2 263 | dev: true 264 | 265 | /@cspotcode/source-map-support@0.8.1: 266 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 267 | engines: {node: '>=12'} 268 | dependencies: 269 | '@jridgewell/trace-mapping': 0.3.9 270 | dev: true 271 | 272 | /@jridgewell/resolve-uri@3.1.1: 273 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 274 | engines: {node: '>=6.0.0'} 275 | dev: true 276 | 277 | /@jridgewell/sourcemap-codec@1.4.15: 278 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 279 | dev: true 280 | 281 | /@jridgewell/trace-mapping@0.3.9: 282 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 283 | dependencies: 284 | '@jridgewell/resolve-uri': 3.1.1 285 | '@jridgewell/sourcemap-codec': 1.4.15 286 | dev: true 287 | 288 | /@rollup/plugin-commonjs@22.0.2(rollup@2.79.1): 289 | resolution: {integrity: sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==} 290 | engines: {node: '>= 12.0.0'} 291 | peerDependencies: 292 | rollup: ^2.68.0 293 | dependencies: 294 | '@rollup/pluginutils': 3.1.0(rollup@2.79.1) 295 | commondir: 1.0.1 296 | estree-walker: 2.0.2 297 | glob: 7.2.3 298 | is-reference: 1.2.1 299 | magic-string: 0.25.9 300 | resolve: 1.22.8 301 | rollup: 2.79.1 302 | dev: true 303 | 304 | /@rollup/plugin-json@4.1.0(rollup@2.79.1): 305 | resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} 306 | peerDependencies: 307 | rollup: ^1.20.0 || ^2.0.0 308 | dependencies: 309 | '@rollup/pluginutils': 3.1.0(rollup@2.79.1) 310 | rollup: 2.79.1 311 | dev: true 312 | 313 | /@rollup/plugin-node-resolve@13.3.0(rollup@2.79.1): 314 | resolution: {integrity: sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==} 315 | engines: {node: '>= 10.0.0'} 316 | peerDependencies: 317 | rollup: ^2.42.0 318 | dependencies: 319 | '@rollup/pluginutils': 3.1.0(rollup@2.79.1) 320 | '@types/resolve': 1.17.1 321 | deepmerge: 4.3.1 322 | is-builtin-module: 3.2.1 323 | is-module: 1.0.0 324 | resolve: 1.22.8 325 | rollup: 2.79.1 326 | dev: true 327 | 328 | /@rollup/plugin-replace@4.0.0(rollup@2.79.1): 329 | resolution: {integrity: sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g==} 330 | peerDependencies: 331 | rollup: ^1.20.0 || ^2.0.0 332 | dependencies: 333 | '@rollup/pluginutils': 3.1.0(rollup@2.79.1) 334 | magic-string: 0.25.9 335 | rollup: 2.79.1 336 | dev: true 337 | 338 | /@rollup/plugin-typescript@8.5.0(rollup@2.79.1)(tslib@2.6.2)(typescript@4.9.5): 339 | resolution: {integrity: sha512-wMv1/scv0m/rXx21wD2IsBbJFba8wGF3ErJIr6IKRfRj49S85Lszbxb4DCo8iILpluTjk2GAAu9CoZt4G3ppgQ==} 340 | engines: {node: '>=8.0.0'} 341 | peerDependencies: 342 | rollup: ^2.14.0 343 | tslib: '*' 344 | typescript: '>=3.7.0' 345 | peerDependenciesMeta: 346 | tslib: 347 | optional: true 348 | dependencies: 349 | '@rollup/pluginutils': 3.1.0(rollup@2.79.1) 350 | resolve: 1.22.8 351 | rollup: 2.79.1 352 | tslib: 2.6.2 353 | typescript: 4.9.5 354 | dev: true 355 | 356 | /@rollup/pluginutils@3.1.0(rollup@2.79.1): 357 | resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} 358 | engines: {node: '>= 8.0.0'} 359 | peerDependencies: 360 | rollup: ^1.20.0||^2.0.0 361 | dependencies: 362 | '@types/estree': 0.0.39 363 | estree-walker: 1.0.1 364 | picomatch: 2.3.1 365 | rollup: 2.79.1 366 | dev: true 367 | 368 | /@tsconfig/node10@1.0.9: 369 | resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} 370 | dev: true 371 | 372 | /@tsconfig/node12@1.0.11: 373 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 374 | dev: true 375 | 376 | /@tsconfig/node14@1.0.3: 377 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 378 | dev: true 379 | 380 | /@tsconfig/node16@1.0.4: 381 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 382 | dev: true 383 | 384 | /@types/estree@0.0.39: 385 | resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} 386 | dev: true 387 | 388 | /@types/estree@1.0.5: 389 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 390 | dev: true 391 | 392 | /@types/fast-levenshtein@0.0.2: 393 | resolution: {integrity: sha512-h9AGeNlFimLtFUlEZgk+hb3LUT4tNHu8y0jzCUeTdi1BM4e86sBQs/nQYgHk70ksNyNbuLwpymFAXkb0GAehmw==} 394 | dev: true 395 | 396 | /@types/minimist@1.2.5: 397 | resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} 398 | dev: true 399 | 400 | /@types/node@20.5.1: 401 | resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} 402 | dev: true 403 | 404 | /@types/node@20.9.2: 405 | resolution: {integrity: sha512-WHZXKFCEyIUJzAwh3NyyTHYSR35SevJ6mZ1nWwJafKtiQbqRTIKSRcw3Ma3acqgsent3RRDqeVwpHntMk+9irg==} 406 | dependencies: 407 | undici-types: 5.26.5 408 | dev: true 409 | 410 | /@types/normalize-package-data@2.4.4: 411 | resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} 412 | dev: true 413 | 414 | /@types/prop-types@15.7.10: 415 | resolution: {integrity: sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==} 416 | dev: true 417 | 418 | /@types/react-dom@18.2.15: 419 | resolution: {integrity: sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==} 420 | dependencies: 421 | '@types/react': 17.0.70 422 | dev: true 423 | 424 | /@types/react@17.0.70: 425 | resolution: {integrity: sha512-yqYMK49/cnqw+T8R9/C+RNjRddYmPDGI5lKHi3bOYceQCBAh8X2ngSbZP0gnVeyvHr0T7wEgIIGKT1usNol08w==} 426 | dependencies: 427 | '@types/prop-types': 15.7.10 428 | '@types/scheduler': 0.16.6 429 | csstype: 3.1.2 430 | dev: true 431 | 432 | /@types/resolve@1.17.1: 433 | resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} 434 | dependencies: 435 | '@types/node': 20.9.2 436 | dev: true 437 | 438 | /@types/scheduler@0.16.6: 439 | resolution: {integrity: sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA==} 440 | dev: true 441 | 442 | /JSONStream@1.3.5: 443 | resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} 444 | hasBin: true 445 | dependencies: 446 | jsonparse: 1.3.1 447 | through: 2.3.8 448 | dev: true 449 | 450 | /acorn-walk@8.3.0: 451 | resolution: {integrity: sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==} 452 | engines: {node: '>=0.4.0'} 453 | dev: true 454 | 455 | /acorn@8.11.2: 456 | resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} 457 | engines: {node: '>=0.4.0'} 458 | hasBin: true 459 | dev: true 460 | 461 | /ajv@8.12.0: 462 | resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} 463 | dependencies: 464 | fast-deep-equal: 3.1.3 465 | json-schema-traverse: 1.0.0 466 | require-from-string: 2.0.2 467 | uri-js: 4.4.1 468 | dev: true 469 | 470 | /ansi-escapes@5.0.0: 471 | resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} 472 | engines: {node: '>=12'} 473 | dependencies: 474 | type-fest: 1.4.0 475 | dev: true 476 | 477 | /ansi-regex@5.0.1: 478 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 479 | engines: {node: '>=8'} 480 | dev: true 481 | 482 | /ansi-regex@6.0.1: 483 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 484 | engines: {node: '>=12'} 485 | dev: true 486 | 487 | /ansi-styles@3.2.1: 488 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 489 | engines: {node: '>=4'} 490 | dependencies: 491 | color-convert: 1.9.3 492 | dev: true 493 | 494 | /ansi-styles@4.3.0: 495 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 496 | engines: {node: '>=8'} 497 | dependencies: 498 | color-convert: 2.0.1 499 | dev: true 500 | 501 | /ansi-styles@6.2.1: 502 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 503 | engines: {node: '>=12'} 504 | dev: true 505 | 506 | /arg@4.1.3: 507 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 508 | dev: true 509 | 510 | /argparse@2.0.1: 511 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 512 | dev: true 513 | 514 | /array-ify@1.0.0: 515 | resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} 516 | dev: true 517 | 518 | /arrify@1.0.1: 519 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 520 | engines: {node: '>=0.10.0'} 521 | dev: true 522 | 523 | /balanced-match@1.0.2: 524 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 525 | dev: true 526 | 527 | /brace-expansion@1.1.11: 528 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 529 | dependencies: 530 | balanced-match: 1.0.2 531 | concat-map: 0.0.1 532 | dev: true 533 | 534 | /braces@3.0.2: 535 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 536 | engines: {node: '>=8'} 537 | dependencies: 538 | fill-range: 7.0.1 539 | dev: true 540 | 541 | /builtin-modules@3.3.0: 542 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 543 | engines: {node: '>=6'} 544 | dev: true 545 | 546 | /callsites@3.1.0: 547 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 548 | engines: {node: '>=6'} 549 | dev: true 550 | 551 | /camelcase-keys@6.2.2: 552 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} 553 | engines: {node: '>=8'} 554 | dependencies: 555 | camelcase: 5.3.1 556 | map-obj: 4.3.0 557 | quick-lru: 4.0.1 558 | dev: true 559 | 560 | /camelcase@5.3.1: 561 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 562 | engines: {node: '>=6'} 563 | dev: true 564 | 565 | /chalk@2.4.2: 566 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 567 | engines: {node: '>=4'} 568 | dependencies: 569 | ansi-styles: 3.2.1 570 | escape-string-regexp: 1.0.5 571 | supports-color: 5.5.0 572 | dev: true 573 | 574 | /chalk@4.1.2: 575 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 576 | engines: {node: '>=10'} 577 | dependencies: 578 | ansi-styles: 4.3.0 579 | supports-color: 7.2.0 580 | dev: true 581 | 582 | /chalk@5.3.0: 583 | resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} 584 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 585 | dev: true 586 | 587 | /cli-cursor@4.0.0: 588 | resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} 589 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 590 | dependencies: 591 | restore-cursor: 4.0.0 592 | dev: true 593 | 594 | /cli-truncate@3.1.0: 595 | resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} 596 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 597 | dependencies: 598 | slice-ansi: 5.0.0 599 | string-width: 5.1.2 600 | dev: true 601 | 602 | /cliui@8.0.1: 603 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 604 | engines: {node: '>=12'} 605 | dependencies: 606 | string-width: 4.2.3 607 | strip-ansi: 6.0.1 608 | wrap-ansi: 7.0.0 609 | dev: true 610 | 611 | /color-convert@1.9.3: 612 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 613 | dependencies: 614 | color-name: 1.1.3 615 | dev: true 616 | 617 | /color-convert@2.0.1: 618 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 619 | engines: {node: '>=7.0.0'} 620 | dependencies: 621 | color-name: 1.1.4 622 | dev: true 623 | 624 | /color-name@1.1.3: 625 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 626 | dev: true 627 | 628 | /color-name@1.1.4: 629 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 630 | dev: true 631 | 632 | /colorette@2.0.20: 633 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 634 | dev: true 635 | 636 | /commander@11.0.0: 637 | resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} 638 | engines: {node: '>=16'} 639 | dev: true 640 | 641 | /commondir@1.0.1: 642 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 643 | dev: true 644 | 645 | /compare-func@2.0.0: 646 | resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} 647 | dependencies: 648 | array-ify: 1.0.0 649 | dot-prop: 5.3.0 650 | dev: true 651 | 652 | /concat-map@0.0.1: 653 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 654 | dev: true 655 | 656 | /conventional-changelog-angular@6.0.0: 657 | resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} 658 | engines: {node: '>=14'} 659 | dependencies: 660 | compare-func: 2.0.0 661 | dev: true 662 | 663 | /conventional-changelog-conventionalcommits@6.1.0: 664 | resolution: {integrity: sha512-3cS3GEtR78zTfMzk0AizXKKIdN4OvSh7ibNz6/DPbhWWQu7LqE/8+/GqSodV+sywUR2gpJAdP/1JFf4XtN7Zpw==} 665 | engines: {node: '>=14'} 666 | dependencies: 667 | compare-func: 2.0.0 668 | dev: true 669 | 670 | /conventional-commits-parser@4.0.0: 671 | resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} 672 | engines: {node: '>=14'} 673 | hasBin: true 674 | dependencies: 675 | JSONStream: 1.3.5 676 | is-text-path: 1.0.1 677 | meow: 8.1.2 678 | split2: 3.2.2 679 | dev: true 680 | 681 | /cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6)(ts-node@10.9.1)(typescript@4.9.5): 682 | resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} 683 | engines: {node: '>=v14.21.3'} 684 | peerDependencies: 685 | '@types/node': '*' 686 | cosmiconfig: '>=7' 687 | ts-node: '>=10' 688 | typescript: '>=4' 689 | dependencies: 690 | '@types/node': 20.5.1 691 | cosmiconfig: 8.3.6(typescript@4.9.5) 692 | ts-node: 10.9.1(@types/node@20.5.1)(typescript@4.9.5) 693 | typescript: 4.9.5 694 | dev: true 695 | 696 | /cosmiconfig@8.3.6(typescript@4.9.5): 697 | resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} 698 | engines: {node: '>=14'} 699 | peerDependencies: 700 | typescript: '>=4.9.5' 701 | peerDependenciesMeta: 702 | typescript: 703 | optional: true 704 | dependencies: 705 | import-fresh: 3.3.0 706 | js-yaml: 4.1.0 707 | parse-json: 5.2.0 708 | path-type: 4.0.0 709 | typescript: 4.9.5 710 | dev: true 711 | 712 | /create-require@1.1.1: 713 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 714 | dev: true 715 | 716 | /cross-spawn@7.0.3: 717 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 718 | engines: {node: '>= 8'} 719 | dependencies: 720 | path-key: 3.1.1 721 | shebang-command: 2.0.0 722 | which: 2.0.2 723 | dev: true 724 | 725 | /csstype@3.1.2: 726 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} 727 | dev: true 728 | 729 | /dargs@7.0.0: 730 | resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} 731 | engines: {node: '>=8'} 732 | dev: true 733 | 734 | /debug@4.3.4: 735 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 736 | engines: {node: '>=6.0'} 737 | peerDependencies: 738 | supports-color: '*' 739 | peerDependenciesMeta: 740 | supports-color: 741 | optional: true 742 | dependencies: 743 | ms: 2.1.2 744 | dev: true 745 | 746 | /decamelize-keys@1.1.1: 747 | resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} 748 | engines: {node: '>=0.10.0'} 749 | dependencies: 750 | decamelize: 1.2.0 751 | map-obj: 1.0.1 752 | dev: true 753 | 754 | /decamelize@1.2.0: 755 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 756 | engines: {node: '>=0.10.0'} 757 | dev: true 758 | 759 | /decky-frontend-lib@3.23.1: 760 | resolution: {integrity: sha512-6JKtSCjk5liJ+xBqOPZvPSp1HdkaQ+j/I19bGSk+cWuxSrodyduduXKJE4p4GJ/+KgFdn0yg/8tRi+DSqmBvdw==} 761 | dev: false 762 | 763 | /deepmerge@4.3.1: 764 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 765 | engines: {node: '>=0.10.0'} 766 | dev: true 767 | 768 | /diff@4.0.2: 769 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 770 | engines: {node: '>=0.3.1'} 771 | dev: true 772 | 773 | /dot-prop@5.3.0: 774 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 775 | engines: {node: '>=8'} 776 | dependencies: 777 | is-obj: 2.0.0 778 | dev: true 779 | 780 | /eastasianwidth@0.2.0: 781 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 782 | dev: true 783 | 784 | /emoji-regex@8.0.0: 785 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 786 | dev: true 787 | 788 | /emoji-regex@9.2.2: 789 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 790 | dev: true 791 | 792 | /error-ex@1.3.2: 793 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 794 | dependencies: 795 | is-arrayish: 0.2.1 796 | dev: true 797 | 798 | /escalade@3.1.1: 799 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 800 | engines: {node: '>=6'} 801 | dev: true 802 | 803 | /escape-string-regexp@1.0.5: 804 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 805 | engines: {node: '>=0.8.0'} 806 | dev: true 807 | 808 | /estree-walker@0.6.1: 809 | resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} 810 | dev: true 811 | 812 | /estree-walker@1.0.1: 813 | resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} 814 | dev: true 815 | 816 | /estree-walker@2.0.2: 817 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 818 | dev: true 819 | 820 | /eventemitter3@5.0.1: 821 | resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} 822 | dev: true 823 | 824 | /execa@5.1.1: 825 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 826 | engines: {node: '>=10'} 827 | dependencies: 828 | cross-spawn: 7.0.3 829 | get-stream: 6.0.1 830 | human-signals: 2.1.0 831 | is-stream: 2.0.1 832 | merge-stream: 2.0.0 833 | npm-run-path: 4.0.1 834 | onetime: 5.1.2 835 | signal-exit: 3.0.7 836 | strip-final-newline: 2.0.0 837 | dev: true 838 | 839 | /execa@7.2.0: 840 | resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} 841 | engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} 842 | dependencies: 843 | cross-spawn: 7.0.3 844 | get-stream: 6.0.1 845 | human-signals: 4.3.1 846 | is-stream: 3.0.0 847 | merge-stream: 2.0.0 848 | npm-run-path: 5.1.0 849 | onetime: 6.0.0 850 | signal-exit: 3.0.7 851 | strip-final-newline: 3.0.0 852 | dev: true 853 | 854 | /fast-deep-equal@3.1.3: 855 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 856 | dev: true 857 | 858 | /fast-levenshtein@3.0.0: 859 | resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} 860 | dependencies: 861 | fastest-levenshtein: 1.0.16 862 | dev: false 863 | 864 | /fastest-levenshtein@1.0.16: 865 | resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} 866 | engines: {node: '>= 4.9.1'} 867 | dev: false 868 | 869 | /fill-range@7.0.1: 870 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 871 | engines: {node: '>=8'} 872 | dependencies: 873 | to-regex-range: 5.0.1 874 | dev: true 875 | 876 | /find-up@4.1.0: 877 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 878 | engines: {node: '>=8'} 879 | dependencies: 880 | locate-path: 5.0.0 881 | path-exists: 4.0.0 882 | dev: true 883 | 884 | /find-up@5.0.0: 885 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 886 | engines: {node: '>=10'} 887 | dependencies: 888 | locate-path: 6.0.0 889 | path-exists: 4.0.0 890 | dev: true 891 | 892 | /fs-extra@11.1.1: 893 | resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} 894 | engines: {node: '>=14.14'} 895 | dependencies: 896 | graceful-fs: 4.2.11 897 | jsonfile: 6.1.0 898 | universalify: 2.0.1 899 | dev: true 900 | 901 | /fs.realpath@1.0.0: 902 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 903 | dev: true 904 | 905 | /fsevents@2.3.3: 906 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 907 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 908 | os: [darwin] 909 | requiresBuild: true 910 | dev: true 911 | optional: true 912 | 913 | /function-bind@1.1.2: 914 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 915 | dev: true 916 | 917 | /get-caller-file@2.0.5: 918 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 919 | engines: {node: 6.* || 8.* || >= 10.*} 920 | dev: true 921 | 922 | /get-stream@6.0.1: 923 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 924 | engines: {node: '>=10'} 925 | dev: true 926 | 927 | /git-raw-commits@2.0.11: 928 | resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} 929 | engines: {node: '>=10'} 930 | hasBin: true 931 | dependencies: 932 | dargs: 7.0.0 933 | lodash: 4.17.21 934 | meow: 8.1.2 935 | split2: 3.2.2 936 | through2: 4.0.2 937 | dev: true 938 | 939 | /glob@7.2.3: 940 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 941 | dependencies: 942 | fs.realpath: 1.0.0 943 | inflight: 1.0.6 944 | inherits: 2.0.4 945 | minimatch: 3.1.2 946 | once: 1.4.0 947 | path-is-absolute: 1.0.1 948 | dev: true 949 | 950 | /global-dirs@0.1.1: 951 | resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} 952 | engines: {node: '>=4'} 953 | dependencies: 954 | ini: 1.3.8 955 | dev: true 956 | 957 | /graceful-fs@4.2.11: 958 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 959 | dev: true 960 | 961 | /hard-rejection@2.1.0: 962 | resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} 963 | engines: {node: '>=6'} 964 | dev: true 965 | 966 | /has-flag@3.0.0: 967 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 968 | engines: {node: '>=4'} 969 | dev: true 970 | 971 | /has-flag@4.0.0: 972 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 973 | engines: {node: '>=8'} 974 | dev: true 975 | 976 | /hasown@2.0.0: 977 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 978 | engines: {node: '>= 0.4'} 979 | dependencies: 980 | function-bind: 1.1.2 981 | dev: true 982 | 983 | /hosted-git-info@2.8.9: 984 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 985 | dev: true 986 | 987 | /hosted-git-info@4.1.0: 988 | resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} 989 | engines: {node: '>=10'} 990 | dependencies: 991 | lru-cache: 6.0.0 992 | dev: true 993 | 994 | /human-signals@2.1.0: 995 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 996 | engines: {node: '>=10.17.0'} 997 | dev: true 998 | 999 | /human-signals@4.3.1: 1000 | resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} 1001 | engines: {node: '>=14.18.0'} 1002 | dev: true 1003 | 1004 | /husky@8.0.3: 1005 | resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} 1006 | engines: {node: '>=14'} 1007 | hasBin: true 1008 | dev: true 1009 | 1010 | /immediate@3.0.6: 1011 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} 1012 | dev: false 1013 | 1014 | /import-fresh@3.3.0: 1015 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1016 | engines: {node: '>=6'} 1017 | dependencies: 1018 | parent-module: 1.0.1 1019 | resolve-from: 4.0.0 1020 | dev: true 1021 | 1022 | /indent-string@4.0.0: 1023 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1024 | engines: {node: '>=8'} 1025 | dev: true 1026 | 1027 | /inflight@1.0.6: 1028 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1029 | dependencies: 1030 | once: 1.4.0 1031 | wrappy: 1.0.2 1032 | dev: true 1033 | 1034 | /inherits@2.0.4: 1035 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1036 | dev: true 1037 | 1038 | /ini@1.3.8: 1039 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 1040 | dev: true 1041 | 1042 | /is-arrayish@0.2.1: 1043 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1044 | dev: true 1045 | 1046 | /is-builtin-module@3.2.1: 1047 | resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} 1048 | engines: {node: '>=6'} 1049 | dependencies: 1050 | builtin-modules: 3.3.0 1051 | dev: true 1052 | 1053 | /is-core-module@2.13.1: 1054 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1055 | dependencies: 1056 | hasown: 2.0.0 1057 | dev: true 1058 | 1059 | /is-fullwidth-code-point@3.0.0: 1060 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1061 | engines: {node: '>=8'} 1062 | dev: true 1063 | 1064 | /is-fullwidth-code-point@4.0.0: 1065 | resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} 1066 | engines: {node: '>=12'} 1067 | dev: true 1068 | 1069 | /is-module@1.0.0: 1070 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 1071 | dev: true 1072 | 1073 | /is-number@7.0.0: 1074 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1075 | engines: {node: '>=0.12.0'} 1076 | dev: true 1077 | 1078 | /is-obj@2.0.0: 1079 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 1080 | engines: {node: '>=8'} 1081 | dev: true 1082 | 1083 | /is-plain-obj@1.1.0: 1084 | resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} 1085 | engines: {node: '>=0.10.0'} 1086 | dev: true 1087 | 1088 | /is-reference@1.2.1: 1089 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 1090 | dependencies: 1091 | '@types/estree': 1.0.5 1092 | dev: true 1093 | 1094 | /is-stream@2.0.1: 1095 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1096 | engines: {node: '>=8'} 1097 | dev: true 1098 | 1099 | /is-stream@3.0.0: 1100 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1101 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1102 | dev: true 1103 | 1104 | /is-text-path@1.0.1: 1105 | resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} 1106 | engines: {node: '>=0.10.0'} 1107 | dependencies: 1108 | text-extensions: 1.9.0 1109 | dev: true 1110 | 1111 | /isexe@2.0.0: 1112 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1113 | dev: true 1114 | 1115 | /js-tokens@4.0.0: 1116 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1117 | 1118 | /js-yaml@4.1.0: 1119 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1120 | hasBin: true 1121 | dependencies: 1122 | argparse: 2.0.1 1123 | dev: true 1124 | 1125 | /json-parse-even-better-errors@2.3.1: 1126 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1127 | dev: true 1128 | 1129 | /json-schema-traverse@1.0.0: 1130 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1131 | dev: true 1132 | 1133 | /jsonfile@6.1.0: 1134 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 1135 | dependencies: 1136 | universalify: 2.0.1 1137 | optionalDependencies: 1138 | graceful-fs: 4.2.11 1139 | dev: true 1140 | 1141 | /jsonparse@1.3.1: 1142 | resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} 1143 | engines: {'0': node >= 0.2.0} 1144 | dev: true 1145 | 1146 | /kind-of@6.0.3: 1147 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1148 | engines: {node: '>=0.10.0'} 1149 | dev: true 1150 | 1151 | /lie@3.1.1: 1152 | resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} 1153 | dependencies: 1154 | immediate: 3.0.6 1155 | dev: false 1156 | 1157 | /lilconfig@2.1.0: 1158 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1159 | engines: {node: '>=10'} 1160 | dev: true 1161 | 1162 | /lines-and-columns@1.2.4: 1163 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1164 | dev: true 1165 | 1166 | /lint-staged@13.3.0: 1167 | resolution: {integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ==} 1168 | engines: {node: ^16.14.0 || >=18.0.0} 1169 | hasBin: true 1170 | dependencies: 1171 | chalk: 5.3.0 1172 | commander: 11.0.0 1173 | debug: 4.3.4 1174 | execa: 7.2.0 1175 | lilconfig: 2.1.0 1176 | listr2: 6.6.1 1177 | micromatch: 4.0.5 1178 | pidtree: 0.6.0 1179 | string-argv: 0.3.2 1180 | yaml: 2.3.1 1181 | transitivePeerDependencies: 1182 | - enquirer 1183 | - supports-color 1184 | dev: true 1185 | 1186 | /listr2@6.6.1: 1187 | resolution: {integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg==} 1188 | engines: {node: '>=16.0.0'} 1189 | peerDependencies: 1190 | enquirer: '>= 2.3.0 < 3' 1191 | peerDependenciesMeta: 1192 | enquirer: 1193 | optional: true 1194 | dependencies: 1195 | cli-truncate: 3.1.0 1196 | colorette: 2.0.20 1197 | eventemitter3: 5.0.1 1198 | log-update: 5.0.1 1199 | rfdc: 1.3.0 1200 | wrap-ansi: 8.1.0 1201 | dev: true 1202 | 1203 | /localforage@1.10.0: 1204 | resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} 1205 | dependencies: 1206 | lie: 3.1.1 1207 | dev: false 1208 | 1209 | /locate-path@5.0.0: 1210 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1211 | engines: {node: '>=8'} 1212 | dependencies: 1213 | p-locate: 4.1.0 1214 | dev: true 1215 | 1216 | /locate-path@6.0.0: 1217 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1218 | engines: {node: '>=10'} 1219 | dependencies: 1220 | p-locate: 5.0.0 1221 | dev: true 1222 | 1223 | /lodash.camelcase@4.3.0: 1224 | resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} 1225 | dev: true 1226 | 1227 | /lodash.isfunction@3.0.9: 1228 | resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} 1229 | dev: true 1230 | 1231 | /lodash.isplainobject@4.0.6: 1232 | resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} 1233 | dev: true 1234 | 1235 | /lodash.kebabcase@4.1.1: 1236 | resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} 1237 | dev: true 1238 | 1239 | /lodash.merge@4.6.2: 1240 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1241 | dev: true 1242 | 1243 | /lodash.mergewith@4.6.2: 1244 | resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} 1245 | dev: true 1246 | 1247 | /lodash.snakecase@4.1.1: 1248 | resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} 1249 | dev: true 1250 | 1251 | /lodash.startcase@4.4.0: 1252 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 1253 | dev: true 1254 | 1255 | /lodash.uniq@4.5.0: 1256 | resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} 1257 | dev: true 1258 | 1259 | /lodash.upperfirst@4.3.1: 1260 | resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} 1261 | dev: true 1262 | 1263 | /lodash@4.17.21: 1264 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1265 | dev: true 1266 | 1267 | /log-update@5.0.1: 1268 | resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} 1269 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1270 | dependencies: 1271 | ansi-escapes: 5.0.0 1272 | cli-cursor: 4.0.0 1273 | slice-ansi: 5.0.0 1274 | strip-ansi: 7.1.0 1275 | wrap-ansi: 8.1.0 1276 | dev: true 1277 | 1278 | /loose-envify@1.4.0: 1279 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1280 | hasBin: true 1281 | dependencies: 1282 | js-tokens: 4.0.0 1283 | dev: false 1284 | 1285 | /lru-cache@6.0.0: 1286 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1287 | engines: {node: '>=10'} 1288 | dependencies: 1289 | yallist: 4.0.0 1290 | dev: true 1291 | 1292 | /magic-string@0.25.9: 1293 | resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} 1294 | dependencies: 1295 | sourcemap-codec: 1.4.8 1296 | dev: true 1297 | 1298 | /make-error@1.3.6: 1299 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 1300 | dev: true 1301 | 1302 | /map-obj@1.0.1: 1303 | resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} 1304 | engines: {node: '>=0.10.0'} 1305 | dev: true 1306 | 1307 | /map-obj@4.3.0: 1308 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 1309 | engines: {node: '>=8'} 1310 | dev: true 1311 | 1312 | /meow@8.1.2: 1313 | resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} 1314 | engines: {node: '>=10'} 1315 | dependencies: 1316 | '@types/minimist': 1.2.5 1317 | camelcase-keys: 6.2.2 1318 | decamelize-keys: 1.1.1 1319 | hard-rejection: 2.1.0 1320 | minimist-options: 4.1.0 1321 | normalize-package-data: 3.0.3 1322 | read-pkg-up: 7.0.1 1323 | redent: 3.0.0 1324 | trim-newlines: 3.0.1 1325 | type-fest: 0.18.1 1326 | yargs-parser: 20.2.9 1327 | dev: true 1328 | 1329 | /merge-stream@2.0.0: 1330 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1331 | dev: true 1332 | 1333 | /micromatch@4.0.5: 1334 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1335 | engines: {node: '>=8.6'} 1336 | dependencies: 1337 | braces: 3.0.2 1338 | picomatch: 2.3.1 1339 | dev: true 1340 | 1341 | /mimic-fn@2.1.0: 1342 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 1343 | engines: {node: '>=6'} 1344 | dev: true 1345 | 1346 | /mimic-fn@4.0.0: 1347 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1348 | engines: {node: '>=12'} 1349 | dev: true 1350 | 1351 | /min-indent@1.0.1: 1352 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1353 | engines: {node: '>=4'} 1354 | dev: true 1355 | 1356 | /minimatch@3.1.2: 1357 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1358 | dependencies: 1359 | brace-expansion: 1.1.11 1360 | dev: true 1361 | 1362 | /minimist-options@4.1.0: 1363 | resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} 1364 | engines: {node: '>= 6'} 1365 | dependencies: 1366 | arrify: 1.0.1 1367 | is-plain-obj: 1.1.0 1368 | kind-of: 6.0.3 1369 | dev: true 1370 | 1371 | /minimist@1.2.8: 1372 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1373 | dev: true 1374 | 1375 | /ms@2.1.2: 1376 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1377 | dev: true 1378 | 1379 | /normalize-package-data@2.5.0: 1380 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 1381 | dependencies: 1382 | hosted-git-info: 2.8.9 1383 | resolve: 1.22.8 1384 | semver: 5.7.2 1385 | validate-npm-package-license: 3.0.4 1386 | dev: true 1387 | 1388 | /normalize-package-data@3.0.3: 1389 | resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} 1390 | engines: {node: '>=10'} 1391 | dependencies: 1392 | hosted-git-info: 4.1.0 1393 | is-core-module: 2.13.1 1394 | semver: 7.5.4 1395 | validate-npm-package-license: 3.0.4 1396 | dev: true 1397 | 1398 | /npm-run-path@4.0.1: 1399 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 1400 | engines: {node: '>=8'} 1401 | dependencies: 1402 | path-key: 3.1.1 1403 | dev: true 1404 | 1405 | /npm-run-path@5.1.0: 1406 | resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} 1407 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1408 | dependencies: 1409 | path-key: 4.0.0 1410 | dev: true 1411 | 1412 | /once@1.4.0: 1413 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1414 | dependencies: 1415 | wrappy: 1.0.2 1416 | dev: true 1417 | 1418 | /onetime@5.1.2: 1419 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 1420 | engines: {node: '>=6'} 1421 | dependencies: 1422 | mimic-fn: 2.1.0 1423 | dev: true 1424 | 1425 | /onetime@6.0.0: 1426 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1427 | engines: {node: '>=12'} 1428 | dependencies: 1429 | mimic-fn: 4.0.0 1430 | dev: true 1431 | 1432 | /p-limit@2.3.0: 1433 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1434 | engines: {node: '>=6'} 1435 | dependencies: 1436 | p-try: 2.2.0 1437 | dev: true 1438 | 1439 | /p-limit@3.1.0: 1440 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1441 | engines: {node: '>=10'} 1442 | dependencies: 1443 | yocto-queue: 0.1.0 1444 | dev: true 1445 | 1446 | /p-locate@4.1.0: 1447 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1448 | engines: {node: '>=8'} 1449 | dependencies: 1450 | p-limit: 2.3.0 1451 | dev: true 1452 | 1453 | /p-locate@5.0.0: 1454 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1455 | engines: {node: '>=10'} 1456 | dependencies: 1457 | p-limit: 3.1.0 1458 | dev: true 1459 | 1460 | /p-try@2.2.0: 1461 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1462 | engines: {node: '>=6'} 1463 | dev: true 1464 | 1465 | /parent-module@1.0.1: 1466 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1467 | engines: {node: '>=6'} 1468 | dependencies: 1469 | callsites: 3.1.0 1470 | dev: true 1471 | 1472 | /parse-json@5.2.0: 1473 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 1474 | engines: {node: '>=8'} 1475 | dependencies: 1476 | '@babel/code-frame': 7.23.4 1477 | error-ex: 1.3.2 1478 | json-parse-even-better-errors: 2.3.1 1479 | lines-and-columns: 1.2.4 1480 | dev: true 1481 | 1482 | /path-exists@4.0.0: 1483 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1484 | engines: {node: '>=8'} 1485 | dev: true 1486 | 1487 | /path-is-absolute@1.0.1: 1488 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1489 | engines: {node: '>=0.10.0'} 1490 | dev: true 1491 | 1492 | /path-key@3.1.1: 1493 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1494 | engines: {node: '>=8'} 1495 | dev: true 1496 | 1497 | /path-key@4.0.0: 1498 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1499 | engines: {node: '>=12'} 1500 | dev: true 1501 | 1502 | /path-parse@1.0.7: 1503 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1504 | dev: true 1505 | 1506 | /path-type@4.0.0: 1507 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 1508 | engines: {node: '>=8'} 1509 | dev: true 1510 | 1511 | /picomatch@2.3.1: 1512 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1513 | engines: {node: '>=8.6'} 1514 | dev: true 1515 | 1516 | /pidtree@0.6.0: 1517 | resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} 1518 | engines: {node: '>=0.10'} 1519 | hasBin: true 1520 | dev: true 1521 | 1522 | /prettier@2.7.1: 1523 | resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} 1524 | engines: {node: '>=10.13.0'} 1525 | hasBin: true 1526 | dev: true 1527 | 1528 | /punycode@2.3.1: 1529 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1530 | engines: {node: '>=6'} 1531 | dev: true 1532 | 1533 | /quick-lru@4.0.1: 1534 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} 1535 | engines: {node: '>=8'} 1536 | dev: true 1537 | 1538 | /react-icons@4.12.0(react@18.2.0): 1539 | resolution: {integrity: sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==} 1540 | peerDependencies: 1541 | react: '*' 1542 | dependencies: 1543 | react: 18.2.0 1544 | dev: false 1545 | 1546 | /react@18.2.0: 1547 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1548 | engines: {node: '>=0.10.0'} 1549 | dependencies: 1550 | loose-envify: 1.4.0 1551 | dev: false 1552 | 1553 | /read-pkg-up@7.0.1: 1554 | resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} 1555 | engines: {node: '>=8'} 1556 | dependencies: 1557 | find-up: 4.1.0 1558 | read-pkg: 5.2.0 1559 | type-fest: 0.8.1 1560 | dev: true 1561 | 1562 | /read-pkg@5.2.0: 1563 | resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} 1564 | engines: {node: '>=8'} 1565 | dependencies: 1566 | '@types/normalize-package-data': 2.4.4 1567 | normalize-package-data: 2.5.0 1568 | parse-json: 5.2.0 1569 | type-fest: 0.6.0 1570 | dev: true 1571 | 1572 | /readable-stream@3.6.2: 1573 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1574 | engines: {node: '>= 6'} 1575 | dependencies: 1576 | inherits: 2.0.4 1577 | string_decoder: 1.3.0 1578 | util-deprecate: 1.0.2 1579 | dev: true 1580 | 1581 | /redent@3.0.0: 1582 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 1583 | engines: {node: '>=8'} 1584 | dependencies: 1585 | indent-string: 4.0.0 1586 | strip-indent: 3.0.0 1587 | dev: true 1588 | 1589 | /require-directory@2.1.1: 1590 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1591 | engines: {node: '>=0.10.0'} 1592 | dev: true 1593 | 1594 | /require-from-string@2.0.2: 1595 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1596 | engines: {node: '>=0.10.0'} 1597 | dev: true 1598 | 1599 | /resolve-from@4.0.0: 1600 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1601 | engines: {node: '>=4'} 1602 | dev: true 1603 | 1604 | /resolve-from@5.0.0: 1605 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1606 | engines: {node: '>=8'} 1607 | dev: true 1608 | 1609 | /resolve-global@1.0.0: 1610 | resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} 1611 | engines: {node: '>=8'} 1612 | dependencies: 1613 | global-dirs: 0.1.1 1614 | dev: true 1615 | 1616 | /resolve@1.22.8: 1617 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1618 | hasBin: true 1619 | dependencies: 1620 | is-core-module: 2.13.1 1621 | path-parse: 1.0.7 1622 | supports-preserve-symlinks-flag: 1.0.0 1623 | dev: true 1624 | 1625 | /restore-cursor@4.0.0: 1626 | resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} 1627 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1628 | dependencies: 1629 | onetime: 5.1.2 1630 | signal-exit: 3.0.7 1631 | dev: true 1632 | 1633 | /rfdc@1.3.0: 1634 | resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} 1635 | dev: true 1636 | 1637 | /rollup-plugin-import-assets@1.1.1(rollup@2.79.1): 1638 | resolution: {integrity: sha512-u5zJwOjguTf2N+wETq2weNKGvNkuVc1UX/fPgg215p5xPvGOaI6/BTc024E9brvFjSQTfIYqgvwogQdipknu1g==} 1639 | peerDependencies: 1640 | rollup: '>=1.9.0' 1641 | dependencies: 1642 | rollup: 2.79.1 1643 | rollup-pluginutils: 2.8.2 1644 | url-join: 4.0.1 1645 | dev: true 1646 | 1647 | /rollup-pluginutils@2.8.2: 1648 | resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} 1649 | dependencies: 1650 | estree-walker: 0.6.1 1651 | dev: true 1652 | 1653 | /rollup@2.79.1: 1654 | resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} 1655 | engines: {node: '>=10.0.0'} 1656 | hasBin: true 1657 | optionalDependencies: 1658 | fsevents: 2.3.3 1659 | dev: true 1660 | 1661 | /safe-buffer@5.2.1: 1662 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1663 | dev: true 1664 | 1665 | /semver@5.7.2: 1666 | resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} 1667 | hasBin: true 1668 | dev: true 1669 | 1670 | /semver@7.5.4: 1671 | resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} 1672 | engines: {node: '>=10'} 1673 | hasBin: true 1674 | dependencies: 1675 | lru-cache: 6.0.0 1676 | dev: true 1677 | 1678 | /shebang-command@2.0.0: 1679 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1680 | engines: {node: '>=8'} 1681 | dependencies: 1682 | shebang-regex: 3.0.0 1683 | dev: true 1684 | 1685 | /shebang-regex@3.0.0: 1686 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1687 | engines: {node: '>=8'} 1688 | dev: true 1689 | 1690 | /signal-exit@3.0.7: 1691 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1692 | dev: true 1693 | 1694 | /slice-ansi@5.0.0: 1695 | resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} 1696 | engines: {node: '>=12'} 1697 | dependencies: 1698 | ansi-styles: 6.2.1 1699 | is-fullwidth-code-point: 4.0.0 1700 | dev: true 1701 | 1702 | /sourcemap-codec@1.4.8: 1703 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1704 | deprecated: Please use @jridgewell/sourcemap-codec instead 1705 | dev: true 1706 | 1707 | /spdx-correct@3.2.0: 1708 | resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} 1709 | dependencies: 1710 | spdx-expression-parse: 3.0.1 1711 | spdx-license-ids: 3.0.16 1712 | dev: true 1713 | 1714 | /spdx-exceptions@2.3.0: 1715 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1716 | dev: true 1717 | 1718 | /spdx-expression-parse@3.0.1: 1719 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1720 | dependencies: 1721 | spdx-exceptions: 2.3.0 1722 | spdx-license-ids: 3.0.16 1723 | dev: true 1724 | 1725 | /spdx-license-ids@3.0.16: 1726 | resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} 1727 | dev: true 1728 | 1729 | /split2@3.2.2: 1730 | resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} 1731 | dependencies: 1732 | readable-stream: 3.6.2 1733 | dev: true 1734 | 1735 | /string-argv@0.3.2: 1736 | resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 1737 | engines: {node: '>=0.6.19'} 1738 | dev: true 1739 | 1740 | /string-width@4.2.3: 1741 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1742 | engines: {node: '>=8'} 1743 | dependencies: 1744 | emoji-regex: 8.0.0 1745 | is-fullwidth-code-point: 3.0.0 1746 | strip-ansi: 6.0.1 1747 | dev: true 1748 | 1749 | /string-width@5.1.2: 1750 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1751 | engines: {node: '>=12'} 1752 | dependencies: 1753 | eastasianwidth: 0.2.0 1754 | emoji-regex: 9.2.2 1755 | strip-ansi: 7.1.0 1756 | dev: true 1757 | 1758 | /string_decoder@1.3.0: 1759 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1760 | dependencies: 1761 | safe-buffer: 5.2.1 1762 | dev: true 1763 | 1764 | /strip-ansi@6.0.1: 1765 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1766 | engines: {node: '>=8'} 1767 | dependencies: 1768 | ansi-regex: 5.0.1 1769 | dev: true 1770 | 1771 | /strip-ansi@7.1.0: 1772 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1773 | engines: {node: '>=12'} 1774 | dependencies: 1775 | ansi-regex: 6.0.1 1776 | dev: true 1777 | 1778 | /strip-final-newline@2.0.0: 1779 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 1780 | engines: {node: '>=6'} 1781 | dev: true 1782 | 1783 | /strip-final-newline@3.0.0: 1784 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1785 | engines: {node: '>=12'} 1786 | dev: true 1787 | 1788 | /strip-indent@3.0.0: 1789 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1790 | engines: {node: '>=8'} 1791 | dependencies: 1792 | min-indent: 1.0.1 1793 | dev: true 1794 | 1795 | /supports-color@5.5.0: 1796 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1797 | engines: {node: '>=4'} 1798 | dependencies: 1799 | has-flag: 3.0.0 1800 | dev: true 1801 | 1802 | /supports-color@7.2.0: 1803 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1804 | engines: {node: '>=8'} 1805 | dependencies: 1806 | has-flag: 4.0.0 1807 | dev: true 1808 | 1809 | /supports-preserve-symlinks-flag@1.0.0: 1810 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1811 | engines: {node: '>= 0.4'} 1812 | dev: true 1813 | 1814 | /text-extensions@1.9.0: 1815 | resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} 1816 | engines: {node: '>=0.10'} 1817 | dev: true 1818 | 1819 | /through2@4.0.2: 1820 | resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} 1821 | dependencies: 1822 | readable-stream: 3.6.2 1823 | dev: true 1824 | 1825 | /through@2.3.8: 1826 | resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 1827 | dev: true 1828 | 1829 | /to-regex-range@5.0.1: 1830 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1831 | engines: {node: '>=8.0'} 1832 | dependencies: 1833 | is-number: 7.0.0 1834 | dev: true 1835 | 1836 | /trim-newlines@3.0.1: 1837 | resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} 1838 | engines: {node: '>=8'} 1839 | dev: true 1840 | 1841 | /ts-node@10.9.1(@types/node@20.5.1)(typescript@4.9.5): 1842 | resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} 1843 | hasBin: true 1844 | peerDependencies: 1845 | '@swc/core': '>=1.2.50' 1846 | '@swc/wasm': '>=1.2.50' 1847 | '@types/node': '*' 1848 | typescript: '>=2.7' 1849 | peerDependenciesMeta: 1850 | '@swc/core': 1851 | optional: true 1852 | '@swc/wasm': 1853 | optional: true 1854 | dependencies: 1855 | '@cspotcode/source-map-support': 0.8.1 1856 | '@tsconfig/node10': 1.0.9 1857 | '@tsconfig/node12': 1.0.11 1858 | '@tsconfig/node14': 1.0.3 1859 | '@tsconfig/node16': 1.0.4 1860 | '@types/node': 20.5.1 1861 | acorn: 8.11.2 1862 | acorn-walk: 8.3.0 1863 | arg: 4.1.3 1864 | create-require: 1.1.1 1865 | diff: 4.0.2 1866 | make-error: 1.3.6 1867 | typescript: 4.9.5 1868 | v8-compile-cache-lib: 3.0.1 1869 | yn: 3.1.1 1870 | dev: true 1871 | 1872 | /tslib@2.6.2: 1873 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 1874 | dev: true 1875 | 1876 | /type-fest@0.18.1: 1877 | resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} 1878 | engines: {node: '>=10'} 1879 | dev: true 1880 | 1881 | /type-fest@0.6.0: 1882 | resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} 1883 | engines: {node: '>=8'} 1884 | dev: true 1885 | 1886 | /type-fest@0.8.1: 1887 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 1888 | engines: {node: '>=8'} 1889 | dev: true 1890 | 1891 | /type-fest@1.4.0: 1892 | resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} 1893 | engines: {node: '>=10'} 1894 | dev: true 1895 | 1896 | /typescript@4.9.5: 1897 | resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 1898 | engines: {node: '>=4.2.0'} 1899 | hasBin: true 1900 | dev: true 1901 | 1902 | /undici-types@5.26.5: 1903 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 1904 | dev: true 1905 | 1906 | /universalify@2.0.1: 1907 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 1908 | engines: {node: '>= 10.0.0'} 1909 | dev: true 1910 | 1911 | /uri-js@4.4.1: 1912 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1913 | dependencies: 1914 | punycode: 2.3.1 1915 | dev: true 1916 | 1917 | /url-join@4.0.1: 1918 | resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} 1919 | dev: true 1920 | 1921 | /util-deprecate@1.0.2: 1922 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1923 | dev: true 1924 | 1925 | /v8-compile-cache-lib@3.0.1: 1926 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1927 | dev: true 1928 | 1929 | /validate-npm-package-license@3.0.4: 1930 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1931 | dependencies: 1932 | spdx-correct: 3.2.0 1933 | spdx-expression-parse: 3.0.1 1934 | dev: true 1935 | 1936 | /which@2.0.2: 1937 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1938 | engines: {node: '>= 8'} 1939 | hasBin: true 1940 | dependencies: 1941 | isexe: 2.0.0 1942 | dev: true 1943 | 1944 | /wrap-ansi@7.0.0: 1945 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1946 | engines: {node: '>=10'} 1947 | dependencies: 1948 | ansi-styles: 4.3.0 1949 | string-width: 4.2.3 1950 | strip-ansi: 6.0.1 1951 | dev: true 1952 | 1953 | /wrap-ansi@8.1.0: 1954 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1955 | engines: {node: '>=12'} 1956 | dependencies: 1957 | ansi-styles: 6.2.1 1958 | string-width: 5.1.2 1959 | strip-ansi: 7.1.0 1960 | dev: true 1961 | 1962 | /wrappy@1.0.2: 1963 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1964 | dev: true 1965 | 1966 | /y18n@5.0.8: 1967 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1968 | engines: {node: '>=10'} 1969 | dev: true 1970 | 1971 | /yallist@4.0.0: 1972 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 1973 | dev: true 1974 | 1975 | /yaml@2.3.1: 1976 | resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} 1977 | engines: {node: '>= 14'} 1978 | dev: true 1979 | 1980 | /yargs-parser@20.2.9: 1981 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1982 | engines: {node: '>=10'} 1983 | dev: true 1984 | 1985 | /yargs-parser@21.1.1: 1986 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1987 | engines: {node: '>=12'} 1988 | dev: true 1989 | 1990 | /yargs@17.7.2: 1991 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1992 | engines: {node: '>=12'} 1993 | dependencies: 1994 | cliui: 8.0.1 1995 | escalade: 3.1.1 1996 | get-caller-file: 2.0.5 1997 | require-directory: 2.1.1 1998 | string-width: 4.2.3 1999 | y18n: 5.0.8 2000 | yargs-parser: 21.1.1 2001 | dev: true 2002 | 2003 | /yn@3.1.1: 2004 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 2005 | engines: {node: '>=6'} 2006 | dev: true 2007 | 2008 | /yocto-queue@0.1.0: 2009 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2010 | engines: {node: '>=10'} 2011 | dev: true 2012 | --------------------------------------------------------------------------------