├── .gitignore ├── README.md ├── favicon.ico ├── index.html ├── inject.sb3 ├── package.json ├── src ├── app.tsx ├── components │ ├── about.tsx │ ├── analyze_result.tsx │ ├── progress.tsx │ ├── speed_display.tsx │ ├── upload_file.tsx │ └── visibility.tsx ├── main.tsx ├── preact.d.ts ├── utils │ ├── analyzer.ts │ ├── ast.ts │ ├── ast_info.ts │ ├── chart.ts │ ├── inject_sb3.ts │ ├── injections.ts │ ├── sb3json.ts │ ├── sb3loader.ts │ ├── side_effect.ts │ ├── speed_analyzer.tsx │ └── speed_info.ts └── vite-env.d.ts ├── style.css ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Scratch Analyzer 2 | a simple scratch project analyzer and profiler 3 | 4 | ## How to use 5 | 1. Visit [scratch-analyzer.netlify.app](scratch-analyzer.netlify.app) or [scratch-analyzer.vercel.app](scratch-analyzer.vercel.app), also you can download the source and run `yarn && yarn dev` 6 | 2. Click `Upload Source` button to upload your scratch project, then it'll start to analyze and automatic download a modified sb3 file 7 | 3. Load the modified sb3 file in your favorate Scratch editor and click the green flag, after a while you can stop the project and save 8 | 4. Click `Upload Marked` button and upload the modified file you just saved and wait for it to analyze 9 | 5. Enjoy :) -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukitai/scratch_analyzer/da66d2f773cd5d9ba78fa794dea4ddb9e7ebdee0/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Scratch Analyzer 8 | 9 | 10 | 11 |
12 | 13 | 14 | -------------------------------------------------------------------------------- /inject.sb3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yukitai/scratch_analyzer/da66d2f773cd5d9ba78fa794dea4ddb9e7ebdee0/inject.sb3 -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scratch_analyzer", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview", 10 | "check": "tsc" 11 | }, 12 | "dependencies": { 13 | "@unocss/preset-attributify": "^0.53.5", 14 | "@unocss/preset-uno": "^0.53.5", 15 | "autoprefixer": "^10.4.7", 16 | "chart.js": "^4.3.0", 17 | "file-saver": "^2.0.5", 18 | "jszip": "^3.10.1", 19 | "preact": "^10.5.15", 20 | "react-chartjs-2": "^5.2.0", 21 | "unocss": "^0.53.5" 22 | }, 23 | "devDependencies": { 24 | "@preact/preset-vite": "^2.1.5", 25 | "@types/file-saver": "^2.0.5", 26 | "typescript": "^4.5.4", 27 | "vite": "^2.9.9" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/app.tsx: -------------------------------------------------------------------------------- 1 | import { useState } from 'preact/hooks' 2 | 3 | import { saveAs } from 'file-saver' 4 | 5 | import { About } from './components/about' 6 | import { UploadFile } from "./components/upload_file" 7 | import { loadsb3 } from "./utils/sb3loader" 8 | import { AnalyzeDisplay } from './components/analyze_result' 9 | import { AnalyzeResult, Analyzer } from './utils/analyzer' 10 | import { SpeedAnalyzeResult, SpeedAnalyzer, SpeedRawData } from './utils/speed_analyzer' 11 | import { inject } from './utils/inject_sb3' 12 | import { SpeedAnalyzeDisplay } from './components/speed_display' 13 | 14 | export function App() { 15 | const [ analyzeResult, setAnalyzeResult ] = useState({ 16 | definions: [], 17 | events: [], 18 | warnings: [], 19 | notes: [], 20 | helps: [], 21 | } as AnalyzeResult) 22 | 23 | const [ speedAnalyzeResult, setSpeedAnalyzeResult ] = useState({ 24 | progress: -1, total: -1, 25 | } as SpeedAnalyzeResult) 26 | 27 | return ( 28 | <> 29 | 30 |
31 |
32 |

33 | Scratch Analyzer 34 |

35 | 36 | analyze your project and give some advices to improve 37 | 38 |
39 |
40 | { 42 | if (files.length === 0) { return } 43 | const file = files[0] 44 | 45 | setAnalyzeResult(prev => { return { 46 | definions: [], 47 | events: [], 48 | warnings: [], 49 | notes: [], 50 | helps: [], 51 | } }) 52 | 53 | loadsb3(file).then(([json, zip]) => { 54 | const injected = inject(json) 55 | console.log(injected) 56 | zip.file("project.json", JSON.stringify(injected)) 57 | zip.generateAsync({type:"blob"}) 58 | .then(function(content) { 59 | saveAs(content, "injected.sb3"); 60 | }); 61 | const analyzer = new Analyzer(json, analyzeResult, 62 | setAnalyzeResult) 63 | return analyzer.analyze() 64 | }).then().catch(console.error) 65 | }} /> 66 | 67 |
68 | 69 | { 71 | if (files.length === 0) { return } 72 | const file = files[0] 73 | 74 | setSpeedAnalyzeResult({ 75 | progress: -2, 76 | total: -2, 77 | }) 78 | 79 | loadsb3(file).then(([json]) => { 80 | const data = json.targets[0].lists["wVRq*^~#2T`usdQf9C;/"][1] 81 | const speed_analyzer = new SpeedAnalyzer(json, 82 | data as SpeedRawData, speedAnalyzeResult, 83 | setSpeedAnalyzeResult) 84 | return speed_analyzer.analyze() 85 | }).catch(console.error) 86 | }} /> 87 |
88 | 89 | 90 | 91 |
92 | 93 | ) 94 | } 95 | -------------------------------------------------------------------------------- /src/components/about.tsx: -------------------------------------------------------------------------------- 1 | export function About() { 2 | return ( 3 | <> 4 |
5 | 6 | 9 | 10 |
11 | 12 | ) 13 | } -------------------------------------------------------------------------------- /src/components/analyze_result.tsx: -------------------------------------------------------------------------------- 1 | import { AnalyzeResult } from "../utils/analyzer" 2 | import { get_active_block_count, get_block_stack_count, get_definion_count, get_sprite_count } from "../utils/ast_info" 3 | import { Visibility } from "./visibility" 4 | 5 | type AnalyzeDisplayProps = { 6 | result: AnalyzeResult, 7 | } 8 | 9 | export function AnalyzeDisplay(props: AnalyzeDisplayProps) { 10 | const { definions, events, warnings, 11 | notes, helps, ast } = props.result 12 | return ( 13 | <> 14 | 15 |
16 | {ast && (<> 17 |

AST Informations

18 |
19 |
20 | Sprites: 21 | {get_sprite_count(ast!)} 22 | + 1 23 |
24 |
25 | Definions: 26 | {get_definion_count(ast!)} 27 | 28 |
29 |
30 | BlockStacks: 31 | {get_block_stack_count(ast!)} 32 | 33 |
34 |
35 | ActiveBlocks: 36 | {get_active_block_count(ast!)} 37 | 38 |
39 |
40 | )} 41 |
42 |
43 | 0}> 44 | 50 | 51 | 0}> 52 | 58 | 59 | 0}> 60 |
61 |

Warnings

62 | { warnings.map(item => ( 63 |
64 | 65 | { item.msg } 66 | {item.loc && (<> 67 | at 68 | { item.loc } 69 | 70 | )} 71 |
72 | )) } 73 |
74 |
75 | 0}> 76 |
77 |

Notes

78 | { notes.map(item => ( 79 |
80 | 81 | { item.msg } 82 | {item.loc && (<> 83 | at 84 | { item.loc } 85 | 86 | )} 87 |
88 | )) } 89 |
90 |
91 | 0}> 92 |
93 |

Helps

94 | { helps.map(item => ( 95 |
96 | 97 | { item.msg } 98 | {item.loc && (<> 99 | at 100 | { item.loc } 101 | 102 | )} 103 |
104 | )) } 105 |
106 |
107 | 108 | ) 109 | } -------------------------------------------------------------------------------- /src/components/progress.tsx: -------------------------------------------------------------------------------- 1 | type ProgressProps = { 2 | max?: number, 3 | now?: number, 4 | } 5 | 6 | export function Progress(props: ProgressProps) { 7 | let { max, now } = props 8 | 9 | max = max === -2 ? undefined : max 10 | now = now === -2 ? undefined : now 11 | 12 | console.log(max, now) 13 | 14 | return ( 15 | <> 16 | {max === undefined || now === undefined ? ( 18 | ) : ()} 22 | 23 | ) 24 | } -------------------------------------------------------------------------------- /src/components/speed_display.tsx: -------------------------------------------------------------------------------- 1 | // @ts-nocheck 2 | 3 | import { useRef, useState } from "preact/hooks" 4 | import { SpeedAnalyzeResult } from "../utils/speed_analyzer" 5 | import { Visibility } from "./visibility" 6 | import { Progress } from "./progress" 7 | 8 | import { Bar, Line } from 'react-chartjs-2' 9 | import { speed_info } from "../utils/speed_info" 10 | import { get_chart_width, get_chart_height } from "../utils/chart" 11 | 12 | type SpeedAnalyzeDisplayProps = { 13 | result: SpeedAnalyzeResult, 14 | } 15 | 16 | export function SpeedAnalyzeDisplay(props: SpeedAnalyzeDisplayProps) { 17 | const { result, progress, total } = props.result 18 | 19 | const [ curr_tick, set_curr_tick ] = useState(0) 20 | 21 | const [ raw, set_raw ] = useState("") 22 | 23 | const rangeRef = useRef(null) 24 | 25 | function get_tick_data(tid: number) { 26 | const fc = result!.ticks[tid].fn_call 27 | 28 | const labels = Object.keys(fc) 29 | let data = [] 30 | 31 | labels.sort((a, b) => fc[b] - fc[a]) 32 | 33 | for (const k of labels) { 34 | data.push(fc[k]) 35 | } 36 | 37 | function get_color(percent: number): string { 38 | if (percent > 1000) { 39 | return "rgb(255, 99, 132)" 40 | } else if (percent > 400) { 41 | return "rgb(255, 205, 86)" 42 | } else { 43 | return "rgb(54, 162, 235)" 44 | } 45 | } 46 | 47 | const res = { 48 | labels, 49 | datasets: [ 50 | { 51 | label: `tick ${tid}`, 52 | data, 53 | backgroundColor: data.map(it => { 54 | return get_color(it as number) 55 | }), 56 | hoverOffset: 4, 57 | }, 58 | ], 59 | } 60 | 61 | return res 62 | } 63 | 64 | function get_total_data() { 65 | let fc: {[key: string]: number } = {} 66 | 67 | for (const tick of result!.ticks) { 68 | for (const k in tick.fn_call) { 69 | fc[k] = (fc[k] ?? 0) + tick.fn_call[k] 70 | } 71 | } 72 | 73 | const labels = Object.keys(fc) 74 | let data = [] 75 | 76 | labels.sort((a, b) => fc[b] - fc[a]) 77 | 78 | for (const k of labels) { 79 | data.push(fc[k]) 80 | } 81 | 82 | function get_color(percent: number): string { 83 | if (percent > 1000) { 84 | return "rgb(255, 99, 132)" 85 | } else if (percent > 400) { 86 | return "rgb(255, 205, 86)" 87 | } else { 88 | return "rgb(54, 162, 235)" 89 | } 90 | } 91 | 92 | const res = { 93 | labels, 94 | datasets: [ 95 | { 96 | label: `total ${result!.ticks.length} ticks`, 97 | data, 98 | backgroundColor: data.map(it => { 99 | return get_color(it as number) 100 | }), 101 | hoverOffset: 4, 102 | }, 103 | ], 104 | } 105 | 106 | return res 107 | } 108 | 109 | function get_cost_data() { 110 | const fc = result!.fn_cost 111 | 112 | /*for (const k in fc) { 113 | if (fc[k] === 0) { 114 | fc[k] = 0.001 115 | } 116 | }*/ 117 | 118 | const labels = Object.keys(fc) 119 | let data = [] 120 | 121 | labels.sort((a, b) => fc[b] - fc[a]) 122 | 123 | for (const k of labels) { 124 | data.push(fc[k]) 125 | } 126 | 127 | // labels.push("other") 128 | // data.push(deleted.reduce((p, c) => (fc[p] as number) + (fc[c] as number)), 0) 129 | 130 | function get_color(percent: number): string { 131 | if (percent > 0.4) { 132 | return "rgb(255, 99, 132)" 133 | } else if (percent > 0.15) { 134 | return "rgb(255, 205, 86)" 135 | } else { 136 | return "rgb(54, 162, 235)" 137 | } 138 | } 139 | 140 | const total = data.reduce((p, c) => (p as number) + (c as number), 0) 141 | 142 | const res = { 143 | labels, 144 | datasets: [ 145 | { 146 | label: "definition cost", 147 | data, 148 | backgroundColor: data.map(it => { 149 | return get_color((it as number) / (total as number)) 150 | }), 151 | hoverOffset: 4, 152 | }, 153 | ], 154 | } 155 | 156 | return res 157 | } 158 | 159 | function get_total_tcost_data() { 160 | const labels = Object.keys(result!.ticks) 161 | 162 | let data = [ 0, 0 ] 163 | for (let i = 2; i < result.ticks.length; ++i) { 164 | data.push(result.ticks[i].t - result.ticks[i - 1].t) 165 | } 166 | 167 | const res = { 168 | labels, 169 | datasets: [ 170 | { 171 | label: "tick cost", 172 | data, 173 | fill: false, 174 | borderColor: '#fefefe', 175 | tension: 0, 176 | }, 177 | ], 178 | } 179 | 180 | return res 181 | } 182 | 183 | return ( 184 | <> 185 | {raw !== "" && ( 186 | 187 |
set_raw("")}> 188 | 193 |
194 |
195 |
{raw}
196 |
197 |
198 | )} 199 | 200 | <> 201 | 202 | 203 | 204 | 205 | <> 206 | { result !== undefined && (
207 |

208 | Definition Costs (ms) 209 | 216 |

217 | 230 | 231 |

232 | Total 233 |

234 | 247 | 248 |

249 | Tick Costs 250 |

251 | 264 | 265 |

266 | 267 | Tick {curr_tick} 268 | 269 | set_curr_tick(parseInt(rangeRef.current?.value ?? "0"))} 271 | max={result.ticks.length - 1} ref={rangeRef} 272 | class="style-range w-sm float-right mt-2" /> 273 |

274 | 287 |
) } 288 | 289 |
290 | 291 | ) 292 | } -------------------------------------------------------------------------------- /src/components/upload_file.tsx: -------------------------------------------------------------------------------- 1 | type UploadFileProps = { 2 | id: string, 3 | title: string 4 | accept?: string, 5 | onLoad: (files: FileList) => void, 6 | }; 7 | 8 | export function UploadFile(props: UploadFileProps) { 9 | const { id, accept, title, onLoad } = props; 10 | 11 | return ( 12 | <> 13 | { 15 | const files = window[id as keyof Window].files as FileList 16 | onLoad(files) 17 | }}/> 18 | 25 | 26 | ) 27 | } -------------------------------------------------------------------------------- /src/components/visibility.tsx: -------------------------------------------------------------------------------- 1 | import { JSX } from "preact" 2 | 3 | type VisibilityProps = { 4 | show: boolean, 5 | children: JSX.Element, 6 | } 7 | 8 | export function Visibility(props: VisibilityProps) { 9 | const { show, children } = props 10 | return ( 11 | <> 12 |
14 | { children } 15 |
16 | 17 | ) 18 | } -------------------------------------------------------------------------------- /src/main.tsx: -------------------------------------------------------------------------------- 1 | import { render } from 'preact' 2 | import { App } from './app' 3 | 4 | import { ArcElement, PointElement, BarElement, LinearScale, RadialLinearScale, CategoryScale, Chart, LineElement } from 'chart.js' 5 | 6 | Chart.register(ArcElement) 7 | Chart.register(RadialLinearScale) 8 | Chart.register(LinearScale) 9 | Chart.register(CategoryScale) 10 | Chart.register(BarElement) 11 | Chart.register(PointElement) 12 | Chart.register(LineElement) 13 | 14 | import 'uno.css' 15 | 16 | render(, document.getElementById('app')!) 17 | -------------------------------------------------------------------------------- /src/preact.d.ts: -------------------------------------------------------------------------------- 1 | import JSX = preact.JSX 2 | -------------------------------------------------------------------------------- /src/utils/analyzer.ts: -------------------------------------------------------------------------------- 1 | import { StateUpdater } from "preact/hooks" 2 | 3 | import { AstFile, AstBuilder, AstBlock, AstInput, AstBlockStack, AstBlocks, AstTarget } from "./ast" 4 | import { ScratchJson } from "./sb3json" 5 | import { no_side_effect_opcode } from "./side_effect" 6 | 7 | type Sb3Location = string 8 | 9 | type AnalyzeDefinion = { 10 | proccode: string, 11 | id: string, 12 | } 13 | type AnalyzeEvent = { 14 | opcode: string, 15 | id: string, 16 | } 17 | type AnalyzeWarning = { 18 | msg: string, 19 | loc?: Sb3Location, 20 | } 21 | type AnalyzeNote = { 22 | msg: string, 23 | loc?: Sb3Location, 24 | } 25 | type AnalyzeHelp = { 26 | msg: string, 27 | loc?: Sb3Location, 28 | } 29 | 30 | type AnalyzeResult = { 31 | definions: AnalyzeDefinion[], 32 | events: AnalyzeEvent[], 33 | warnings: AnalyzeWarning[], 34 | notes: AnalyzeNote[], 35 | helps: AnalyzeHelp[], 36 | ast?: AstFile, 37 | } 38 | 39 | export const num_regex = 40 | /^(#[0-9a-fA-F]+)|(-?((0o?[0-7]+)|(0x[0-9a-fA-F]+)|((([0-9]*\.[0-9]+)|([0-9]+))(e[\+\-][0-9]+)?)))$/ 41 | 42 | export class Analyzer { 43 | json: ScratchJson 44 | ast?: AstFile 45 | result: AnalyzeResult 46 | setResult: StateUpdater 47 | 48 | constructor(json: ScratchJson, result: AnalyzeResult, 49 | setResult: StateUpdater) { 50 | this.json = json 51 | this.result = result 52 | this.setResult = setResult 53 | } 54 | 55 | private warn(item: AnalyzeWarning) { 56 | this.setResult(prev => { return { 57 | definions: prev.definions, 58 | events: prev.events, 59 | warnings: [ 60 | ...prev.warnings, 61 | item, 62 | ], 63 | notes: prev.notes, 64 | helps: prev.helps, 65 | ast: prev.ast, 66 | } }) 67 | } 68 | 69 | private note(item: AnalyzeNote) { 70 | this.setResult(prev => { return { 71 | definions: prev.definions, 72 | events: prev.events, 73 | warnings: prev.warnings, 74 | notes: [ 75 | ...prev.notes, 76 | item, 77 | ], 78 | helps: prev.helps, 79 | ast: prev.ast, 80 | } }) 81 | } 82 | 83 | private help(item: AnalyzeHelp) { 84 | this.setResult(prev => { return { 85 | definions: prev.definions, 86 | events: prev.events, 87 | warnings: prev.warnings, 88 | notes: prev.notes, 89 | helps: [ 90 | ...prev.helps, 91 | item, 92 | ], 93 | ast: prev.ast, 94 | } }) 95 | } 96 | 97 | _is_input_const(input: AstInput): boolean { 98 | switch (input.type) { 99 | case "num": 100 | case "boolean": 101 | case "broadcast": 102 | case "num_or_str": 103 | return true 104 | case "block": 105 | return this.is_bs_const(input.value as AstBlocks) 106 | case "variable": 107 | return false 108 | case "list": 109 | return false 110 | } 111 | } 112 | 113 | is_bs_const(bs: AstBlocks): boolean { 114 | if (bs.blocks.length > 1 || bs.blocks.length === 0) { return false } 115 | for (const block of bs.blocks) { 116 | this.is_const(block) 117 | } 118 | return this.is_const(bs.blocks[0]) 119 | } 120 | 121 | is_const(block: AstBlock): boolean { 122 | if (block.isConst) { return block.isConst } 123 | if (!no_side_effect_opcode.includes(block.opcode)) { 124 | block.isConst = false 125 | return false 126 | } 127 | for (const k of Object.keys(block.inputs)) { 128 | const input = block.inputs[k] 129 | if (!k.startsWith("SUBSTACK") && !this._is_input_const(input)) { 130 | block.isConst = false 131 | return false 132 | } 133 | } 134 | block.isConst = true 135 | return true 136 | } 137 | 138 | async build_ast() { 139 | const builder = new AstBuilder() 140 | this.ast = builder.build_ast(this.json) 141 | this.setResult(prev => { return { 142 | definions: prev.definions, 143 | events: prev.events, 144 | warnings: prev.warnings, 145 | notes: prev.notes, 146 | helps: prev.helps, 147 | ast: this.ast, 148 | } }) 149 | } 150 | 151 | private _find_input_unused(input: AstInput, 152 | vars: string[], lists: string[]) { 153 | let idx 154 | switch (input.type) { 155 | case "variable": 156 | idx = vars.indexOf(input.value as string) 157 | if (idx !== -1) { 158 | vars[idx] = "" 159 | } 160 | break 161 | case "list": 162 | idx = lists.indexOf(input.value as string) 163 | if (idx !== -1) { 164 | lists[idx] = "" 165 | } 166 | break 167 | case "block": 168 | this._find_blocks_unused(input.value as AstBlocks, 169 | vars, lists) 170 | break 171 | default: 172 | break 173 | } 174 | } 175 | 176 | private _find_block_unused(block: AstBlock, 177 | vars: string[], lists: string[]) { 178 | let idx 179 | switch (block.opcode) { 180 | case "data_itemoflist": 181 | case "data_itemnumoflist": 182 | case "data_lengthoflist": 183 | case "data_listcontainsitem": 184 | idx = lists.indexOf(block.inputs["LIST"].value as string) 185 | if (idx !== -1) { 186 | lists[idx] = "" 187 | } 188 | break 189 | } 190 | for (const input of Object.values(block.inputs)) { 191 | this._find_input_unused(input, vars, lists) 192 | } 193 | } 194 | 195 | private _find_blocks_unused(blocks: AstBlocks, 196 | vars: string[], lists: string[]) { 197 | for (const block of blocks.blocks) { 198 | this._find_block_unused(block, vars, lists) 199 | } 200 | } 201 | 202 | async find_unused() { 203 | for (const idx in this.ast!.targets) { 204 | const target = this.ast!.targets[idx] 205 | const jtarget = this.json.targets[idx] 206 | if (jtarget.isStage) { continue } 207 | const vars = Object.keys(jtarget.variables) 208 | const lists = Object.keys(jtarget.lists) 209 | for (const bs of target.block_stacks) { 210 | this._find_blocks_unused(bs as AstBlocks, vars, lists) 211 | } 212 | for (const vname of vars) { 213 | if (vname === "") { return } 214 | this.warn({ 215 | msg: `unused variable \`${jtarget.variables[vname][0]}\``, 216 | loc: `??? in \`${target.name}\``, 217 | }) 218 | } 219 | for (const vname of lists) { 220 | if (vname === "") { return } 221 | this.warn({ 222 | msg: `unused list \`${jtarget.lists[vname][0]}\``, 223 | loc: `??? in \`${target.name}\``, 224 | }) 225 | } 226 | } 227 | } 228 | 229 | private _find_input_unnecessary(target: AstTarget, input: AstInput) { 230 | switch (input.type) { 231 | case "block": 232 | this._find_blocks_unnecessary(target, input.value as AstBlocks) 233 | break 234 | default: 235 | break 236 | } 237 | } 238 | 239 | private _find_block_unnecessary(target: AstTarget, block: AstBlock) { 240 | let cond 241 | switch (block.opcode) { 242 | case "control_if": 243 | case "control_if_else": 244 | cond = block.inputs["CONDITION"] 245 | if (!cond || this._is_input_const(cond)) { 246 | this.warn({ 247 | msg: `unnecessary condition block`, 248 | loc: `\`${block.opcode}\` in \`${target.name}\`` 249 | }) 250 | } 251 | break 252 | default: 253 | break 254 | } 255 | for (const input of Object.values(block.inputs)) { 256 | this._find_input_unnecessary(target, input) 257 | } 258 | } 259 | 260 | private _find_blocks_unnecessary(target: AstTarget, blocks: AstBlocks) { 261 | for (const block of blocks.blocks) { 262 | this._find_block_unnecessary(target, block) 263 | } 264 | } 265 | 266 | async find_unnecessary() { 267 | for (const target of this.ast!.targets) { 268 | for (const bs of target.block_stacks) { 269 | this._find_blocks_unnecessary(target, bs as AstBlocks) 270 | } 271 | } 272 | } 273 | 274 | private _find_input_inv_type(target: AstTarget, parent: AstBlock, input: AstInput) { 275 | switch (input.type) { 276 | case "num": 277 | if (!num_regex.test(input.value as string)) { 278 | this.warn({ 279 | msg: `mismatched input type (\`${ 280 | input.value 281 | }\` cannot be convert to a number)`, 282 | loc: `\`${parent.opcode}\` in \`${target.name}\`` 283 | }) 284 | } 285 | break 286 | case "block": 287 | this._find_blocks_inv_type(target, input.value as AstBlocks) 288 | break 289 | default: 290 | break 291 | } 292 | } 293 | 294 | private _find_block_inv_type(target: AstTarget, block: AstBlock) { 295 | for (const input of Object.values(block.inputs)) { 296 | this._find_input_inv_type(target, block, input) 297 | } 298 | } 299 | 300 | private _find_blocks_inv_type(target: AstTarget, blocks: AstBlocks) { 301 | for (const block of blocks.blocks) { 302 | this._find_block_inv_type(target, block) 303 | } 304 | } 305 | 306 | async find_invailed_type() { 307 | for (const target of this.ast!.targets) { 308 | for (const bs of target.block_stacks) { 309 | this._find_blocks_inv_type(target, bs as AstBlocks) 310 | } 311 | } 312 | } 313 | 314 | private _find_input_const(target: AstTarget, input: AstInput) { 315 | switch (input.type) { 316 | case "block": 317 | if (this.is_bs_const(input.value as AstBlocks)) { 318 | this.warn({ 319 | msg: `constant block`, 320 | loc: `\`${ 321 | (input.value as AstBlocks).blocks[0].opcode 322 | }\` in \`${target.name}\`` 323 | }) 324 | return 325 | } 326 | this._find_blocks_const(target, input.value as AstBlocks) 327 | break 328 | default: 329 | break 330 | } 331 | } 332 | 333 | private _find_block_const(target: AstTarget, block: AstBlock) { 334 | if (block.isConst) { 335 | this.warn({ 336 | msg: `constant block`, 337 | loc: `\`${block.opcode}\` in \`${target.name}\`` 338 | }) 339 | return 340 | } 341 | for (const input of Object.values(block.inputs)) { 342 | this._find_input_const(target, input) 343 | } 344 | } 345 | 346 | private _find_blocks_const(target: AstTarget, blocks: AstBlocks) { 347 | for (const block of blocks.blocks) { 348 | this._find_block_const(target, block) 349 | } 350 | } 351 | 352 | async find_replacable() { 353 | for (const target of this.ast!.targets) { 354 | for (const bs of target.block_stacks) { 355 | if (this.is_bs_const(bs as AstBlocks)) { 356 | this.warn({ 357 | msg: `meaningless constant block stack`, 358 | loc: `\`${bs.event.opcode}\` in \`${target.name}\`` 359 | }) 360 | } 361 | this._find_blocks_const(target, bs as AstBlocks) 362 | } 363 | } 364 | } 365 | 366 | async analyze() { 367 | const start = Date.now() 368 | 369 | console.log(this.json) 370 | 371 | await this.build_ast() 372 | console.log(this.ast!) 373 | this.note({ msg: "analyzing replacable constant" }) 374 | await this.find_replacable() 375 | this.note({ msg: "analyzing unnecessary block" }) 376 | await this.find_unnecessary() 377 | this.note({ msg: "analyzing unused" }) 378 | await this.find_unused() 379 | this.note({ msg: "analyzing invailed argument" }) 380 | await this.find_invailed_type() 381 | 382 | const end = Date.now() 383 | this.note({ msg: `done in ${(end - start).toFixed(0)}ms` }) 384 | } 385 | } 386 | 387 | export type { 388 | AnalyzeDefinion, 389 | AnalyzeEvent, 390 | AnalyzeHelp, 391 | AnalyzeNote, 392 | AnalyzeResult, 393 | AnalyzeWarning, 394 | } -------------------------------------------------------------------------------- /src/utils/ast.ts: -------------------------------------------------------------------------------- 1 | import { ScratchBlock, ScratchBlocks, ScratchField, ScratchInput, ScratchInputType, ScratchJson, ScratchTarget, ScratchValue } from "./sb3json" 2 | 3 | export interface AstFile { 4 | targets: AstTarget[] 5 | } 6 | 7 | export interface AstTarget { 8 | name: string, 9 | vars: { [key: string]: Variable }, 10 | lists: { [key: string]: List }, 11 | broadcasts: { [key: string]: Broadcast }, 12 | block_stacks: AstBlockStack[], 13 | } 14 | 15 | export type Variable = { 16 | name: string, 17 | value: ScratchValue, 18 | } 19 | 20 | export type List = { 21 | name: string, 22 | value: ScratchValue[] 23 | } 24 | 25 | export type Broadcast = { 26 | name: string, 27 | } 28 | 29 | export interface AstBlockStack { 30 | event: AstEvent, 31 | blocks: AstBlock[], 32 | } 33 | 34 | export interface AstBlocks { 35 | blocks: AstBlock[], 36 | } 37 | 38 | export interface AstEvent { 39 | opcode: string, 40 | inputs: { [key: string]: AstInput }, 41 | } 42 | 43 | export interface AstBlock { 44 | isConst?: boolean, 45 | opcode: string, 46 | parent?: string | null, 47 | inputs: { [key: string]: AstInput }, 48 | } 49 | 50 | export type AstInputType = "num_or_str" | "broadcast" | 51 | "boolean" | "block" | "variable" | "list" | "num" 52 | 53 | export interface AstInput { 54 | isConst?: boolean, 55 | type: AstInputType, 56 | value: ScratchValue | AstBlocks, 57 | } 58 | 59 | export class AstBuilder { 60 | target?: ScratchTarget 61 | 62 | constructor() {} 63 | 64 | build_input(input: ScratchInput): AstInput { 65 | let value: ScratchInputType 66 | switch (input[0]) { 67 | case 1: 68 | value = input[1] 69 | break 70 | case 2: 71 | value = input[1] 72 | break 73 | case 3: 74 | value = input[1] 75 | break 76 | } 77 | if (typeof value === "string") { 78 | return { 79 | type: "block", 80 | value: this.build_blocks(this.target!.blocks[value]), 81 | } 82 | } 83 | if (!value) { 84 | return { 85 | type: "num_or_str", 86 | value: "", 87 | } 88 | } 89 | switch (value[0]) { 90 | case 4: 91 | case 5: 92 | case 6: 93 | case 7: 94 | case 8: 95 | case 9: 96 | return { 97 | type: "num", 98 | value: value[1], 99 | } 100 | case 10: 101 | return { 102 | type: "num_or_str", 103 | value: value[1], 104 | } 105 | case 11: 106 | return { 107 | type: "broadcast", 108 | value: value[2], 109 | } 110 | case 12: 111 | return { 112 | type: "variable", 113 | value: value[2], 114 | } 115 | case 13: 116 | return { 117 | type: "list", 118 | value: value[2], 119 | } 120 | } 121 | } 122 | 123 | build_inputs( 124 | inputs: { [key: string]: ScratchInput }, 125 | fields: { [key: string]: ScratchField }, 126 | ): { [key: string]: AstInput } { 127 | let result: { [key: string]: AstInput} = {} 128 | for (const k in inputs) { 129 | result[k] = this.build_input(inputs[k]) 130 | } 131 | for (const k in fields) { 132 | result[k] = { 133 | type: "num_or_str", 134 | value: fields[k][1], 135 | } 136 | } 137 | return result 138 | } 139 | 140 | build_ev_block(block: ScratchBlock): AstEvent { 141 | return { 142 | opcode: block.opcode, 143 | inputs: this.build_inputs(block.inputs, block.fields), 144 | } 145 | } 146 | 147 | build_block(block: ScratchBlock): AstBlock { 148 | return { 149 | opcode: block.opcode, 150 | parent: block.parent, 151 | inputs: this.build_inputs(block.inputs, block.fields), 152 | } 153 | } 154 | 155 | build_blocks(block: ScratchBlock): AstBlocks { 156 | let p = block 157 | let blocks: AstBlock[] = [ this.build_block(block) ] 158 | while (p.next) { 159 | p = this.target!.blocks[p.next] 160 | blocks.push(this.build_block(p)) 161 | } 162 | return { blocks } 163 | } 164 | 165 | build_block_stack(block: ScratchBlock): AstBlockStack { 166 | let p = block 167 | let blocks: AstBlock[] = [] 168 | while (p.next) { 169 | p = this.target!.blocks[p.next] 170 | blocks.push(this.build_block(p)) 171 | } 172 | return { event: this.build_ev_block(block), blocks } 173 | } 174 | 175 | build_block_stacks(blocks: ScratchBlocks): AstBlockStack[] { 176 | let block_stacks: AstBlockStack[] = [] 177 | for (const block of Object.values(blocks)) { 178 | if (block.topLevel && block.next) { 179 | block_stacks.push(this.build_block_stack(block)) 180 | } 181 | } 182 | return block_stacks 183 | } 184 | 185 | build_target(target: ScratchTarget): AstTarget { 186 | let vars: { [key: string]: Variable } = {} 187 | for (const k in target.variables) { 188 | const v = target.variables[k] 189 | vars[k] = { 190 | name: v[0], 191 | value: v[1], 192 | } 193 | } 194 | let lists: { [key: string]: List } = {} 195 | for (const k in target.lists) { 196 | const v = target.lists[k] 197 | lists[k] = { 198 | name: v[0], 199 | value: v[1], 200 | } 201 | } 202 | let broadcasts: { [key: string]: Broadcast } = {} 203 | for (const k in target.broadcasts) { 204 | const v = target.broadcasts[k] 205 | broadcasts[k] = { 206 | name: v, 207 | } 208 | } 209 | let block_stacks = this.build_block_stacks(target.blocks) 210 | return { 211 | name: target.name, 212 | vars, lists, broadcasts, block_stacks, 213 | } 214 | } 215 | 216 | build_ast(json: ScratchJson): AstFile { 217 | let targets: AstTarget[] = []; 218 | for (const target of json.targets) { 219 | this.target = target 220 | targets.push(this.build_target(target)) 221 | } 222 | return { targets } 223 | } 224 | } -------------------------------------------------------------------------------- /src/utils/ast_info.ts: -------------------------------------------------------------------------------- 1 | import { AstBlockStack, AstBlocks, AstFile, AstInput } from "./ast"; 2 | 3 | export function get_sprite_count(ast: AstFile): number { 4 | return ast.targets.length - 1 5 | } 6 | 7 | export function get_definion_count(ast: AstFile): number { 8 | let count = 0 9 | return count 10 | } 11 | 12 | export function get_block_stack_count(ast: AstFile): number { 13 | let count = 0 14 | for (const target of ast.targets) { 15 | count += target.block_stacks.length 16 | } 17 | return count 18 | } 19 | 20 | function get_block_count_of_input(input: AstInput): number { 21 | switch (input.type) { 22 | case "boolean": 23 | case "num_or_str": 24 | case "broadcast": 25 | case "num": 26 | return 0 27 | case "block": 28 | return get_block_count_of_blocks(input.value as AstBlocks) 29 | case "variable": 30 | return 1 31 | case "list": 32 | return 1 33 | } 34 | } 35 | 36 | function get_block_count_of_inputs(inputs: { [key: string]: AstInput }): number { 37 | let count = 0 38 | for (const input of Object.values(inputs)) { 39 | count += get_block_count_of_input(input) 40 | } 41 | return count 42 | } 43 | 44 | function get_block_count_of_block_stack(b: AstBlockStack): number { 45 | let count = 1 46 | for (const bl of b.blocks) { 47 | count += 1 + get_block_count_of_inputs(bl.inputs) 48 | } 49 | return count 50 | } 51 | 52 | function get_block_count_of_blocks(bs: AstBlocks): number { 53 | let count = 0 54 | for (const bl of bs.blocks) { 55 | count += 1 + get_block_count_of_inputs(bl.inputs) 56 | } 57 | return count 58 | } 59 | 60 | function get_block_count_of_block_stacks(bs: AstBlockStack[]): number { 61 | let count = 0 62 | for (const b of bs) { 63 | count += get_block_count_of_block_stack(b) 64 | } 65 | return count 66 | } 67 | 68 | export function get_active_block_count(ast: AstFile): number { 69 | let count = 0 70 | for (const target of ast.targets) { 71 | count += get_block_count_of_block_stacks(target.block_stacks) 72 | } 73 | return count 74 | } -------------------------------------------------------------------------------- /src/utils/chart.ts: -------------------------------------------------------------------------------- 1 | export function get_chart_width(): number { 2 | return Math.min(document.getElementById("app")!.scrollWidth, 800) 3 | } 4 | 5 | export function get_chart_height(): number { 6 | return get_chart_width() * 3 / 4 7 | } -------------------------------------------------------------------------------- /src/utils/inject_sb3.ts: -------------------------------------------------------------------------------- 1 | import { inject_call_mark, inject_call_unmark, injection_json, injection_list_delc, injection_stage } from "./injections"; 2 | import { ScratchJson } from "./sb3json"; 3 | 4 | export function inject(src: ScratchJson): ScratchJson { 5 | // inject list 6 | for (const k of Object.keys(injection_list_delc)) { 7 | src.targets[0].lists[k] = injection_list_delc[k] 8 | } 9 | // inject our marks definion into targets 10 | let i = 0 11 | 12 | function get_id(): string { 13 | return `$$scratch_analyzer_injected_i${i++}` 14 | } 15 | 16 | for (const target of src.targets) { 17 | // now let's mark it! 18 | for (const k of Object.keys(target.blocks)) { 19 | let block = target.blocks[k] 20 | if (block.opcode === "procedures_definition") { 21 | const proto = target.blocks[block.inputs["custom_block"][1] as string] 22 | const name = `${target.name}@${k}\$\$${(proto as any).mutation.proccode}` 23 | const id = get_id() 24 | const inject_block = inject_call_mark(name, k, block.next) 25 | if (block.next) { 26 | target.blocks[block.next].parent = id 27 | } 28 | block.next = id 29 | target.blocks[id] = inject_block 30 | while (block.next) { 31 | block = target.blocks[block.next] 32 | } 33 | const last_bid = target.blocks[block.parent!].next 34 | const id2 = get_id() 35 | const inject_block2 = 36 | inject_call_unmark(name, last_bid, null) 37 | block.next = id2 38 | target.blocks[id2] = inject_block2 39 | } 40 | } 41 | for (const k of Object.keys(injection_json.blocks)) { 42 | target.blocks[k] = injection_json.blocks[k] 43 | } 44 | if (target.isStage) { 45 | for (const k of Object.keys(injection_stage.blocks)) { 46 | target.blocks[k] = injection_stage.blocks[k] 47 | } 48 | } 49 | } 50 | return src 51 | } -------------------------------------------------------------------------------- /src/utils/injections.ts: -------------------------------------------------------------------------------- 1 | import { ScratchBlock } from "./sb3json" 2 | 3 | const shadow = false 4 | 5 | export const injection_json: any = { 6 | "blocks": { 7 | "scratch_analyzer_injected_d": { 8 | "opcode": "procedures_definition", 9 | "next": "scratch_analyzer_injected_e", 10 | "parent": null, 11 | "inputs": { 12 | "custom_block": [ 13 | 1, 14 | "scratch_analyzer_injected_f" 15 | ] 16 | }, 17 | "fields": {}, 18 | "shadow": shadow, 19 | "topLevel": true, 20 | "scratch_analyzer_injected_x": -45, 21 | "scratch_analyzer_injected_y": -787 22 | }, 23 | "scratch_analyzer_injected_f": { 24 | "opcode": "procedures_prototype", 25 | "next": null, 26 | "parent": "scratch_analyzer_injected_d", 27 | "inputs": { 28 | "AgxUbSMH6VM|WE[)e-uH": [ 29 | 1, 30 | "scratch_analyzer_injected_o" 31 | ] 32 | }, 33 | "fields": {}, 34 | "shadow": true, 35 | "topLevel": false, 36 | "mutation": { 37 | "tagName": "mutation", 38 | "children": [], 39 | "proccode": "36f8hj43a_mark %s", 40 | "argumentids": "[\"AgxUbSMH6VM|WE[)e-uH\"]", 41 | "argumentnames": "[\"n\"]", 42 | "argumentdefaults": "[\"\"]", 43 | "warp": "true" 44 | } 45 | }, 46 | "scratch_analyzer_injected_o": { 47 | "opcode": "argument_reporter_string_number", 48 | "next": null, 49 | "parent": "scratch_analyzer_injected_f", 50 | "inputs": {}, 51 | "fields": { 52 | "VALUE": [ 53 | "n", 54 | null 55 | ] 56 | }, 57 | "shadow": true, 58 | "topLevel": false 59 | }, 60 | "scratch_analyzer_injected_a": { 61 | "opcode": "data_addtolist", 62 | "next": "scratch_analyzer_injected_g", 63 | "parent": "scratch_analyzer_injected_e", 64 | "inputs": { 65 | "ITEM": [ 66 | 3, 67 | "scratch_analyzer_injected_p", 68 | [ 69 | 10, 70 | "thing" 71 | ] 72 | ] 73 | }, 74 | "fields": { 75 | "LIST": [ 76 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 77 | "wVRq*^~#2T`usdQf9C;/" 78 | ] 79 | }, 80 | "shadow": shadow, 81 | "topLevel": false 82 | }, 83 | "scratch_analyzer_injected_p": { 84 | "opcode": "argument_reporter_string_number", 85 | "next": null, 86 | "parent": "scratch_analyzer_injected_a", 87 | "inputs": {}, 88 | "fields": { 89 | "VALUE": [ 90 | "n", 91 | null 92 | ] 93 | }, 94 | "shadow": shadow, 95 | "topLevel": false 96 | }, 97 | "scratch_analyzer_injected_e": { 98 | "opcode": "data_addtolist", 99 | "next": "scratch_analyzer_injected_a", 100 | "parent": "scratch_analyzer_injected_d", 101 | "inputs": { 102 | "ITEM": [ 103 | 1, 104 | [ 105 | 10, 106 | "start" 107 | ] 108 | ] 109 | }, 110 | "fields": { 111 | "LIST": [ 112 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 113 | "wVRq*^~#2T`usdQf9C;/" 114 | ] 115 | }, 116 | "shadow": shadow, 117 | "topLevel": false 118 | }, 119 | "scratch_analyzer_injected_g": { 120 | "opcode": "data_addtolist", 121 | "next": null, 122 | "parent": "scratch_analyzer_injected_a", 123 | "inputs": { 124 | "ITEM": [ 125 | 3, 126 | "scratch_analyzer_injected_r", 127 | [ 128 | 10, 129 | "thing" 130 | ] 131 | ] 132 | }, 133 | "fields": { 134 | "LIST": [ 135 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 136 | "wVRq*^~#2T`usdQf9C;/" 137 | ] 138 | }, 139 | "shadow": shadow, 140 | "topLevel": false 141 | }, 142 | "scratch_analyzer_injected_r": { 143 | "opcode": "sensing_dayssince2000", 144 | "next": null, 145 | "parent": "scratch_analyzer_injected_g", 146 | "inputs": {}, 147 | "fields": {}, 148 | "shadow": shadow, 149 | "topLevel": false 150 | }, 151 | "scratch_analyzer_injected_j": { 152 | "opcode": "procedures_definition", 153 | "next": "scratch_analyzer_injected_k", 154 | "parent": null, 155 | "inputs": { 156 | "custom_block": [ 157 | 1, 158 | "scratch_analyzer_injected_l" 159 | ] 160 | }, 161 | "fields": {}, 162 | "shadow": shadow, 163 | "topLevel": true, 164 | "scratch_analyzer_injected_x": -46, 165 | "scratch_analyzer_injected_y": -466 166 | }, 167 | "scratch_analyzer_injected_l": { 168 | "opcode": "procedures_prototype", 169 | "next": null, 170 | "parent": "scratch_analyzer_injected_j", 171 | "inputs": { 172 | "b@7k^nXe-$2*!)3^keOm": [ 173 | 1, 174 | "scratch_analyzer_injected_s" 175 | ] 176 | }, 177 | "fields": {}, 178 | "shadow": true, 179 | "topLevel": false, 180 | "mutation": { 181 | "tagName": "mutation", 182 | "children": [], 183 | "proccode": "36f8hj43a_unmark %s", 184 | "argumentids": "[\"b@7k^nXe-$2*!)3^keOm\"]", 185 | "argumentnames": "[\"n\"]", 186 | "argumentdefaults": "[\"\"]", 187 | "warp": "true" 188 | } 189 | }, 190 | "scratch_analyzer_injected_s": { 191 | "opcode": "argument_reporter_string_number", 192 | "next": null, 193 | "parent": "scratch_analyzer_injected_l", 194 | "inputs": {}, 195 | "fields": { 196 | "VALUE": [ 197 | "n", 198 | null 199 | ] 200 | }, 201 | "shadow": true, 202 | "topLevel": false 203 | }, 204 | "scratch_analyzer_injected_k": { 205 | "opcode": "data_addtolist", 206 | "next": "scratch_analyzer_injected_b", 207 | "parent": "scratch_analyzer_injected_j", 208 | "inputs": { 209 | "ITEM": [ 210 | 1, 211 | [ 212 | 10, 213 | "end" 214 | ] 215 | ] 216 | }, 217 | "fields": { 218 | "LIST": [ 219 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 220 | "wVRq*^~#2T`usdQf9C;/" 221 | ] 222 | }, 223 | "shadow": shadow, 224 | "topLevel": false 225 | }, 226 | "scratch_analyzer_injected_b": { 227 | "opcode": "data_addtolist", 228 | "next": "scratch_analyzer_injected_m", 229 | "parent": "scratch_analyzer_injected_k", 230 | "inputs": { 231 | "ITEM": [ 232 | 3, 233 | "scratch_analyzer_injected_t", 234 | [ 235 | 10, 236 | "thing" 237 | ] 238 | ] 239 | }, 240 | "fields": { 241 | "LIST": [ 242 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 243 | "wVRq*^~#2T`usdQf9C;/" 244 | ] 245 | }, 246 | "shadow": shadow, 247 | "topLevel": false 248 | }, 249 | "scratch_analyzer_injected_t": { 250 | "opcode": "argument_reporter_string_number", 251 | "next": null, 252 | "parent": "scratch_analyzer_injected_b", 253 | "inputs": {}, 254 | "fields": { 255 | "VALUE": [ 256 | "n", 257 | null 258 | ] 259 | }, 260 | "shadow": shadow, 261 | "topLevel": false 262 | }, 263 | "scratch_analyzer_injected_m": { 264 | "opcode": "data_addtolist", 265 | "next": null, 266 | "parent": "scratch_analyzer_injected_b", 267 | "inputs": { 268 | "ITEM": [ 269 | 3, 270 | "scratch_analyzer_injected_u", 271 | [ 272 | 10, 273 | "thing" 274 | ] 275 | ] 276 | }, 277 | "fields": { 278 | "LIST": [ 279 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 280 | "wVRq*^~#2T`usdQf9C;/" 281 | ] 282 | }, 283 | "shadow": shadow, 284 | "topLevel": false 285 | }, 286 | "scratch_analyzer_injected_u": { 287 | "opcode": "sensing_dayssince2000", 288 | "next": null, 289 | "parent": "scratch_analyzer_injected_m", 290 | "inputs": {}, 291 | "fields": {}, 292 | "shadow": shadow, 293 | "topLevel": false 294 | }, 295 | } 296 | } 297 | 298 | export const injection_stage: any = { 299 | blocks: { 300 | "scratch_analyzer_injected_q": { 301 | "opcode": "event_whenflagclicked", 302 | "next": "scratch_analyzer_injected_h", 303 | "parent": null, 304 | "inputs": {}, 305 | "fields": {}, 306 | "shadow": shadow, 307 | "topLevel": true, 308 | "scratch_analyzer_injected_x": -49, 309 | "scratch_analyzer_injected_y": -1192 310 | }, 311 | "scratch_analyzer_injected_h": { 312 | "opcode": "data_deletealloflist", 313 | "next": "scratch_analyzer_injected_i", 314 | "parent": "scratch_analyzer_injected_q", 315 | "inputs": {}, 316 | "fields": { 317 | "LIST": [ 318 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 319 | "wVRq*^~#2T`usdQf9C;/" 320 | ] 321 | }, 322 | "shadow": shadow, 323 | "topLevel": false 324 | }, 325 | "scratch_analyzer_injected_i": { 326 | "opcode": "control_forever", 327 | "next": null, 328 | "parent": "scratch_analyzer_injected_h", 329 | "inputs": { 330 | "SUBSTACK": [ 331 | 2, 332 | "scratch_analyzer_injected_n" 333 | ] 334 | }, 335 | "fields": {}, 336 | "shadow": shadow, 337 | "topLevel": false 338 | }, 339 | "scratch_analyzer_injected_n": { 340 | "opcode": "data_addtolist", 341 | "next": "scratch_analyzer_injected_c", 342 | "parent": "scratch_analyzer_injected_i", 343 | "inputs": { 344 | "ITEM": [ 345 | 1, 346 | [ 347 | 10, 348 | "tick" 349 | ] 350 | ] 351 | }, 352 | "fields": { 353 | "LIST": [ 354 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 355 | "wVRq*^~#2T`usdQf9C;/" 356 | ] 357 | }, 358 | "shadow": shadow, 359 | "topLevel": false 360 | }, 361 | "scratch_analyzer_injected_c": { 362 | "opcode": "data_addtolist", 363 | "next": "scratch_analyzer_injected_v", 364 | "parent": "scratch_analyzer_injected_n", 365 | "inputs": { 366 | "ITEM": [ 367 | 3, 368 | "scratch_analyzer_injected_w", 369 | [ 370 | 10, 371 | "thing" 372 | ] 373 | ] 374 | }, 375 | "fields": { 376 | "LIST": [ 377 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 378 | "wVRq*^~#2T`usdQf9C;/" 379 | ] 380 | }, 381 | "shadow": shadow, 382 | "topLevel": false 383 | }, 384 | "scratch_analyzer_injected_v": { 385 | "opcode": "data_addtolist", 386 | "next": "scratch_analyzer_injected_x", 387 | "parent": "scratch_analyzer_injected_c", 388 | "inputs": { 389 | "ITEM": [ 390 | 1, 391 | [ 392 | 10, 393 | "" 394 | ] 395 | ] 396 | }, 397 | "fields": { 398 | "LIST": [ 399 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 400 | "wVRq*^~#2T`usdQf9C;/" 401 | ] 402 | }, 403 | "shadow": shadow, 404 | "topLevel": false 405 | }, 406 | "scratch_analyzer_injected_x": { 407 | "opcode": "control_wait", 408 | "next": null, 409 | "parent": "scratch_analyzer_injected_v", 410 | "inputs": { 411 | "DURATION": [ 412 | 1, 413 | [ 414 | 5, 415 | "0" 416 | ] 417 | ] 418 | }, 419 | "fields": {}, 420 | "shadow": shadow, 421 | "topLevel": false 422 | }, 423 | "scratch_analyzer_injected_w": { 424 | "opcode": "sensing_dayssince2000", 425 | "next": null, 426 | "parent": "scratch_analyzer_injected_c", 427 | "inputs": {}, 428 | "fields": {}, 429 | "shadow": shadow, 430 | "topLevel": false 431 | }, 432 | } 433 | } 434 | 435 | export function inject_call_mark(arg: string, parent?: string | null, next?: string | null): ScratchBlock { 436 | return { 437 | "opcode": "procedures_call", 438 | "next": next ?? null, 439 | "parent": parent ?? null, 440 | "inputs": { 441 | "AgxUbSMH6VM|WE[)e-uH": [ 442 | 1, 443 | [ 444 | 10, 445 | arg 446 | ] 447 | ] 448 | }, 449 | "fields": {}, 450 | "shadow": false, 451 | "topLevel": false, 452 | "mutation": { 453 | "tagName": "mutation", 454 | "children": [], 455 | "proccode": "36f8hj43a_mark %s", 456 | "argumentids": "[\"AgxUbSMH6VM|WE[)e-uH\"]", 457 | "warp": "true" 458 | } 459 | } as ScratchBlock 460 | } 461 | 462 | export function inject_call_unmark(arg: string, parent?: string | null, next?: string | null): ScratchBlock { 463 | return { 464 | "opcode": "procedures_call", 465 | "next": next ?? null, 466 | "parent": parent ?? null, 467 | "inputs": { 468 | "b@7k^nXe-$2*!)3^keOm": [ 469 | 1, 470 | [ 471 | 10, 472 | arg 473 | ] 474 | ] 475 | }, 476 | "fields": {}, 477 | "shadow": false, 478 | "topLevel": false, 479 | "mutation": { 480 | "tagName": "mutation", 481 | "children": [], 482 | "proccode": "36f8hj43a_unmark %s", 483 | "argumentids": "[\"b@7k^nXe-$2*!)3^keOm\"]", 484 | "warp": "true" 485 | } 486 | } as ScratchBlock 487 | } 488 | 489 | export const injection_list_delc: any = { 490 | "wVRq*^~#2T`usdQf9C;/": [ 491 | "$A1H6D24JT563_SCRATCH_ANALYZER_SPEED_TEST", 492 | [] 493 | ] 494 | } -------------------------------------------------------------------------------- /src/utils/sb3json.ts: -------------------------------------------------------------------------------- 1 | export type ScratchValue = number | boolean | string 2 | 3 | export interface ScratchJson { 4 | targets: ScratchTarget[], 5 | } 6 | 7 | export type ScratchBlocks = { [key: string]: ScratchBlock } 8 | 9 | export interface ScratchTarget { 10 | isStage: boolean, 11 | name: string, 12 | blocks: ScratchBlocks, 13 | variables: { [key: string]: ScratchVariable }, 14 | lists: { [key: string]: ScratchList }, 15 | broadcasts: { [key: string]: string }, 16 | } 17 | 18 | export type ScratchVariable = [string, ScratchValue] 19 | export type ScratchList = [string, ScratchValue[]] 20 | 21 | export interface ScratchBlock { 22 | opcode: string, 23 | next?: string | null, 24 | parent?: string | null, 25 | shadow: boolean, 26 | topLevel: boolean, 27 | inputs: { [key: string]: ScratchInput }, 28 | fields: { [key: string]: ScratchField }, 29 | } 30 | 31 | export type ScratchNumberInput = [4 | 5 | 6 | 7, number] 32 | export type ScratchColorInput = [9, string] 33 | export type ScratchStringInput = [10, string] 34 | export type ScratchBroardcastInput = [11, string, string] 35 | export type ScratchVariableInput = [12, string, string, number, number] 36 | export type ScratchListInput = [13, string, string, number, number] 37 | export type ScratchAngleInput = [8, number] 38 | export type ScratchBlockInput = string 39 | 40 | export type ScratchInputType = ScratchNumberInput | 41 | ScratchColorInput | ScratchStringInput | 42 | ScratchBroardcastInput | ScratchVariableInput | 43 | ScratchListInput | ScratchAngleInput | 44 | ScratchBlockInput 45 | 46 | export type ScratchNoShadow = [2, ScratchInputType] 47 | export type ScratchShadow = [1, ScratchInputType] 48 | export type ScratchCoveredShadow = [3, ScratchInputType, ScratchInputType] 49 | 50 | export type ScratchShadowType = ScratchNoShadow | 51 | ScratchShadow | ScratchCoveredShadow 52 | 53 | export type ScratchInput = ScratchShadowType 54 | 55 | export type ScratchField = [string, string] -------------------------------------------------------------------------------- /src/utils/sb3loader.ts: -------------------------------------------------------------------------------- 1 | import JSZip from "jszip" 2 | import { ScratchJson } from "./sb3json" 3 | 4 | export async function loadsb3(file: File): Promise<[ScratchJson, JSZip]> { 5 | return new Promise((resolve, reject) => { 6 | const jszip = new JSZip() 7 | JSZip.loadAsync(file).then(async zip => { 8 | const projf = zip.files["project.json"] 9 | if (!projf) { 10 | alert("invailed sb3 file format: missing `project.json`") 11 | } 12 | const projc = zip.file(projf.name)!.async("string") 13 | return [ await projc, zip ] 14 | }).then(([ jstr, zip ]) => { 15 | const json = JSON.parse(jstr as string) 16 | resolve([json as ScratchJson, zip as JSZip]) 17 | }).catch(reject) 18 | }) 19 | } -------------------------------------------------------------------------------- /src/utils/side_effect.ts: -------------------------------------------------------------------------------- 1 | export const no_side_effect_opcode = [ 2 | "control_if", 3 | "control_if_else", 4 | "sensing_username", 5 | "operator_add", 6 | "operator_subtract", 7 | "operator_multiply", 8 | "operator_divide", 9 | "operator_gt", 10 | "operator_lt", 11 | "operator_equals", 12 | "operator_and", 13 | "operator_or", 14 | "operator_not", 15 | "operator_join", 16 | "operator_letter_of", 17 | "operator_length", 18 | "operator_contains", 19 | "operator_mod", 20 | "operator_round", 21 | "operator_mathop", 22 | ] -------------------------------------------------------------------------------- /src/utils/speed_analyzer.tsx: -------------------------------------------------------------------------------- 1 | import { StateUpdater } from "preact/hooks" 2 | import { ScratchJson } from "./sb3json" 3 | 4 | type SpeedAnalyzeResult = { 5 | result?: SpeedAnalyzeResultType, 6 | progress?: number | null, 7 | total?: number | null, 8 | } 9 | 10 | type SpeedAnalyzeResultType = { 11 | ticks: Ticks, 12 | fn_cost: FnCosts, 13 | } 14 | 15 | type Ticks = { 16 | t: number, 17 | fn_call: { [key: string]: number }, 18 | }[] 19 | 20 | type FnCosts = { [key: string]: number } 21 | 22 | type SpeedRawData = (string | number)[] 23 | 24 | export class SpeedAnalyzer { 25 | json: ScratchJson 26 | data: SpeedRawData 27 | result: SpeedAnalyzeResult 28 | setResult: StateUpdater 29 | 30 | constructor(json: ScratchJson, data: SpeedRawData, result: SpeedAnalyzeResult, 31 | setResult: StateUpdater) { 32 | this.json = json 33 | this.data = data 34 | this.result = result 35 | this.setResult = setResult 36 | } 37 | 38 | async analyze() { 39 | let ticks: Ticks = [{ t: 0, fn_call: {} }] 40 | let fn_cost: FnCosts = {} 41 | let call_stack = [] 42 | let i = 0 43 | 44 | const update = () => { 45 | this.setResult({ 46 | progress: i, total: this.data.length, 47 | }) 48 | } 49 | const updater = setInterval(update, 100) 50 | 51 | for (; i < this.data.length; i += 3) { 52 | const n = this.data[i + 1] 53 | switch (this.data[i]) { 54 | case "start": 55 | call_stack.push({ n: n as string, t: this.data[i + 2] as number }) 56 | break 57 | case "end": 58 | for (let j = call_stack.length - 1; j >= 0 ; --j) { 59 | if (call_stack[j].n === n) { 60 | let fc = ticks[ticks.length - 1].fn_call 61 | fc[n] = (fc[n] ?? 0) + 1 62 | fn_cost[n] = (fn_cost[n] ?? 0) + 63 | 86400000 * (this.data[i + 2] as number - call_stack[j].t) 64 | call_stack.splice(j, 1) 65 | break 66 | } 67 | } 68 | break 69 | case "tick": 70 | ticks.push({ t: 86400000 * (n as number), fn_call: {} }) 71 | break 72 | default: 73 | break 74 | } 75 | } 76 | 77 | clearInterval(updater) 78 | 79 | this.setResult(prev => { return { 80 | result: { ticks, fn_cost }, 81 | progress: -1, 82 | total: -1, 83 | } }) 84 | } 85 | } 86 | 87 | export type { 88 | SpeedAnalyzeResult, 89 | SpeedAnalyzeResultType, 90 | SpeedRawData, 91 | } -------------------------------------------------------------------------------- /src/utils/speed_info.ts: -------------------------------------------------------------------------------- 1 | import { SpeedAnalyzeResultType } from "./speed_analyzer" 2 | 3 | export function speed_info(result: SpeedAnalyzeResultType): string { 4 | let info = `total ${result.ticks.length} ticks cost: \n\n` 5 | 6 | let ticks: {[key: string]: number } = {} 7 | 8 | for (const tick of result.ticks) { 9 | for (const k in tick.fn_call) { 10 | ticks[k] = (ticks[k] ?? 0) + tick.fn_call[k] 11 | } 12 | } 13 | 14 | const sorted_k = Object.keys(result.fn_cost) 15 | .sort((a, b) => result.fn_cost[b] - result.fn_cost[a]) 16 | 17 | for (const k of sorted_k) { 18 | info += `definition \`${k}\`(${ticks[k]}) cost ${result.fn_cost[k].toFixed(0)}ms\n` 19 | } 20 | 21 | info += `\neach tick costs:\n\n` 22 | 23 | let tkeys = Object.keys(result.ticks) 24 | 25 | let tcosts: number[] = [ 0 ] 26 | for (let i = 1; i < result.ticks.length - 1; ++i) { 27 | tcosts.push(result.ticks[i + 1].t - result.ticks[i].t) 28 | } 29 | tcosts.push(0) 30 | 31 | tkeys.sort((a, b) => tcosts[b as unknown as number] - tcosts[a as unknown as number]) 32 | 33 | for (const k of tkeys) { 34 | const fc = Object.values(result.ticks[k as unknown as number].fn_call) 35 | const c = fc.reduce((p, c) => p + c, 0) 36 | const cost = tcosts[k as unknown as number] 37 | info += `tick ${k} costs ${cost.toFixed(0)}ms${cost > 4 ? `(avg. ${(1000 / cost).toFixed(0)} fps)` : ""}, runs ${c}(${fc.length}) definitions\n` 38 | } 39 | 40 | return info 41 | } -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --code-font: 'Ubuntu Mono', 'Courier New', Courier, monospace; 3 | } 4 | 5 | body { 6 | margin: 0; 7 | padding: 0 5rem; 8 | background-color: rgb(17, 24, 39); 9 | color: white; 10 | } 11 | 12 | @media screen and (max-width: 500px) { 13 | body { 14 | padding: 0 2rem; 15 | } 16 | } 17 | 18 | .subtitle { 19 | text-align: center; 20 | } 21 | 22 | .style-code { 23 | font-family: var(--code-font); 24 | } 25 | 26 | progress { 27 | position: relative; 28 | text-align: center; 29 | } 30 | 31 | progress.show_progress::after { 32 | content: attr(value) "/" attr(max); 33 | } 34 | 35 | progress::after { 36 | position: absolute; 37 | content: "Loading"; 38 | color: #545454; 39 | top: 1rem; 40 | font-family: var(--code-font); 41 | transform: translateX(-50%); 42 | } 43 | 44 | [type="range"] { 45 | -webkit-appearance: none; 46 | appearance: none; 47 | margin: 0; 48 | outline: 0; 49 | background-color: transparent; 50 | } 51 | [type="range"]::-webkit-slider-runnable-track { 52 | height: 1px; 53 | background-color: #777; 54 | } 55 | [type="range" i]::-webkit-slider-container { 56 | height: 20px; 57 | overflow: hidden; 58 | } 59 | [type="range"]::-webkit-slider-thumb { 60 | -webkit-appearance: none; 61 | appearance: none; 62 | width: 6px; 63 | height: 6px; 64 | border-radius: 3px; 65 | border: 1px solid transparent; 66 | margin-top: -2px; 67 | background-color: #f44336; 68 | /*border-image: linear-gradient(#f44336,#f44336) 0 fill / 8 20 8 0 / 0px 10px 0 2000px;*/ 69 | } 70 | 71 | progress { 72 | width: 200px; 73 | height: 4px; 74 | background-color: #232323; 75 | } 76 | 77 | progress::-webkit-progress-bar { 78 | background-color: #232323; 79 | } 80 | 81 | progress::-webkit-progress-value { 82 | background-color: white; 83 | } 84 | 85 | .dialog { 86 | border: none; 87 | box-shadow: 0 25px 50px -12px #00000040; 88 | border-radius: 0.5rem; 89 | font-family: "Comfortaa", cursive; 90 | padding: 3rem; 91 | margin: 2rem; 92 | backdrop-filter: blur(10px); 93 | background-color: #272733ea; 94 | color: #adadad; 95 | transition: 0.3s; 96 | } 97 | 98 | .dialog-container { 99 | vertical-align: middle; 100 | } 101 | 102 | .exit-btn { 103 | position: absolute; 104 | top: 1rem; 105 | right: 1rem; 106 | width: fit-content; 107 | height: fit-content; 108 | color: #dadada; 109 | transition: 0.2s; 110 | } 111 | 112 | .exit-btn:hover { 113 | cursor: pointer; 114 | color: #adadad; 115 | } 116 | 117 | .exit-btn { 118 | width: 2em; 119 | height: 2em; 120 | } 121 | 122 | .dialog:not([open]) { 123 | opacity: 0; 124 | visibility: hidden; 125 | display: block; 126 | scale: 0.3; 127 | } 128 | 129 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "preserve", 18 | "jsxFactory": "h", 19 | "jsxFragmentFactory": "Fragment" 20 | }, 21 | "include": ["src"], 22 | "references": [{ "path": "./tsconfig.node.json" }] 23 | } 24 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "esnext", 5 | "moduleResolution": "node" 6 | }, 7 | "include": ["vite.config.ts"] 8 | } 9 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | 3 | import preact from '@preact/preset-vite' 4 | 5 | import unocss from 'unocss/vite' 6 | import preset_uno from '@unocss/preset-uno' 7 | import preset_attr from '@unocss/preset-attributify' 8 | 9 | // https://vitejs.dev/config/ 10 | export default defineConfig({ 11 | plugins: [unocss({ presets: [ preset_uno(), preset_attr() ] }), preact()] 12 | }) 13 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.2.0", "@ampproject/remapping@^2.2.1": 6 | version "2.2.1" 7 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" 8 | integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.3.0" 11 | "@jridgewell/trace-mapping" "^0.3.9" 12 | 13 | "@antfu/install-pkg@^0.1.1": 14 | version "0.1.1" 15 | resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-0.1.1.tgz#157bb04f0de8100b9e4c01734db1a6c77e98bbb5" 16 | integrity sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ== 17 | dependencies: 18 | execa "^5.1.1" 19 | find-up "^5.0.0" 20 | 21 | "@antfu/utils@^0.7.2", "@antfu/utils@^0.7.4": 22 | version "0.7.5" 23 | resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-0.7.5.tgz#c36f37add92a7de57b9c29ae0c1f399706bff345" 24 | integrity sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg== 25 | 26 | "@babel/code-frame@^7.22.5": 27 | version "7.22.5" 28 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" 29 | integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== 30 | dependencies: 31 | "@babel/highlight" "^7.22.5" 32 | 33 | "@babel/compat-data@^7.22.9": 34 | version "7.22.9" 35 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" 36 | integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== 37 | 38 | "@babel/core@^7.22.1": 39 | version "7.22.9" 40 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" 41 | integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== 42 | dependencies: 43 | "@ampproject/remapping" "^2.2.0" 44 | "@babel/code-frame" "^7.22.5" 45 | "@babel/generator" "^7.22.9" 46 | "@babel/helper-compilation-targets" "^7.22.9" 47 | "@babel/helper-module-transforms" "^7.22.9" 48 | "@babel/helpers" "^7.22.6" 49 | "@babel/parser" "^7.22.7" 50 | "@babel/template" "^7.22.5" 51 | "@babel/traverse" "^7.22.8" 52 | "@babel/types" "^7.22.5" 53 | convert-source-map "^1.7.0" 54 | debug "^4.1.0" 55 | gensync "^1.0.0-beta.2" 56 | json5 "^2.2.2" 57 | semver "^6.3.1" 58 | 59 | "@babel/generator@^7.22.7", "@babel/generator@^7.22.9": 60 | version "7.22.9" 61 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" 62 | integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== 63 | dependencies: 64 | "@babel/types" "^7.22.5" 65 | "@jridgewell/gen-mapping" "^0.3.2" 66 | "@jridgewell/trace-mapping" "^0.3.17" 67 | jsesc "^2.5.1" 68 | 69 | "@babel/helper-annotate-as-pure@^7.22.5": 70 | version "7.22.5" 71 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" 72 | integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== 73 | dependencies: 74 | "@babel/types" "^7.22.5" 75 | 76 | "@babel/helper-compilation-targets@^7.22.9": 77 | version "7.22.9" 78 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" 79 | integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== 80 | dependencies: 81 | "@babel/compat-data" "^7.22.9" 82 | "@babel/helper-validator-option" "^7.22.5" 83 | browserslist "^4.21.9" 84 | lru-cache "^5.1.1" 85 | semver "^6.3.1" 86 | 87 | "@babel/helper-environment-visitor@^7.22.5": 88 | version "7.22.5" 89 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" 90 | integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== 91 | 92 | "@babel/helper-function-name@^7.22.5": 93 | version "7.22.5" 94 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" 95 | integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== 96 | dependencies: 97 | "@babel/template" "^7.22.5" 98 | "@babel/types" "^7.22.5" 99 | 100 | "@babel/helper-hoist-variables@^7.22.5": 101 | version "7.22.5" 102 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" 103 | integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== 104 | dependencies: 105 | "@babel/types" "^7.22.5" 106 | 107 | "@babel/helper-module-imports@^7.22.5": 108 | version "7.22.5" 109 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" 110 | integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== 111 | dependencies: 112 | "@babel/types" "^7.22.5" 113 | 114 | "@babel/helper-module-transforms@^7.22.9": 115 | version "7.22.9" 116 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" 117 | integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== 118 | dependencies: 119 | "@babel/helper-environment-visitor" "^7.22.5" 120 | "@babel/helper-module-imports" "^7.22.5" 121 | "@babel/helper-simple-access" "^7.22.5" 122 | "@babel/helper-split-export-declaration" "^7.22.6" 123 | "@babel/helper-validator-identifier" "^7.22.5" 124 | 125 | "@babel/helper-plugin-utils@^7.22.5": 126 | version "7.22.5" 127 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" 128 | integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== 129 | 130 | "@babel/helper-simple-access@^7.22.5": 131 | version "7.22.5" 132 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" 133 | integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== 134 | dependencies: 135 | "@babel/types" "^7.22.5" 136 | 137 | "@babel/helper-split-export-declaration@^7.22.6": 138 | version "7.22.6" 139 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" 140 | integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== 141 | dependencies: 142 | "@babel/types" "^7.22.5" 143 | 144 | "@babel/helper-string-parser@^7.22.5": 145 | version "7.22.5" 146 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" 147 | integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== 148 | 149 | "@babel/helper-validator-identifier@^7.22.5": 150 | version "7.22.5" 151 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" 152 | integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== 153 | 154 | "@babel/helper-validator-option@^7.22.5": 155 | version "7.22.5" 156 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" 157 | integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== 158 | 159 | "@babel/helpers@^7.22.6": 160 | version "7.22.6" 161 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" 162 | integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== 163 | dependencies: 164 | "@babel/template" "^7.22.5" 165 | "@babel/traverse" "^7.22.6" 166 | "@babel/types" "^7.22.5" 167 | 168 | "@babel/highlight@^7.22.5": 169 | version "7.22.5" 170 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" 171 | integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== 172 | dependencies: 173 | "@babel/helper-validator-identifier" "^7.22.5" 174 | chalk "^2.0.0" 175 | js-tokens "^4.0.0" 176 | 177 | "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": 178 | version "7.22.7" 179 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" 180 | integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== 181 | 182 | "@babel/plugin-syntax-jsx@^7.22.5": 183 | version "7.22.5" 184 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" 185 | integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== 186 | dependencies: 187 | "@babel/helper-plugin-utils" "^7.22.5" 188 | 189 | "@babel/plugin-transform-react-jsx-development@^7.16.7": 190 | version "7.22.5" 191 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" 192 | integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== 193 | dependencies: 194 | "@babel/plugin-transform-react-jsx" "^7.22.5" 195 | 196 | "@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.22.5": 197 | version "7.22.5" 198 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" 199 | integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== 200 | dependencies: 201 | "@babel/helper-annotate-as-pure" "^7.22.5" 202 | "@babel/helper-module-imports" "^7.22.5" 203 | "@babel/helper-plugin-utils" "^7.22.5" 204 | "@babel/plugin-syntax-jsx" "^7.22.5" 205 | "@babel/types" "^7.22.5" 206 | 207 | "@babel/template@^7.22.5": 208 | version "7.22.5" 209 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" 210 | integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== 211 | dependencies: 212 | "@babel/code-frame" "^7.22.5" 213 | "@babel/parser" "^7.22.5" 214 | "@babel/types" "^7.22.5" 215 | 216 | "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8": 217 | version "7.22.8" 218 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" 219 | integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== 220 | dependencies: 221 | "@babel/code-frame" "^7.22.5" 222 | "@babel/generator" "^7.22.7" 223 | "@babel/helper-environment-visitor" "^7.22.5" 224 | "@babel/helper-function-name" "^7.22.5" 225 | "@babel/helper-hoist-variables" "^7.22.5" 226 | "@babel/helper-split-export-declaration" "^7.22.6" 227 | "@babel/parser" "^7.22.7" 228 | "@babel/types" "^7.22.5" 229 | debug "^4.1.0" 230 | globals "^11.1.0" 231 | 232 | "@babel/types@^7.22.5": 233 | version "7.22.5" 234 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" 235 | integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== 236 | dependencies: 237 | "@babel/helper-string-parser" "^7.22.5" 238 | "@babel/helper-validator-identifier" "^7.22.5" 239 | to-fast-properties "^2.0.0" 240 | 241 | "@esbuild/linux-loong64@0.14.54": 242 | version "0.14.54" 243 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" 244 | integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== 245 | 246 | "@iconify/types@^2.0.0": 247 | version "2.0.0" 248 | resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" 249 | integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== 250 | 251 | "@iconify/utils@^2.1.7": 252 | version "2.1.7" 253 | resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.1.7.tgz#f6be175e08194925bf2cb091a8a3e36c88b8b636" 254 | integrity sha512-P8S3z/L1LcV4Qem9AoCfVAaTFGySEMzFEY4CHZLkfRj0Fv9LiR+AwjDgrDrzyI93U2L2mg9JHsbTJ52mF8suNw== 255 | dependencies: 256 | "@antfu/install-pkg" "^0.1.1" 257 | "@antfu/utils" "^0.7.4" 258 | "@iconify/types" "^2.0.0" 259 | debug "^4.3.4" 260 | kolorist "^1.8.0" 261 | local-pkg "^0.4.3" 262 | 263 | "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": 264 | version "0.3.3" 265 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" 266 | integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== 267 | dependencies: 268 | "@jridgewell/set-array" "^1.0.1" 269 | "@jridgewell/sourcemap-codec" "^1.4.10" 270 | "@jridgewell/trace-mapping" "^0.3.9" 271 | 272 | "@jridgewell/resolve-uri@3.1.0": 273 | version "3.1.0" 274 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" 275 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 276 | 277 | "@jridgewell/set-array@^1.0.1": 278 | version "1.1.2" 279 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" 280 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== 281 | 282 | "@jridgewell/sourcemap-codec@1.4.14": 283 | version "1.4.14" 284 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" 285 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 286 | 287 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.15": 288 | version "1.4.15" 289 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 290 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 291 | 292 | "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": 293 | version "0.3.18" 294 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" 295 | integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== 296 | dependencies: 297 | "@jridgewell/resolve-uri" "3.1.0" 298 | "@jridgewell/sourcemap-codec" "1.4.14" 299 | 300 | "@kurkle/color@^0.3.0": 301 | version "0.3.2" 302 | resolved "https://registry.yarnpkg.com/@kurkle/color/-/color-0.3.2.tgz#5acd38242e8bde4f9986e7913c8fdf49d3aa199f" 303 | integrity sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw== 304 | 305 | "@nodelib/fs.scandir@2.1.5": 306 | version "2.1.5" 307 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 308 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 309 | dependencies: 310 | "@nodelib/fs.stat" "2.0.5" 311 | run-parallel "^1.1.9" 312 | 313 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 314 | version "2.0.5" 315 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 316 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 317 | 318 | "@nodelib/fs.walk@^1.2.3": 319 | version "1.2.8" 320 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 321 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 322 | dependencies: 323 | "@nodelib/fs.scandir" "2.1.5" 324 | fastq "^1.6.0" 325 | 326 | "@polka/url@^1.0.0-next.20": 327 | version "1.0.0-next.21" 328 | resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" 329 | integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== 330 | 331 | "@preact/preset-vite@^2.1.5": 332 | version "2.5.0" 333 | resolved "https://registry.yarnpkg.com/@preact/preset-vite/-/preset-vite-2.5.0.tgz#6ff815558c16062a36e2d5da4b1225d7b216478d" 334 | integrity sha512-BUhfB2xQ6ex0yPkrT1Z3LbfPzjpJecOZwQ/xJrXGFSZD84+ObyS//41RdEoQCMWsM0t7UHGaujUxUBub7WM1Jw== 335 | dependencies: 336 | "@babel/plugin-transform-react-jsx" "^7.14.9" 337 | "@babel/plugin-transform-react-jsx-development" "^7.16.7" 338 | "@prefresh/vite" "^2.2.8" 339 | "@rollup/pluginutils" "^4.1.1" 340 | babel-plugin-transform-hook-names "^1.0.2" 341 | debug "^4.3.1" 342 | kolorist "^1.2.10" 343 | resolve "^1.20.0" 344 | 345 | "@prefresh/babel-plugin@0.5.0": 346 | version "0.5.0" 347 | resolved "https://registry.yarnpkg.com/@prefresh/babel-plugin/-/babel-plugin-0.5.0.tgz#61d8ef959007390077c9eddb7e9307c46e19277c" 348 | integrity sha512-joAwpkUDwo7ZqJnufXRGzUb+udk20RBgfA8oLPBh5aJH2LeStmV1luBfeJTztPdyCscC2j2SmZ/tVxFRMIxAEw== 349 | 350 | "@prefresh/core@^1.5.1": 351 | version "1.5.1" 352 | resolved "https://registry.yarnpkg.com/@prefresh/core/-/core-1.5.1.tgz#2f51c0dd509a7b302d67ee889815653abdf4c0d1" 353 | integrity sha512-e0mB0Oxtog6ZpKPDBYbzFniFJDIktuKMzOHp7sguntU+ot0yi6dbhJRE9Css1qf0u16wdSZjpL2W2ODWuU05Cw== 354 | 355 | "@prefresh/utils@^1.2.0": 356 | version "1.2.0" 357 | resolved "https://registry.yarnpkg.com/@prefresh/utils/-/utils-1.2.0.tgz#cbdfe549b207041e38bb6cc382408b30cd24fec8" 358 | integrity sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ== 359 | 360 | "@prefresh/vite@^2.2.8": 361 | version "2.4.1" 362 | resolved "https://registry.yarnpkg.com/@prefresh/vite/-/vite-2.4.1.tgz#c565ae2f8ec2c5ea03611969810dd02a779c2581" 363 | integrity sha512-vthWmEqu8TZFeyrBNc9YE5SiC3DVSzPgsOCp/WQ7FqdHpOIJi7Z8XvCK06rBPOtG4914S52MjG9Ls22eVAiuqQ== 364 | dependencies: 365 | "@babel/core" "^7.22.1" 366 | "@prefresh/babel-plugin" "0.5.0" 367 | "@prefresh/core" "^1.5.1" 368 | "@prefresh/utils" "^1.2.0" 369 | "@rollup/pluginutils" "^4.2.1" 370 | 371 | "@rollup/pluginutils@^4.1.1", "@rollup/pluginutils@^4.2.1": 372 | version "4.2.1" 373 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d" 374 | integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ== 375 | dependencies: 376 | estree-walker "^2.0.1" 377 | picomatch "^2.2.2" 378 | 379 | "@rollup/pluginutils@^5.0.2": 380 | version "5.0.2" 381 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" 382 | integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== 383 | dependencies: 384 | "@types/estree" "^1.0.0" 385 | estree-walker "^2.0.2" 386 | picomatch "^2.3.1" 387 | 388 | "@types/estree@^1.0.0": 389 | version "1.0.1" 390 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" 391 | integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== 392 | 393 | "@types/file-saver@^2.0.5": 394 | version "2.0.5" 395 | resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" 396 | integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ== 397 | 398 | "@unocss/astro@0.53.5": 399 | version "0.53.5" 400 | resolved "https://registry.yarnpkg.com/@unocss/astro/-/astro-0.53.5.tgz#38821740e21bcc9075d8548e71498628ef2810d9" 401 | integrity sha512-W4A0uIN4xAzVH6Vwf5ukG8rJpCeIwQZcpZPrEBWsqY5YcHZcLTFGMHcNmxyeG0qoXpXoxtvHyXXhgGU0BY5ZEw== 402 | dependencies: 403 | "@unocss/core" "0.53.5" 404 | "@unocss/reset" "0.53.5" 405 | "@unocss/vite" "0.53.5" 406 | 407 | "@unocss/cli@0.53.5": 408 | version "0.53.5" 409 | resolved "https://registry.yarnpkg.com/@unocss/cli/-/cli-0.53.5.tgz#4260216ba28de20e65a6d8b0e937498c5f988d34" 410 | integrity sha512-UKi+9BAKh3X5eM4pPQviXMOtN8JkQWKdGy/056rRLQysPB07VBwWr5gYAlJMMJ2wFAIthag43X5I8btQAicFkg== 411 | dependencies: 412 | "@ampproject/remapping" "^2.2.1" 413 | "@rollup/pluginutils" "^5.0.2" 414 | "@unocss/config" "0.53.5" 415 | "@unocss/core" "0.53.5" 416 | "@unocss/preset-uno" "0.53.5" 417 | cac "^6.7.14" 418 | chokidar "^3.5.3" 419 | colorette "^2.0.20" 420 | consola "^3.2.3" 421 | fast-glob "^3.3.0" 422 | magic-string "^0.30.1" 423 | pathe "^1.1.1" 424 | perfect-debounce "^1.0.0" 425 | 426 | "@unocss/config@0.53.5": 427 | version "0.53.5" 428 | resolved "https://registry.yarnpkg.com/@unocss/config/-/config-0.53.5.tgz#5b4166d8337bf98429c0e712b8d2f06f2becf368" 429 | integrity sha512-YtpWoIFB1V8Dp3KcVQqislQYQSSBYbjTpoVIkUGrpupwOz9+W1tfL2yKEENDiZc11crJSneGr04wsP2dI1ld0w== 430 | dependencies: 431 | "@unocss/core" "0.53.5" 432 | unconfig "^0.3.9" 433 | 434 | "@unocss/core@0.53.5": 435 | version "0.53.5" 436 | resolved "https://registry.yarnpkg.com/@unocss/core/-/core-0.53.5.tgz#26f987d26843903a689c3b83c024e6e6c9b72f4a" 437 | integrity sha512-jBvk4FeUAALAomGfMFFmrXLy01/5DjugdnWgawFAQpSToFTxbMHS7x+pXKu/18cq+YLS8uyl9S0Ywy1jNbfS3Q== 438 | 439 | "@unocss/extractor-arbitrary-variants@0.53.5": 440 | version "0.53.5" 441 | resolved "https://registry.yarnpkg.com/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.53.5.tgz#3e13784fcdb8d08e548c16e3ee4fec511ca07ff8" 442 | integrity sha512-rSS3Q8/+lEwxXfXzEOFuhAQGMpaaZcBAYDiNCYS/9BqKrTzhSYG82Qy80ISpqSZr0BTLET4X3dC6B6Rd4GU5vQ== 443 | dependencies: 444 | "@unocss/core" "0.53.5" 445 | 446 | "@unocss/inspector@0.53.5": 447 | version "0.53.5" 448 | resolved "https://registry.yarnpkg.com/@unocss/inspector/-/inspector-0.53.5.tgz#9f8cc8cbd6186fe5530c3824e9f85376c11c5c19" 449 | integrity sha512-gWUhgsoB3LyjIAdw6n/eMcLGmUNwuSTrgwcRubIDFhHOC5/E6ppdUQmS8a4oH4qjunfvBgoTHwcGlXvlvb3S5w== 450 | dependencies: 451 | gzip-size "^6.0.0" 452 | sirv "^2.0.3" 453 | 454 | "@unocss/postcss@0.53.5": 455 | version "0.53.5" 456 | resolved "https://registry.yarnpkg.com/@unocss/postcss/-/postcss-0.53.5.tgz#6b4583eecb1d1c03a8ef9b524ba1f860d254a448" 457 | integrity sha512-IfZl4GxrpegP/861bp3e0X3VcQJ9/M3VxC9UQ7zzxkOz/E8R09iMpbnznVLrTiLp2r96p5k/ggXLoadFm1FxGA== 458 | dependencies: 459 | "@unocss/config" "0.53.5" 460 | "@unocss/core" "0.53.5" 461 | css-tree "^2.3.1" 462 | fast-glob "^3.3.0" 463 | magic-string "^0.30.1" 464 | postcss "^8.4.25" 465 | 466 | "@unocss/preset-attributify@0.53.5", "@unocss/preset-attributify@^0.53.5": 467 | version "0.53.5" 468 | resolved "https://registry.yarnpkg.com/@unocss/preset-attributify/-/preset-attributify-0.53.5.tgz#7b12598fcd3895744e17fc4277480d2a185a6f9d" 469 | integrity sha512-0TJD9hVUWu0T4dtdURApyFiliqbckYYGZe2PZBgUrHCypbI0zq7k3MdXFYmIuYxqDPErJVm8rO9lwMpKfTsvuA== 470 | dependencies: 471 | "@unocss/core" "0.53.5" 472 | 473 | "@unocss/preset-icons@0.53.5": 474 | version "0.53.5" 475 | resolved "https://registry.yarnpkg.com/@unocss/preset-icons/-/preset-icons-0.53.5.tgz#bfd4289cb6fb1d5a1abff47ce82a0e74a7899e3d" 476 | integrity sha512-zlO0fLJiJtITta3BnE3y5Yc0hajjovCB/woos4MR5gvcFXHW9Hfy7pXuj90GvHLfaRj0JRWXa1WRaqJXS4tzOw== 477 | dependencies: 478 | "@iconify/utils" "^2.1.7" 479 | "@unocss/core" "0.53.5" 480 | ofetch "^1.1.1" 481 | 482 | "@unocss/preset-mini@0.53.5": 483 | version "0.53.5" 484 | resolved "https://registry.yarnpkg.com/@unocss/preset-mini/-/preset-mini-0.53.5.tgz#8192b9f11a50b3fc6b9de28272d26c06eee9f091" 485 | integrity sha512-aeVctTW0M41RXyCyQvhRawIh+ylhl7mlWfAjv7cP3ALvIRWbB6jUw1C8Ke6rU2vg0s0yaJKRuFPFmLMqGwzoSg== 486 | dependencies: 487 | "@unocss/core" "0.53.5" 488 | "@unocss/extractor-arbitrary-variants" "0.53.5" 489 | 490 | "@unocss/preset-tagify@0.53.5": 491 | version "0.53.5" 492 | resolved "https://registry.yarnpkg.com/@unocss/preset-tagify/-/preset-tagify-0.53.5.tgz#0eaa8f7d8946d50d7531242d6c730b6e2bb3c923" 493 | integrity sha512-0HpWU85Pz1RbFqf/QtlP992ISSqWZ3JT2rWI7ekBLai463ptdBUks/PfH22M+uBSwPig5XNJ0DtyS7hm8TEWhg== 494 | dependencies: 495 | "@unocss/core" "0.53.5" 496 | 497 | "@unocss/preset-typography@0.53.5": 498 | version "0.53.5" 499 | resolved "https://registry.yarnpkg.com/@unocss/preset-typography/-/preset-typography-0.53.5.tgz#03447c23f0cf6c80a8f2266abba60f14c9a702e9" 500 | integrity sha512-roZXiJ14wuXcpLN5YodAN1wKYlwCDJ8L/TQlUphyM487i0QbKwXAZg8dA1SWCQIl5V9Qcq/3EXAQmLnhRdwBMA== 501 | dependencies: 502 | "@unocss/core" "0.53.5" 503 | "@unocss/preset-mini" "0.53.5" 504 | 505 | "@unocss/preset-uno@0.53.5", "@unocss/preset-uno@^0.53.5": 506 | version "0.53.5" 507 | resolved "https://registry.yarnpkg.com/@unocss/preset-uno/-/preset-uno-0.53.5.tgz#7f63fa75d01fc5cdc5ca877d26bf80f149471f15" 508 | integrity sha512-DRJMBkSqfz0EOzf5cwefkPF8J6lNvrhBp4ztw9blewDc2wTQqL/lAj/I/nbyOdXhJUOxhj/qj7gJjsNZctud0A== 509 | dependencies: 510 | "@unocss/core" "0.53.5" 511 | "@unocss/preset-mini" "0.53.5" 512 | "@unocss/preset-wind" "0.53.5" 513 | 514 | "@unocss/preset-web-fonts@0.53.5": 515 | version "0.53.5" 516 | resolved "https://registry.yarnpkg.com/@unocss/preset-web-fonts/-/preset-web-fonts-0.53.5.tgz#1492f6a34e0a2c13c1120274dc8624cf87d8ace2" 517 | integrity sha512-yVkOOECyOQqahRGSefcBKtNYAUnYFqqFedGy0SBBjadPWn80vjVg7ojljKlJsgSQdrpcJ38wwWr3Oh4UWwBuQQ== 518 | dependencies: 519 | "@unocss/core" "0.53.5" 520 | ofetch "^1.1.1" 521 | 522 | "@unocss/preset-wind@0.53.5": 523 | version "0.53.5" 524 | resolved "https://registry.yarnpkg.com/@unocss/preset-wind/-/preset-wind-0.53.5.tgz#067a435ddb40bb5bde031f3c6817858e87b3d03b" 525 | integrity sha512-hSMF11Gx8oMDtePvXLmpArSNpQRHb098P8+qYpwvyNfS29i6agfjGBuIDk/f+j8mhqcfrEEuEmPIl2yojT9nxA== 526 | dependencies: 527 | "@unocss/core" "0.53.5" 528 | "@unocss/preset-mini" "0.53.5" 529 | 530 | "@unocss/reset@0.53.5": 531 | version "0.53.5" 532 | resolved "https://registry.yarnpkg.com/@unocss/reset/-/reset-0.53.5.tgz#11828cb82b7d1d32d72b6c430794d5825bf739c9" 533 | integrity sha512-tH8K4jw76mbWA67UUHKV6zxiwOsiG+byrHoG3lz8hr+cm6OgEJ3WjNNp7dZINmr7S7ylWO6igbxGQpsAuIQZCw== 534 | 535 | "@unocss/scope@0.53.5": 536 | version "0.53.5" 537 | resolved "https://registry.yarnpkg.com/@unocss/scope/-/scope-0.53.5.tgz#92b40f4abb8c8b16e9bbded7cbc398f78c097ee1" 538 | integrity sha512-KBwemWNJIbu3+BWp0X4o5ERN0/nzF7hXBnjYNSb0s8phrydC6oJrp52XYlIHHTe7O4KzwkqGgf/xOMXMFpviDg== 539 | 540 | "@unocss/transformer-attributify-jsx-babel@0.53.5": 541 | version "0.53.5" 542 | resolved "https://registry.yarnpkg.com/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.53.5.tgz#f5d550f0b6da96c54a7bfa0dba82355c05dedb68" 543 | integrity sha512-z9ar2IaZmcNVTZhK9ZuRUd3LqA/iUG/JMF0OA92RNclo8SazWdu7eJAdV86SHXqAf7eSB/t0evsde14DtEREjA== 544 | dependencies: 545 | "@unocss/core" "0.53.5" 546 | 547 | "@unocss/transformer-attributify-jsx@0.53.5": 548 | version "0.53.5" 549 | resolved "https://registry.yarnpkg.com/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.53.5.tgz#c87c581dc3cb3c28ae40971226aada2c10c385d7" 550 | integrity sha512-ynAElIi9DxtHyKCW+OXPcLxje2ghVzKo80eaAVRAdVpyawsjtE4iHWjHRbESkiTsHW5CiJupdXo2vx1obXFLnQ== 551 | dependencies: 552 | "@unocss/core" "0.53.5" 553 | 554 | "@unocss/transformer-compile-class@0.53.5": 555 | version "0.53.5" 556 | resolved "https://registry.yarnpkg.com/@unocss/transformer-compile-class/-/transformer-compile-class-0.53.5.tgz#f1f53093cdeeb2c195f87f4607e6842219930694" 557 | integrity sha512-7Z0/40T4EuHMGpXb2XlamkResaASMRm07csCl7REGUTg9ccDRWlnSLzGD8UUgKoygsmqXp2cxKMJLMb5YJ9LLA== 558 | dependencies: 559 | "@unocss/core" "0.53.5" 560 | 561 | "@unocss/transformer-directives@0.53.5": 562 | version "0.53.5" 563 | resolved "https://registry.yarnpkg.com/@unocss/transformer-directives/-/transformer-directives-0.53.5.tgz#e58bce7b08841bf041a9dad86a889a46899d172d" 564 | integrity sha512-u1OIZZUAXux9Q0mb58X3infxY2Iq6pY7uJB7IhMc2I1ntpyx875spwyvvfUHqOgIPTNR4XxfxKFGPHpjPNbNeQ== 565 | dependencies: 566 | "@unocss/core" "0.53.5" 567 | css-tree "^2.3.1" 568 | 569 | "@unocss/transformer-variant-group@0.53.5": 570 | version "0.53.5" 571 | resolved "https://registry.yarnpkg.com/@unocss/transformer-variant-group/-/transformer-variant-group-0.53.5.tgz#5d6e6baf27b521608bcf5d6cdc3eebd23547ad7f" 572 | integrity sha512-+xDx6JojGkcKwx87sX0y4xM/RuTI0QyPJAKebXUSyuKnctXrTH/p+WNGFIVWiY8suUMnnMesAZpw6O2Oln921w== 573 | dependencies: 574 | "@unocss/core" "0.53.5" 575 | 576 | "@unocss/vite@0.53.5": 577 | version "0.53.5" 578 | resolved "https://registry.yarnpkg.com/@unocss/vite/-/vite-0.53.5.tgz#dc136522d3e8f8eb6f69925fc458024d3456496b" 579 | integrity sha512-ez0MVRatewLUQq79LI+XRAVRbXWaGbK1K1ht2B8vGyL9OrL6uieEwzxjHV7+rUa8i+FEHfD4Ntmtdpb3WuQSAA== 580 | dependencies: 581 | "@ampproject/remapping" "^2.2.1" 582 | "@rollup/pluginutils" "^5.0.2" 583 | "@unocss/config" "0.53.5" 584 | "@unocss/core" "0.53.5" 585 | "@unocss/inspector" "0.53.5" 586 | "@unocss/scope" "0.53.5" 587 | "@unocss/transformer-directives" "0.53.5" 588 | chokidar "^3.5.3" 589 | fast-glob "^3.3.0" 590 | magic-string "^0.30.1" 591 | 592 | ansi-styles@^3.2.1: 593 | version "3.2.1" 594 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 595 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 596 | dependencies: 597 | color-convert "^1.9.0" 598 | 599 | anymatch@~3.1.2: 600 | version "3.1.3" 601 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 602 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 603 | dependencies: 604 | normalize-path "^3.0.0" 605 | picomatch "^2.0.4" 606 | 607 | autoprefixer@^10.4.7: 608 | version "10.4.14" 609 | resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" 610 | integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== 611 | dependencies: 612 | browserslist "^4.21.5" 613 | caniuse-lite "^1.0.30001464" 614 | fraction.js "^4.2.0" 615 | normalize-range "^0.1.2" 616 | picocolors "^1.0.0" 617 | postcss-value-parser "^4.2.0" 618 | 619 | babel-plugin-transform-hook-names@^1.0.2: 620 | version "1.0.2" 621 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz#0d75c2d78e8bbcdb258241131562b9cf07f010f3" 622 | integrity sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw== 623 | 624 | binary-extensions@^2.0.0: 625 | version "2.2.0" 626 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 627 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 628 | 629 | braces@^3.0.2, braces@~3.0.2: 630 | version "3.0.2" 631 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 632 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 633 | dependencies: 634 | fill-range "^7.0.1" 635 | 636 | browserslist@^4.21.5, browserslist@^4.21.9: 637 | version "4.21.9" 638 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" 639 | integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== 640 | dependencies: 641 | caniuse-lite "^1.0.30001503" 642 | electron-to-chromium "^1.4.431" 643 | node-releases "^2.0.12" 644 | update-browserslist-db "^1.0.11" 645 | 646 | cac@^6.7.14: 647 | version "6.7.14" 648 | resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" 649 | integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== 650 | 651 | caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: 652 | version "1.0.30001515" 653 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz#418aefeed9d024cd3129bfae0ccc782d4cb8f12b" 654 | integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== 655 | 656 | chalk@^2.0.0: 657 | version "2.4.2" 658 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 659 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 660 | dependencies: 661 | ansi-styles "^3.2.1" 662 | escape-string-regexp "^1.0.5" 663 | supports-color "^5.3.0" 664 | 665 | chart.js@^4.3.0: 666 | version "4.3.0" 667 | resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-4.3.0.tgz#ac363030ab3fec572850d2d872956f32a46326a1" 668 | integrity sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g== 669 | dependencies: 670 | "@kurkle/color" "^0.3.0" 671 | 672 | chokidar@^3.5.3: 673 | version "3.5.3" 674 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 675 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 676 | dependencies: 677 | anymatch "~3.1.2" 678 | braces "~3.0.2" 679 | glob-parent "~5.1.2" 680 | is-binary-path "~2.1.0" 681 | is-glob "~4.0.1" 682 | normalize-path "~3.0.0" 683 | readdirp "~3.6.0" 684 | optionalDependencies: 685 | fsevents "~2.3.2" 686 | 687 | color-convert@^1.9.0: 688 | version "1.9.3" 689 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 690 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 691 | dependencies: 692 | color-name "1.1.3" 693 | 694 | color-name@1.1.3: 695 | version "1.1.3" 696 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 697 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== 698 | 699 | colorette@^2.0.20: 700 | version "2.0.20" 701 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" 702 | integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== 703 | 704 | consola@^3.2.3: 705 | version "3.2.3" 706 | resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" 707 | integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== 708 | 709 | convert-source-map@^1.7.0: 710 | version "1.9.0" 711 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" 712 | integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== 713 | 714 | core-util-is@~1.0.0: 715 | version "1.0.3" 716 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 717 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 718 | 719 | cross-spawn@^7.0.3: 720 | version "7.0.3" 721 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 722 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 723 | dependencies: 724 | path-key "^3.1.0" 725 | shebang-command "^2.0.0" 726 | which "^2.0.1" 727 | 728 | css-tree@^2.3.1: 729 | version "2.3.1" 730 | resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" 731 | integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== 732 | dependencies: 733 | mdn-data "2.0.30" 734 | source-map-js "^1.0.1" 735 | 736 | debug@^4.1.0, debug@^4.3.1, debug@^4.3.4: 737 | version "4.3.4" 738 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 739 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 740 | dependencies: 741 | ms "2.1.2" 742 | 743 | defu@^6.1.2: 744 | version "6.1.2" 745 | resolved "https://registry.yarnpkg.com/defu/-/defu-6.1.2.tgz#1217cba167410a1765ba93893c6dbac9ed9d9e5c" 746 | integrity sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ== 747 | 748 | destr@^2.0.0: 749 | version "2.0.0" 750 | resolved "https://registry.yarnpkg.com/destr/-/destr-2.0.0.tgz#60847d02b211de6e252fc72806f4ec39ec257e7b" 751 | integrity sha512-FJ9RDpf3GicEBvzI3jxc2XhHzbqD8p4ANw/1kPsFBfTvP1b7Gn/Lg1vO7R9J4IVgoMbyUmFrFGZafJ1hPZpvlg== 752 | 753 | duplexer@^0.1.2: 754 | version "0.1.2" 755 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" 756 | integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== 757 | 758 | electron-to-chromium@^1.4.431: 759 | version "1.4.458" 760 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.458.tgz#e171c03e6b15e44f6d27c0e1a27a3a3f828117c8" 761 | integrity sha512-fYaH2f9dlJ/W3EV7wpRgzAoE85UwCUFeJIiL24PCRtvzdXJNy3AZdS/0zLqw5Omnp9GSR/hApMUQjacW2nfgsw== 762 | 763 | esbuild-android-64@0.14.54: 764 | version "0.14.54" 765 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" 766 | integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== 767 | 768 | esbuild-android-arm64@0.14.54: 769 | version "0.14.54" 770 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" 771 | integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== 772 | 773 | esbuild-darwin-64@0.14.54: 774 | version "0.14.54" 775 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" 776 | integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== 777 | 778 | esbuild-darwin-arm64@0.14.54: 779 | version "0.14.54" 780 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73" 781 | integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== 782 | 783 | esbuild-freebsd-64@0.14.54: 784 | version "0.14.54" 785 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" 786 | integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== 787 | 788 | esbuild-freebsd-arm64@0.14.54: 789 | version "0.14.54" 790 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" 791 | integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== 792 | 793 | esbuild-linux-32@0.14.54: 794 | version "0.14.54" 795 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" 796 | integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== 797 | 798 | esbuild-linux-64@0.14.54: 799 | version "0.14.54" 800 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" 801 | integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== 802 | 803 | esbuild-linux-arm64@0.14.54: 804 | version "0.14.54" 805 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" 806 | integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== 807 | 808 | esbuild-linux-arm@0.14.54: 809 | version "0.14.54" 810 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" 811 | integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== 812 | 813 | esbuild-linux-mips64le@0.14.54: 814 | version "0.14.54" 815 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" 816 | integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== 817 | 818 | esbuild-linux-ppc64le@0.14.54: 819 | version "0.14.54" 820 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" 821 | integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== 822 | 823 | esbuild-linux-riscv64@0.14.54: 824 | version "0.14.54" 825 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" 826 | integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== 827 | 828 | esbuild-linux-s390x@0.14.54: 829 | version "0.14.54" 830 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" 831 | integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== 832 | 833 | esbuild-netbsd-64@0.14.54: 834 | version "0.14.54" 835 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" 836 | integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== 837 | 838 | esbuild-openbsd-64@0.14.54: 839 | version "0.14.54" 840 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" 841 | integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== 842 | 843 | esbuild-sunos-64@0.14.54: 844 | version "0.14.54" 845 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" 846 | integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== 847 | 848 | esbuild-windows-32@0.14.54: 849 | version "0.14.54" 850 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" 851 | integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== 852 | 853 | esbuild-windows-64@0.14.54: 854 | version "0.14.54" 855 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" 856 | integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== 857 | 858 | esbuild-windows-arm64@0.14.54: 859 | version "0.14.54" 860 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" 861 | integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== 862 | 863 | esbuild@^0.14.27: 864 | version "0.14.54" 865 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2" 866 | integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA== 867 | optionalDependencies: 868 | "@esbuild/linux-loong64" "0.14.54" 869 | esbuild-android-64 "0.14.54" 870 | esbuild-android-arm64 "0.14.54" 871 | esbuild-darwin-64 "0.14.54" 872 | esbuild-darwin-arm64 "0.14.54" 873 | esbuild-freebsd-64 "0.14.54" 874 | esbuild-freebsd-arm64 "0.14.54" 875 | esbuild-linux-32 "0.14.54" 876 | esbuild-linux-64 "0.14.54" 877 | esbuild-linux-arm "0.14.54" 878 | esbuild-linux-arm64 "0.14.54" 879 | esbuild-linux-mips64le "0.14.54" 880 | esbuild-linux-ppc64le "0.14.54" 881 | esbuild-linux-riscv64 "0.14.54" 882 | esbuild-linux-s390x "0.14.54" 883 | esbuild-netbsd-64 "0.14.54" 884 | esbuild-openbsd-64 "0.14.54" 885 | esbuild-sunos-64 "0.14.54" 886 | esbuild-windows-32 "0.14.54" 887 | esbuild-windows-64 "0.14.54" 888 | esbuild-windows-arm64 "0.14.54" 889 | 890 | escalade@^3.1.1: 891 | version "3.1.1" 892 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 893 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 894 | 895 | escape-string-regexp@^1.0.5: 896 | version "1.0.5" 897 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 898 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 899 | 900 | estree-walker@^2.0.1, estree-walker@^2.0.2: 901 | version "2.0.2" 902 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 903 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 904 | 905 | execa@^5.1.1: 906 | version "5.1.1" 907 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 908 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 909 | dependencies: 910 | cross-spawn "^7.0.3" 911 | get-stream "^6.0.0" 912 | human-signals "^2.1.0" 913 | is-stream "^2.0.0" 914 | merge-stream "^2.0.0" 915 | npm-run-path "^4.0.1" 916 | onetime "^5.1.2" 917 | signal-exit "^3.0.3" 918 | strip-final-newline "^2.0.0" 919 | 920 | fast-glob@^3.3.0: 921 | version "3.3.0" 922 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" 923 | integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== 924 | dependencies: 925 | "@nodelib/fs.stat" "^2.0.2" 926 | "@nodelib/fs.walk" "^1.2.3" 927 | glob-parent "^5.1.2" 928 | merge2 "^1.3.0" 929 | micromatch "^4.0.4" 930 | 931 | fastq@^1.6.0: 932 | version "1.15.0" 933 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" 934 | integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== 935 | dependencies: 936 | reusify "^1.0.4" 937 | 938 | file-saver@^2.0.5: 939 | version "2.0.5" 940 | resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" 941 | integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== 942 | 943 | fill-range@^7.0.1: 944 | version "7.0.1" 945 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 946 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 947 | dependencies: 948 | to-regex-range "^5.0.1" 949 | 950 | find-up@^5.0.0: 951 | version "5.0.0" 952 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 953 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 954 | dependencies: 955 | locate-path "^6.0.0" 956 | path-exists "^4.0.0" 957 | 958 | fraction.js@^4.2.0: 959 | version "4.2.0" 960 | resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" 961 | integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== 962 | 963 | fsevents@~2.3.2: 964 | version "2.3.2" 965 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 966 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 967 | 968 | function-bind@^1.1.1: 969 | version "1.1.1" 970 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 971 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 972 | 973 | gensync@^1.0.0-beta.2: 974 | version "1.0.0-beta.2" 975 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 976 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 977 | 978 | get-stream@^6.0.0: 979 | version "6.0.1" 980 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 981 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 982 | 983 | glob-parent@^5.1.2, glob-parent@~5.1.2: 984 | version "5.1.2" 985 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 986 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 987 | dependencies: 988 | is-glob "^4.0.1" 989 | 990 | globals@^11.1.0: 991 | version "11.12.0" 992 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 993 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 994 | 995 | gzip-size@^6.0.0: 996 | version "6.0.0" 997 | resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" 998 | integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== 999 | dependencies: 1000 | duplexer "^0.1.2" 1001 | 1002 | has-flag@^3.0.0: 1003 | version "3.0.0" 1004 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1005 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== 1006 | 1007 | has@^1.0.3: 1008 | version "1.0.3" 1009 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1010 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1011 | dependencies: 1012 | function-bind "^1.1.1" 1013 | 1014 | human-signals@^2.1.0: 1015 | version "2.1.0" 1016 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 1017 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 1018 | 1019 | immediate@~3.0.5: 1020 | version "3.0.6" 1021 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 1022 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 1023 | 1024 | inherits@~2.0.3: 1025 | version "2.0.4" 1026 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1027 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1028 | 1029 | is-binary-path@~2.1.0: 1030 | version "2.1.0" 1031 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1032 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1033 | dependencies: 1034 | binary-extensions "^2.0.0" 1035 | 1036 | is-core-module@^2.11.0: 1037 | version "2.12.1" 1038 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" 1039 | integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== 1040 | dependencies: 1041 | has "^1.0.3" 1042 | 1043 | is-extglob@^2.1.1: 1044 | version "2.1.1" 1045 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1046 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1047 | 1048 | is-glob@^4.0.1, is-glob@~4.0.1: 1049 | version "4.0.3" 1050 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1051 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1052 | dependencies: 1053 | is-extglob "^2.1.1" 1054 | 1055 | is-number@^7.0.0: 1056 | version "7.0.0" 1057 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1058 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1059 | 1060 | is-stream@^2.0.0: 1061 | version "2.0.1" 1062 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1063 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1064 | 1065 | isarray@~1.0.0: 1066 | version "1.0.0" 1067 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1068 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 1069 | 1070 | isexe@^2.0.0: 1071 | version "2.0.0" 1072 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1073 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1074 | 1075 | jiti@^1.18.2: 1076 | version "1.19.1" 1077 | resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.1.tgz#fa99e4b76a23053e0e7cde098efe1704a14c16f1" 1078 | integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== 1079 | 1080 | js-tokens@^4.0.0: 1081 | version "4.0.0" 1082 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1083 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1084 | 1085 | jsesc@^2.5.1: 1086 | version "2.5.2" 1087 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1088 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 1089 | 1090 | json5@^2.2.2: 1091 | version "2.2.3" 1092 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 1093 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1094 | 1095 | jszip@^3.10.1: 1096 | version "3.10.1" 1097 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 1098 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 1099 | dependencies: 1100 | lie "~3.3.0" 1101 | pako "~1.0.2" 1102 | readable-stream "~2.3.6" 1103 | setimmediate "^1.0.5" 1104 | 1105 | kolorist@^1.2.10, kolorist@^1.8.0: 1106 | version "1.8.0" 1107 | resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" 1108 | integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== 1109 | 1110 | lie@~3.3.0: 1111 | version "3.3.0" 1112 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 1113 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 1114 | dependencies: 1115 | immediate "~3.0.5" 1116 | 1117 | local-pkg@^0.4.3: 1118 | version "0.4.3" 1119 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.4.3.tgz#0ff361ab3ae7f1c19113d9bb97b98b905dbc4963" 1120 | integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g== 1121 | 1122 | locate-path@^6.0.0: 1123 | version "6.0.0" 1124 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1125 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1126 | dependencies: 1127 | p-locate "^5.0.0" 1128 | 1129 | lru-cache@^5.1.1: 1130 | version "5.1.1" 1131 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1132 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1133 | dependencies: 1134 | yallist "^3.0.2" 1135 | 1136 | magic-string@^0.30.1: 1137 | version "0.30.1" 1138 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d" 1139 | integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA== 1140 | dependencies: 1141 | "@jridgewell/sourcemap-codec" "^1.4.15" 1142 | 1143 | mdn-data@2.0.30: 1144 | version "2.0.30" 1145 | resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" 1146 | integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== 1147 | 1148 | merge-stream@^2.0.0: 1149 | version "2.0.0" 1150 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 1151 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 1152 | 1153 | merge2@^1.3.0: 1154 | version "1.4.1" 1155 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1156 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1157 | 1158 | micromatch@^4.0.4: 1159 | version "4.0.5" 1160 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" 1161 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1162 | dependencies: 1163 | braces "^3.0.2" 1164 | picomatch "^2.3.1" 1165 | 1166 | mimic-fn@^2.1.0: 1167 | version "2.1.0" 1168 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 1169 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1170 | 1171 | mrmime@^1.0.0: 1172 | version "1.0.1" 1173 | resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" 1174 | integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== 1175 | 1176 | ms@2.1.2: 1177 | version "2.1.2" 1178 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1179 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1180 | 1181 | nanoid@^3.3.6: 1182 | version "3.3.6" 1183 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" 1184 | integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== 1185 | 1186 | node-fetch-native@^1.2.0: 1187 | version "1.2.0" 1188 | resolved "https://registry.yarnpkg.com/node-fetch-native/-/node-fetch-native-1.2.0.tgz#13ec6df98f33168958dbfb6945f10aedf42e7ea8" 1189 | integrity sha512-5IAMBTl9p6PaAjYCnMv5FmqIF6GcZnawAVnzaCG0rX2aYZJ4CxEkZNtVPuTRug7fL7wyM5BQYTlAzcyMPi6oTQ== 1190 | 1191 | node-releases@^2.0.12: 1192 | version "2.0.13" 1193 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" 1194 | integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== 1195 | 1196 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1197 | version "3.0.0" 1198 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1199 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1200 | 1201 | normalize-range@^0.1.2: 1202 | version "0.1.2" 1203 | resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" 1204 | integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== 1205 | 1206 | npm-run-path@^4.0.1: 1207 | version "4.0.1" 1208 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 1209 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 1210 | dependencies: 1211 | path-key "^3.0.0" 1212 | 1213 | ofetch@^1.1.1: 1214 | version "1.1.1" 1215 | resolved "https://registry.yarnpkg.com/ofetch/-/ofetch-1.1.1.tgz#a0e5117500f4ac02e2c61ec1bb754bc54d5ba44d" 1216 | integrity sha512-SSMoktrp9SNLi20BWfB/BnnKcL0RDigXThD/mZBeQxkIRv1xrd9183MtLdsqRYLYSqW0eTr5t8w8MqjNhvoOQQ== 1217 | dependencies: 1218 | destr "^2.0.0" 1219 | node-fetch-native "^1.2.0" 1220 | ufo "^1.1.2" 1221 | 1222 | onetime@^5.1.2: 1223 | version "5.1.2" 1224 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 1225 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 1226 | dependencies: 1227 | mimic-fn "^2.1.0" 1228 | 1229 | p-limit@^3.0.2: 1230 | version "3.1.0" 1231 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1232 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1233 | dependencies: 1234 | yocto-queue "^0.1.0" 1235 | 1236 | p-locate@^5.0.0: 1237 | version "5.0.0" 1238 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1239 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1240 | dependencies: 1241 | p-limit "^3.0.2" 1242 | 1243 | pako@~1.0.2: 1244 | version "1.0.11" 1245 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1246 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1247 | 1248 | path-exists@^4.0.0: 1249 | version "4.0.0" 1250 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1251 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1252 | 1253 | path-key@^3.0.0, path-key@^3.1.0: 1254 | version "3.1.1" 1255 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1256 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1257 | 1258 | path-parse@^1.0.7: 1259 | version "1.0.7" 1260 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1261 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1262 | 1263 | pathe@^1.1.1: 1264 | version "1.1.1" 1265 | resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" 1266 | integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== 1267 | 1268 | perfect-debounce@^1.0.0: 1269 | version "1.0.0" 1270 | resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" 1271 | integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== 1272 | 1273 | picocolors@^1.0.0: 1274 | version "1.0.0" 1275 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1276 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1277 | 1278 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1: 1279 | version "2.3.1" 1280 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1281 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1282 | 1283 | postcss-value-parser@^4.2.0: 1284 | version "4.2.0" 1285 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" 1286 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 1287 | 1288 | postcss@^8.4.13, postcss@^8.4.25: 1289 | version "8.4.25" 1290 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" 1291 | integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== 1292 | dependencies: 1293 | nanoid "^3.3.6" 1294 | picocolors "^1.0.0" 1295 | source-map-js "^1.0.2" 1296 | 1297 | preact@^10.5.15: 1298 | version "10.16.0" 1299 | resolved "https://registry.yarnpkg.com/preact/-/preact-10.16.0.tgz#68a06d70b191b8a313ea722d61e09c6b2a79a37e" 1300 | integrity sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA== 1301 | 1302 | process-nextick-args@~2.0.0: 1303 | version "2.0.1" 1304 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1305 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1306 | 1307 | queue-microtask@^1.2.2: 1308 | version "1.2.3" 1309 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1310 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1311 | 1312 | react-chartjs-2@^5.2.0: 1313 | version "5.2.0" 1314 | resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz#43c1e3549071c00a1a083ecbd26c1ad34d385f5d" 1315 | integrity sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA== 1316 | 1317 | readable-stream@~2.3.6: 1318 | version "2.3.8" 1319 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 1320 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 1321 | dependencies: 1322 | core-util-is "~1.0.0" 1323 | inherits "~2.0.3" 1324 | isarray "~1.0.0" 1325 | process-nextick-args "~2.0.0" 1326 | safe-buffer "~5.1.1" 1327 | string_decoder "~1.1.1" 1328 | util-deprecate "~1.0.1" 1329 | 1330 | readdirp@~3.6.0: 1331 | version "3.6.0" 1332 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1333 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1334 | dependencies: 1335 | picomatch "^2.2.1" 1336 | 1337 | resolve@^1.20.0, resolve@^1.22.0: 1338 | version "1.22.2" 1339 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" 1340 | integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== 1341 | dependencies: 1342 | is-core-module "^2.11.0" 1343 | path-parse "^1.0.7" 1344 | supports-preserve-symlinks-flag "^1.0.0" 1345 | 1346 | reusify@^1.0.4: 1347 | version "1.0.4" 1348 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1349 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1350 | 1351 | "rollup@>=2.59.0 <2.78.0": 1352 | version "2.77.3" 1353 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.3.tgz#8f00418d3a2740036e15deb653bed1a90ee0cc12" 1354 | integrity sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g== 1355 | optionalDependencies: 1356 | fsevents "~2.3.2" 1357 | 1358 | run-parallel@^1.1.9: 1359 | version "1.2.0" 1360 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1361 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1362 | dependencies: 1363 | queue-microtask "^1.2.2" 1364 | 1365 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1366 | version "5.1.2" 1367 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1368 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1369 | 1370 | semver@^6.3.1: 1371 | version "6.3.1" 1372 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1373 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1374 | 1375 | setimmediate@^1.0.5: 1376 | version "1.0.5" 1377 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1378 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1379 | 1380 | shebang-command@^2.0.0: 1381 | version "2.0.0" 1382 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1383 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1384 | dependencies: 1385 | shebang-regex "^3.0.0" 1386 | 1387 | shebang-regex@^3.0.0: 1388 | version "3.0.0" 1389 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1390 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1391 | 1392 | signal-exit@^3.0.3: 1393 | version "3.0.7" 1394 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 1395 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 1396 | 1397 | sirv@^2.0.3: 1398 | version "2.0.3" 1399 | resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446" 1400 | integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== 1401 | dependencies: 1402 | "@polka/url" "^1.0.0-next.20" 1403 | mrmime "^1.0.0" 1404 | totalist "^3.0.0" 1405 | 1406 | source-map-js@^1.0.1, source-map-js@^1.0.2: 1407 | version "1.0.2" 1408 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1409 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1410 | 1411 | string_decoder@~1.1.1: 1412 | version "1.1.1" 1413 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1414 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1415 | dependencies: 1416 | safe-buffer "~5.1.0" 1417 | 1418 | strip-final-newline@^2.0.0: 1419 | version "2.0.0" 1420 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 1421 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 1422 | 1423 | supports-color@^5.3.0: 1424 | version "5.5.0" 1425 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1426 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1427 | dependencies: 1428 | has-flag "^3.0.0" 1429 | 1430 | supports-preserve-symlinks-flag@^1.0.0: 1431 | version "1.0.0" 1432 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1433 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1434 | 1435 | to-fast-properties@^2.0.0: 1436 | version "2.0.0" 1437 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1438 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 1439 | 1440 | to-regex-range@^5.0.1: 1441 | version "5.0.1" 1442 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1443 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1444 | dependencies: 1445 | is-number "^7.0.0" 1446 | 1447 | totalist@^3.0.0: 1448 | version "3.0.1" 1449 | resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" 1450 | integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== 1451 | 1452 | typescript@^4.5.4: 1453 | version "4.9.5" 1454 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" 1455 | integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 1456 | 1457 | ufo@^1.1.2: 1458 | version "1.1.2" 1459 | resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.1.2.tgz#d0d9e0fa09dece0c31ffd57bd363f030a35cfe76" 1460 | integrity sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ== 1461 | 1462 | unconfig@^0.3.9: 1463 | version "0.3.9" 1464 | resolved "https://registry.yarnpkg.com/unconfig/-/unconfig-0.3.9.tgz#aa4610fd2982c319b4ca87b703741f60c0873e21" 1465 | integrity sha512-8yhetFd48M641mxrkWA+C/lZU4N0rCOdlo3dFsyFPnBHBjMJfjT/3eAZBRT2RxCRqeBMAKBVgikejdS6yeBjMw== 1466 | dependencies: 1467 | "@antfu/utils" "^0.7.2" 1468 | defu "^6.1.2" 1469 | jiti "^1.18.2" 1470 | 1471 | unocss@^0.53.5: 1472 | version "0.53.5" 1473 | resolved "https://registry.yarnpkg.com/unocss/-/unocss-0.53.5.tgz#1f46783ab7756d62eb4b1c04f20a3484ed46a0cc" 1474 | integrity sha512-LXAdtzAaH8iEDWxW4t9i6TvJNw0OSrgdN+jw8rAZAWb73Nx51ZLoKPUB1rFvQMr2Li7LcsUj5hYpOrQbhhafYg== 1475 | dependencies: 1476 | "@unocss/astro" "0.53.5" 1477 | "@unocss/cli" "0.53.5" 1478 | "@unocss/core" "0.53.5" 1479 | "@unocss/extractor-arbitrary-variants" "0.53.5" 1480 | "@unocss/postcss" "0.53.5" 1481 | "@unocss/preset-attributify" "0.53.5" 1482 | "@unocss/preset-icons" "0.53.5" 1483 | "@unocss/preset-mini" "0.53.5" 1484 | "@unocss/preset-tagify" "0.53.5" 1485 | "@unocss/preset-typography" "0.53.5" 1486 | "@unocss/preset-uno" "0.53.5" 1487 | "@unocss/preset-web-fonts" "0.53.5" 1488 | "@unocss/preset-wind" "0.53.5" 1489 | "@unocss/reset" "0.53.5" 1490 | "@unocss/transformer-attributify-jsx" "0.53.5" 1491 | "@unocss/transformer-attributify-jsx-babel" "0.53.5" 1492 | "@unocss/transformer-compile-class" "0.53.5" 1493 | "@unocss/transformer-directives" "0.53.5" 1494 | "@unocss/transformer-variant-group" "0.53.5" 1495 | "@unocss/vite" "0.53.5" 1496 | 1497 | update-browserslist-db@^1.0.11: 1498 | version "1.0.11" 1499 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" 1500 | integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== 1501 | dependencies: 1502 | escalade "^3.1.1" 1503 | picocolors "^1.0.0" 1504 | 1505 | util-deprecate@~1.0.1: 1506 | version "1.0.2" 1507 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1508 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1509 | 1510 | vite@^2.9.9: 1511 | version "2.9.16" 1512 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.16.tgz#daf7ba50f5cc37a7bf51b118ba06bc36e97898e9" 1513 | integrity sha512-X+6q8KPyeuBvTQV8AVSnKDvXoBMnTx8zxh54sOwmmuOdxkjMmEJXH2UEchA+vTMps1xw9vL64uwJOWryULg7nA== 1514 | dependencies: 1515 | esbuild "^0.14.27" 1516 | postcss "^8.4.13" 1517 | resolve "^1.22.0" 1518 | rollup ">=2.59.0 <2.78.0" 1519 | optionalDependencies: 1520 | fsevents "~2.3.2" 1521 | 1522 | which@^2.0.1: 1523 | version "2.0.2" 1524 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1525 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1526 | dependencies: 1527 | isexe "^2.0.0" 1528 | 1529 | yallist@^3.0.2: 1530 | version "3.1.1" 1531 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1532 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1533 | 1534 | yocto-queue@^0.1.0: 1535 | version "0.1.0" 1536 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1537 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1538 | --------------------------------------------------------------------------------