diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index b3c21c90..5d54d348 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -9,39 +9,36 @@ body: - type: markdown attributes: value: >- - # ๐Ÿ‘‹ Thank You for Creating a Bug Report! + # ๐Ÿ‘‹ Thanks for Reporting a Bug! - Every issue that gets reported and fixed is an improvement for everyone - using Animated Java! - - Please fill out the following information to the best of your ability. - Providing clear, and concise information will greatly improve the - chances of your issue getting resolved! + Every bug report that gets fixed makes Animated Java better for + everyone. Fill out what you can below โ€” the more detail you give us, + the faster we can track down the problem. - type: checkboxes id: confirmations attributes: - label: ๐Ÿ›‘ Before you Start + label: ๐Ÿ›‘ Quick Checklist description: >- - Please confirm you have taken the following steps *before* creating a - new issue! + A few quick checks before you post โ€” these help us avoid duplicate + reports and wasted back-and-forth. options: - label: >- - I have searched [existing - bug reports](https://github.com/Animated-Java/animated-java/labels/%F0%9F%90%9B%20Bug) for - my problem. + I searched [existing bug + reports](https://github.com/Animated-Java/animated-java/labels/%F0%9F%90%9B%20Bug) + and didn't find mine. required: true - label: >- - I have read the - [F-A-Q](https://animated-java.dev/docs/resources/faq). + I checked the [F-A-Q](https://animated-java.dev/docs/resources/faq) + and my issue isn't answered there. required: true - label: >- - I am using the [latest - version](https://builds.animated-java.dev/latest) of Animated Java + I'm using the [latest + version](https://builds.animated-java.dev/latest) of Animated Java. required: true - label: >- - I will only report a single bug in this report. If I have found multiple - bugs, I will create a separate report for each one. + This report is about a single bug. (If I found more than one, + I'll file a separate report for each.) required: true - type: markdown @@ -51,31 +48,22 @@ body: - type: textarea id: description attributes: - label: ๐Ÿ—ฃ๏ธ Describe the bug + label: ๐Ÿ—ฃ๏ธ What happened? description: >- - A clear and concise description of the bug. You may include screenshots, - videos, and other media as needed. + Describe the bug in your own words. Screenshots, videos, and + `.ajblueprint` files are all welcome, and often help us understand + the problem a lot faster. placeholder: My lawnmower is producing large clumps of grass. validations: required: true - - type: textarea - id: error - attributes: - label: โš ๏ธ Error Message - description: The error message provided by Animated Java (If applicable) - render: javascript - placeholder: >- - If you received an error message, please paste it here. If not, you can - leave this field blank. - - type: textarea id: repro attributes: - label: ๐Ÿ”„๏ธ How to Reproduce + label: ๐Ÿ”„๏ธ Steps to reproduce description: >- - A short explanation of how to reproduce the issue. Please include and - `.ajblueprint` files that produce the issue if applicable. + Walk us through exactly what you did, step by step, right before the + bug showed up. placeholder: |- 1. Go to '...' 2. Click on '....' @@ -87,38 +75,50 @@ body: - type: textarea id: expected attributes: - label: โœ… Expected Behavior - description: What you expected to happen when performing the above steps. + label: โœ… What did you expect to happen instead? placeholder: >- My lawnmower should produce small grass clippings that easily filter into the lawn. validations: required: true + - type: textarea + id: error + attributes: + label: โš ๏ธ Error message + description: >- + If Animated Java or Blockbench showed you an error message, paste it + here. If not, leave this blank. + render: javascript + - type: textarea id: solutions attributes: - label: ๐Ÿ’ก Solutions & Alternatives + label: ๐Ÿ’ก Found a workaround? description: >- - Any alternative solutions, or workarounds you've considered, and why - they're not ideal. + If you've found a way around the problem โ€” even a clunky one โ€” let us + know. It helps other users in the meantime, and sometimes points us + straight at the fix. placeholder: >- - - I could use a lawnmower bag, but I would need to purchase a bag, and - empty it periodically while mowing. + I could use a lawnmower bag, but I'd need to buy one, and empty it + periodically while mowing. - type: markdown attributes: value: |- - # โ›ฐ๏ธ Environment + # โ›ฐ๏ธ Your Setup - Provide details about your system and setup to help diagnose the issue. + This helps us tell whether the bug is specific to a certain version, + platform, or mod/plugin combo. If you're not sure about something, + your best guess is fine. - type: input id: mc-version attributes: label: ๐ŸŸฉ Minecraft Version - description: The version of Minecraft you're using. - placeholder: E.g. 1.20.4, 26.1.1 + description: >- + Shown in the bottom-right corner of the Minecraft title screen. + placeholder: E.g. 1.20.4, 26.2 validations: required: true @@ -126,7 +126,7 @@ body: id: bb-version attributes: label: ๐ŸŸฆ Blockbench Version - description: The version of Blockbench you're using. + description: Found under Blockbench's Help menu โ†’ About Blockbench. placeholder: E.g. 4.12.2 validations: required: true @@ -146,8 +146,10 @@ body: - type: textarea id: installed-bb-plugins attributes: - label: ๐Ÿ“ƒ Installed Blockbench Plugins - description: Any Blockbench Plugins you have installed other than Animated Java. + label: ๐Ÿ“ƒ Other Blockbench Plugins + description: >- + Any other Blockbench plugins you have installed besides Animated + Java. If it's just Animated Java, leave this blank. placeholder: |- - Geckolib Animation Utils - Cameras @@ -157,10 +159,11 @@ body: - type: textarea id: environment attributes: - label: โ›ฐ๏ธ Minecraft Environment + label: ๐ŸŽฎ Modded Client or Server? description: >- - A description of the Minecraft environment you're using, if it's not - strictly a vanilla single-player world or server. + If you're just playing vanilla Minecraft (singleplayer or a plain + server), you can leave this blank. If you're using mods, a modpack, + or server plugins, tell us about them here. placeholder: | ## Server environment diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..79c834c0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: ๐Ÿ’ฌ Questions & Help + url: https://animated-java.dev/discord + about: Not sure if it's a bug, or just need a hand? Ask on Discord first! + - name: ๐Ÿ“š Documentation + url: https://animated-java.dev/docs + about: Guides and answers to common questions about using Animated Java. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index eed4ddcd..c216c7ff 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -9,35 +9,35 @@ body: - type: markdown attributes: value: >- - # ๐Ÿ‘‹ Thank You for Opening a Feature Request! + # ๐Ÿ‘‹ Thanks for the Suggestion! - Please fill out the following information to the best of your ability. - Providing clear, and concise information will greatly improve the - chances of your request getting implemented! + Fill out what you can below โ€” clear, specific requests are much more + likely to get picked up and implemented. - type: checkboxes id: confirmations attributes: - label: ๐Ÿ›‘ Before you Start + label: ๐Ÿ›‘ Quick Checklist description: >- - Please confirm you have taken the following steps *before* creating a - new issue! + A few quick checks before you post โ€” these help us avoid duplicate + requests and wasted back-and-forth. options: - label: >- - I have searched [existing - feature requests](https://github.com/Animated-Java/animated-java/labels/%E2%9C%A8%20Enhancement) for - my feature. + I searched [existing feature + requests](https://github.com/Animated-Java/animated-java/labels/%E2%9C%A8%20Enhancement) + and didn't find mine. required: true - label: >- - I have read [the documentation](https://animated-java.dev/docs/), and I am sure this feature is not already implemented. + I checked [the documentation](https://animated-java.dev/docs/) + and this isn't already possible. required: true - label: >- - I am using the [latest + I'm using the [latest version](https://builds.animated-java.dev/latest) of Animated Java. required: true - label: >- - I will only request a single feature in this request. If I have multiple - feature requests, I will create a separate request for each one. + This request is about a single feature. (If I have more than one + idea, I'll file a separate request for each.) required: true - type: markdown @@ -47,8 +47,10 @@ body: - type: textarea id: description attributes: - label: ๐Ÿ“ Description - description: A clear and concise description of the problem or missing capability. + label: ๐Ÿ“ What's the problem, or what's missing? + description: >- + Describe what you're trying to do, and where Animated Java gets in + the way or falls short. placeholder: My lawnmower doesn't work on mars. validations: required: true @@ -56,8 +58,8 @@ body: - type: textarea id: solution attributes: - label: ๐Ÿ’ก Describe the solution you'd like - description: If you have a solution in mind, please describe it. + label: ๐Ÿ’ก What would you like to see? + description: If you already have an idea for how this could work, describe it here. placeholder: >- Combustion engines don't work without enough oxygen, so maybe we could use an electric engine instead? @@ -67,5 +69,7 @@ body: - type: textarea id: alternatives attributes: - label: ๐Ÿงช Describe alternatives you've considered - description: Have you considered any alternative solutions or workarounds? + label: ๐Ÿงช Tried anything else? + description: >- + Any workarounds or alternative approaches you've already tried, and + why they didn't quite do the job. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8f790875..d3bf70b3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -25,5 +25,18 @@ jobs: - name: Build run: bun run prod + # jestbench drives a real, headless Blockbench (via xvfb-run) and downloads + # it plus the target Minecraft client jar on the first run. Both live under + # ~/.envbench, so caching that folder keeps later runs offline-fast. + - name: Cache Blockbench test environment + uses: actions/cache@v4 + with: + path: ~/.envbench + key: envbench-${{ runner.os }}-animated-java-tests + + - name: Install xvfb + run: sudo apt-get update && sudo apt-get install -y xvfb + - name: Run tests - run: bun test + timeout-minutes: 20 + run: bun run test:only diff --git a/.github/workflows/release-announce.yml b/.github/workflows/release-announce.yml new file mode 100644 index 00000000..0186030b --- /dev/null +++ b/.github/workflows/release-announce.yml @@ -0,0 +1,44 @@ +name: Announce Release + +on: + release: + types: [published] + + # Re-run a preview (or the live post) by hand, e.g. after fixing the notes. + workflow_dispatch: + inputs: + tag: + description: Release tag (e.g. v1.11.0) + required: true + target: + description: Where to post + type: choice + options: [test, live] + default: test + +jobs: + announce: + runs-on: ubuntu-latest + + permissions: + contents: read + + env: + TAG: ${{ inputs.tag || github.event.release.tag_name }} + LIVE: ${{ github.event_name == 'release' || inputs.target == 'live' }} + + steps: + - uses: actions/checkout@v5 + with: + ref: ${{ env.TAG }} + - uses: oven-sh/setup-bun@v2 + + - name: Post announcement + run: bun .scripts/release/announce.ts "${TAG#v}" $([ "$LIVE" = true ] && echo --live) + env: + DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }} + DISCORD_CHANNEL_ID: ${{ env.LIVE == 'true' && vars.DISCORD_CHANNEL_ID || vars.DISCORD_TEST_CHANNEL_ID }} + DISCORD_ROLE_PRERELEASE: ${{ vars.DISCORD_ROLE_PRERELEASE }} + DISCORD_ROLE_MINOR: ${{ vars.DISCORD_ROLE_MINOR }} + DISCORD_ROLE_PATCH: ${{ vars.DISCORD_ROLE_PATCH }} + DISCORD_ROLE_BREAKING: ${{ vars.DISCORD_ROLE_BREAKING }} diff --git a/.github/workflows/release-draft.yml b/.github/workflows/release-draft.yml new file mode 100644 index 00000000..00edd3bd --- /dev/null +++ b/.github/workflows/release-draft.yml @@ -0,0 +1,84 @@ +name: Draft Release + +on: + push: + tags: ['v*'] + +jobs: + draft: + runs-on: ubuntu-latest + + permissions: + contents: write + + env: + GH_TOKEN: ${{ github.token }} + TAG: ${{ github.ref_name }} + + steps: + - uses: actions/checkout@v5 + - uses: oven-sh/setup-bun@v2 + - uses: actions/setup-node@v4 + with: + node-version: 24 + + - name: Check tag matches package.json + run: | + expected="v$(jq -r .version package.json)" + if [ "$TAG" != "$expected" ]; then + echo "::error::Tag $TAG doesn't match package.json version ($expected)" + exit 1 + fi + if gh release view "$TAG" > /dev/null 2>&1; then + echo "::error::A release for $TAG already exists" + exit 1 + fi + + - name: Install dependencies + run: bun install --frozen-lockfile + + - name: Run unit tests + run: bun run test:unit + + - name: Build + run: bun run prod + + # See build.yml + - name: Cache Blockbench test environment + uses: actions/cache@v4 + with: + path: ~/.envbench + key: envbench-${{ runner.os }}-animated-java-tests + + - name: Install xvfb + run: sudo apt-get update && sudo apt-get install -y xvfb + + - name: Run tests + timeout-minutes: 20 + run: bun run test:only + + - name: Create draft release + run: | + # The packager skips the notes when changelog.json has no entry for this version. + if [ ! -f dist/github_release_notes_template ]; then + echo "::error::No release notes were generated. Is there a changelog.json entry for $TAG?" + exit 1 + fi + prerelease=$([[ "$TAG" == *-* ]] && echo --prerelease || true) + gh release create "$TAG" --draft --verify-tag $prerelease \ + --title "$TAG" \ + --notes-file dist/github_release_notes_template \ + dist/pluginPackage/animated_java.js \ + dist/pluginPackage/about.md \ + dist/pluginPackage/changelog.json \ + dist/pluginPackage/icon.svg + + - name: Preview announcement in test channel + run: bun .scripts/release/announce.ts "${TAG#v}" + env: + DISCORD_BOT_TOKEN: ${{ secrets.DISCORD_BOT_TOKEN }} + DISCORD_CHANNEL_ID: ${{ vars.DISCORD_TEST_CHANNEL_ID }} + DISCORD_ROLE_PRERELEASE: ${{ vars.DISCORD_ROLE_PRERELEASE }} + DISCORD_ROLE_MINOR: ${{ vars.DISCORD_ROLE_MINOR }} + DISCORD_ROLE_PATCH: ${{ vars.DISCORD_ROLE_PATCH }} + DISCORD_ROLE_BREAKING: ${{ vars.DISCORD_ROLE_BREAKING }} diff --git a/.scripts/esbuild.ts b/.scripts/esbuild.ts index f1416a36..3f23ce20 100644 --- a/.scripts/esbuild.ts +++ b/.scripts/esbuild.ts @@ -20,7 +20,6 @@ import { esbuildPluginSvelte, } from 'svelte-patching-tools/esbuildPlugin' import { TextDecoder } from 'util' -import assetOverridePlugin from './plugins/assetOverridePlugin' import bufferPatchPlugin from './plugins/bufferPatchFunction.js' import langPlugin from './plugins/lang' import mcbCompressionPlugin from './plugins/mcbCompressionPlugin' @@ -193,7 +192,8 @@ const COMMON_CONFIG: esbuild.BuildOptions = { bundle: true, platform: 'browser', external: ['node:*'], - loader: { '.svg': 'dataurl', '.ttf': 'binary', '.css': 'text' }, + loader: { '.svg': 'dataurl', '.ttf': 'binary', '.css': 'text', '.zip': 'dataurl' }, + target: 'es2020', plugins: [ langPlugin({ languageFolder: 'src/lang', @@ -225,7 +225,6 @@ const COMMON_CONFIG: esbuild.BuildOptions = { }) ), packagerPlugin(), - assetOverridePlugin(), mcbCompressionPlugin(), DEPENDENCY_QUARKS, ], @@ -234,6 +233,10 @@ const COMMON_CONFIG: esbuild.BuildOptions = { module: './.scripts/fakeModule.js', 'node:module': './.scripts/fakeModule.js', 'node:fs': './src/constants.ts', + // block-model-renderer's assets.zip isn't in its package exports; inlined it as a data URL instead. + 'block-model-renderer/assets.zip': path.resolve( + 'node_modules/block-model-renderer/assets.zip' + ), }, format: 'iife', define: DEFINES, diff --git a/.scripts/plugins/assetOverridePlugin.ts b/.scripts/plugins/assetOverridePlugin.ts deleted file mode 100644 index a0e9916d..00000000 --- a/.scripts/plugins/assetOverridePlugin.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { Plugin } from 'esbuild' -import * as fs from 'fs/promises' -import * as pathjs from 'node:path' - -const ASSET_OVERRIDES_PATH = 'src/assets/vanillaAssetOverrides/' - -function plugin(): Plugin { - return { - name: 'assetOverridePlugin', - setup(build) { - build.onLoad({ filter: /index\.json$/ }, async () => { - const contents: any = {} - - const recurse = async (dir: string) => { - for (const path of await fs.readdir(dir)) { - if ((await fs.stat(pathjs.join(dir, path))).isDirectory()) { - await recurse(pathjs.join(dir, path)) - } - - if (path.endsWith('.json') || path.endsWith('.png')) { - const key = pathjs - .join('assets', dir, path) - .replaceAll(pathjs.sep, '/') - .replace(ASSET_OVERRIDES_PATH, '') - if (path.endsWith('.json')) { - contents[key] = await fs.readFile(pathjs.join(dir, path), 'utf-8') - } else if (path.endsWith('.png')) { - contents[key] = ( - await fs.readFile(pathjs.join(dir, path)) - ).toString('base64') - } else { - throw new Error(`Unsupported asset type: '${path}'`) - } - } - } - } - - await recurse(ASSET_OVERRIDES_PATH) - - return { - contents: `export default ${JSON.stringify(contents)}`, - } - }) - }, - } -} - -export default plugin diff --git a/.scripts/plugins/mcbCompressionPlugin.ts b/.scripts/plugins/mcbCompressionPlugin.ts index 10ff872d..f9dc8431 100644 --- a/.scripts/plugins/mcbCompressionPlugin.ts +++ b/.scripts/plugins/mcbCompressionPlugin.ts @@ -4,6 +4,14 @@ import { existsSync } from 'fs' import * as fs from 'fs/promises' import * as pathjs from 'node:path' +// One MCB source directory per Minecraft version, holding only the files that +// changed in that version. `getMCBFilesByVersion` layers them at runtime. +const MCB_SOURCE_FILES = { + main: 'main.mcb', + global: 'global.mcb', + globalTemplates: 'global.mcbt', +} as const + function zip(data: fflate.AsyncZippable): Promise { return new Promise((resolve, reject) => { fflate.zip(data, { level: 9 }, (err, data) => { @@ -47,6 +55,65 @@ export default getZipFile('${localPath}') } }) + // `import SOURCES from 'mcb-sources:./some/dir'` expands to an object + // keyed by version-directory name, each value holding the string + // contents of whichever of main.mcb / global.mcb / global.mcbt that + // directory provides. Adding a new version is just a new directory. + build.onResolve({ filter: /^mcb-sources:/ }, args => { + const dir = pathjs.join(args.resolveDir, args.path.replace(/^mcb-sources:/, '')) + + if (!existsSync(dir)) { + return { errors: [{ text: `MCB sources directory not found: ${dir}` }] } + } + + return { path: dir, namespace: 'mcbSources' } + }) + + build.onLoad({ filter: /.*/, namespace: 'mcbSources' }, async ({ path: dir }) => { + const versionDirs = (await fs.readdir(dir, { withFileTypes: true })) + .filter(entry => entry.isDirectory()) + .map(entry => entry.name) + + const imports: string[] = [] + const watchFiles: string[] = [] + const versions: Record> = {} + + for (const version of versionDirs) { + const fields: Record = {} + + for (const [field, fileName] of Object.entries(MCB_SOURCE_FILES)) { + const filePath = pathjs.join(dir, version, fileName) + if (!existsSync(filePath)) continue + + const ident = `mcb_${imports.length}` + imports.push( + `import ${ident} from ${JSON.stringify(`./${version}/${fileName}`)}` + ) + watchFiles.push(filePath) + fields[field] = ident + } + + if (Object.keys(fields).length > 0) versions[version] = fields + } + + const body = Object.entries(versions) + .map(([version, fields]) => { + const props = Object.entries(fields) + .map(([field, ident]) => `${field}: ${ident}`) + .join(', ') + return `\t${JSON.stringify(version)}: { ${props} },` + }) + .join('\n') + + return { + contents: `${imports.join('\n')}\nexport default {\n${body}\n}\n`, + loader: 'js', + resolveDir: dir, + watchFiles, + watchDirs: [dir, ...versionDirs.map(version => pathjs.join(dir, version))], + } + }) + build.onResolve({ filter: /^__MCB_ZIP_DATA$/ }, ({ path }) => { return { path, diff --git a/.scripts/plugins/packagerPlugin.ts b/.scripts/plugins/packagerPlugin.ts index 689d562b..e130348e 100644 --- a/.scripts/plugins/packagerPlugin.ts +++ b/.scripts/plugins/packagerPlugin.ts @@ -5,6 +5,12 @@ import { basename, join } from 'node:path' import { sveltePreprocess } from 'svelte-preprocess' // @ts-expect-error - Types are broken in nodenext for this package, but it works fine. import { typescript } from 'svelte-preprocess-esbuild' +import { + type Changelog, + type ChangelogEntry, + getChangelogEntry, + renderReleaseNotes, +} from '../release/releaseNotes' import type { CompileOptions, CompileResult } from 'svelte/compiler' import { compile, preprocess } from 'svelte/compiler' import { render } from 'svelte/server' @@ -19,12 +25,6 @@ const DIST_PATH = './dist/' const DIST_PACKAGE_PATH = './dist/pluginPackage/' const CHANGELOG_PATH = './src/pluginPackage/changelog.json' const RELEASE_NOTES_TEMPLATES = './.scripts/plugins/releaseNoteTemplates/' -const URL_REGEX = - /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9]{1,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gm - -function replaceTemplateVars(str: string, items: Record) { - return str.replace(/\{(.+?)\}/g, str => items[str.replace(/[\{\}]/g, '')] ?? str) -} /** * Convert a warning or error emitted from the svelte compiler for esbuild. @@ -143,41 +143,25 @@ function plugin(): Plugin { if (process.env.NODE_ENV === 'production') { console.log('๐Ÿ“ Creating changelogs...') - const rawChangelog = fs.readFileSync(CHANGELOG_PATH, 'utf-8') - const changelog = JSON.parse(rawChangelog) + const changelog = JSON.parse( + fs.readFileSync(CHANGELOG_PATH, 'utf-8') + ) as Changelog + let entry: ChangelogEntry + try { + entry = getChangelogEntry(changelog, PACKAGE.version) + } catch (e: any) { + console.warn(`โš ๏ธ ${e.message} in ${CHANGELOG_PATH}`) + return + } for (const file of fs.readdirSync(RELEASE_NOTES_TEMPLATES)) { - let content = fs.readFileSync(join(RELEASE_NOTES_TEMPLATES, file), 'utf-8') - - const versionChangelog = changelog[PACKAGE.version] - if (!versionChangelog) { - console.warn( - `โš ๏ธ No changelog found for version ${PACKAGE.version} in ${CHANGELOG_PATH}` - ) - return - } - - let categories = '' - for (const category of versionChangelog.categories) { - categories += - `\n\n### ${category.title}\n\n` + - category.list - .map((v: string) => '- ' + v) - .join('\n') - .replaceAll('[BREAKING]', 'โš ๏ธ **BREAKING** โ€”') - } - - content = replaceTemplateVars(content, { - version: PACKAGE.version, - categories: categories.trim(), - }) - - if (content.includes('[[ESCAPE_URLS]]')) { - content = content - .replace('[[ESCAPE_URLS]]', '') - .replaceAll(URL_REGEX, (match: string) => '<' + match + '>') - } - - fs.writeFileSync(join(DIST_PATH, file), content) + const template = fs.readFileSync( + join(RELEASE_NOTES_TEMPLATES, file), + 'utf-8' + ) + fs.writeFileSync( + join(DIST_PATH, file), + renderReleaseNotes(template, PACKAGE.version, entry) + ) } // if (fs.existsSync(PLUGIN_REPO_PATH)) { diff --git a/.scripts/plugins/releaseNoteTemplates/discord_release_notes_template b/.scripts/plugins/releaseNoteTemplates/discord_release_notes_template index 353e14bf..62a6c208 100644 --- a/.scripts/plugins/releaseNoteTemplates/discord_release_notes_template +++ b/.scripts/plugins/releaseNoteTemplates/discord_release_notes_template @@ -1,13 +1,11 @@ [[ESCAPE_URLS]] -# :AnimatedJava: Animated Java Release v{version} +# <:AnimatedJava:1349340042379661392> Animated Java Release v{version} {categories} -## How to Install +## [How to Install](https://animated-java.dev/docs/getting-started/installing) -Download `animated_java.js` from the [release page](), then [Follow this tutorial]() - -Once [this PR]() has been merged, you can install the latest release of AJ directly from the Blockbench plugin list. +It can take a while for new releases to appear in the Blockbench plugin list, so to get this one right away, either download `animated_java.js` from the [release page]({release_url}) or [install it via URL](https://animated-java.dev/docs/getting-started/installing#advanced-installation-url). -# {pings} diff --git a/.scripts/plugins/releaseNoteTemplates/github_release_notes_template b/.scripts/plugins/releaseNoteTemplates/github_release_notes_template index c26f0d77..84619937 100644 --- a/.scripts/plugins/releaseNoteTemplates/github_release_notes_template +++ b/.scripts/plugins/releaseNoteTemplates/github_release_notes_template @@ -2,8 +2,6 @@ {categories} -## How to Install +## [How to Install](https://animated-java.dev/docs/getting-started/installing) -Download `animated_java.js` from the [release page](https://github.com/Animated-Java/animated-java/releases/tag/v1.10.1), then [Follow this tutorial](https://animated-java.dev/docs/getting-started/installing#advanced-installation-url) - -Once [this PR](https://github.com/JannisX11/blockbench-plugins/pull/930) has been merged, you can install the latest release of AJ directly from the Blockbench plugin list. +It can take a while for new releases to appear in the Blockbench plugin list, so to get this one right away, either download `animated_java.js` below or [install it via URL](https://animated-java.dev/docs/getting-started/installing#advanced-installation-url). diff --git a/.scripts/release/announce.ts b/.scripts/release/announce.ts new file mode 100644 index 00000000..7cec0b94 --- /dev/null +++ b/.scripts/release/announce.ts @@ -0,0 +1,110 @@ +/** + * Posts a release announcement to a Discord channel. + * + * Usage: `bun .scripts/release/announce.ts [--live]` + * + * Without `--live`, role mentions are shown but don't ping anyone, and the message isn't + * crossposted. Used for previews in a private test channel. + * + * Env: `DISCORD_BOT_TOKEN`, `DISCORD_CHANNEL_ID`, and `DISCORD_ROLE_PRERELEASE`, + * `DISCORD_ROLE_MINOR`, `DISCORD_ROLE_PATCH`, `DISCORD_ROLE_BREAKING`. + */ +import { readFileSync } from 'node:fs' +import { + type Changelog, + type ReleasePing, + getChangelogEntry, + getReleasePings, + getReleaseUrl, + renderReleaseNotes, +} from './releaseNotes' + +const DISCORD_API = 'https://discord.com/api/v10' +const USER_AGENT = 'DiscordBot (https://github.com/Animated-Java/animated-java, 1.0)' +const TEMPLATE_PATH = './.scripts/plugins/releaseNoteTemplates/discord_release_notes_template' +const CHANGELOG_PATH = './src/pluginPackage/changelog.json' +const IS_COMPONENTS_V2 = 1 << 15 +// Shared by every text display in a Components V2 message. +const MAX_TEXT_LENGTH = 4000 +const ACCENT_COLOR = 0x00aced +const BREAKING_LABEL = + '<:BreakingEmoji0:1432852678903463976><:BreakingEmoji1:1432852680404893818><:BreakingEmoji2:1432852682091270144><:BreakingEmoji3:1432852683534110790>' +const ROLE_ENV_VARS: Record = { + prerelease: 'DISCORD_ROLE_PRERELEASE', + minor: 'DISCORD_ROLE_MINOR', + patch: 'DISCORD_ROLE_PATCH', + breaking: 'DISCORD_ROLE_BREAKING', +} + +function requireEnv(name: string) { + const value = process.env[name] + if (!value) throw new Error(`Missing environment variable ${name}`) + return value +} + +async function discordPost(path: string, body?: unknown) { + const response = await fetch(DISCORD_API + path, { + method: 'POST', + headers: { + Authorization: `Bot ${requireEnv('DISCORD_BOT_TOKEN')}`, + 'Content-Type': 'application/json', + 'User-Agent': USER_AGENT, + }, + body: body === undefined ? undefined : JSON.stringify(body), + }) + if (!response.ok) { + throw new Error(`POST ${path} failed: ${response.status} ${await response.text()}`) + } + return (await response.json()) as { id: string } +} + +async function main() { + const [version, flag] = process.argv.slice(2) + if (!version || (flag !== undefined && flag !== '--live')) { + throw new Error('Usage: bun .scripts/release/announce.ts [--live]') + } + const live = flag === '--live' + const channelId = requireEnv('DISCORD_CHANNEL_ID') + + const changelog = JSON.parse(readFileSync(CHANGELOG_PATH, 'utf-8')) as Changelog + const entry = getChangelogEntry(changelog, version) + const roleIds = getReleasePings(version, entry).map(ping => requireEnv(ROLE_ENV_VARS[ping])) + const notes = renderReleaseNotes(readFileSync(TEMPLATE_PATH, 'utf-8'), version, entry, { + vars: { pings: roleIds.map(id => `<@&${id}>`).join(' ') }, + maxLength: MAX_TEXT_LENGTH, + breakingLabel: BREAKING_LABEL, + }) + + const message = await discordPost(`/channels/${channelId}/messages`, { + flags: IS_COMPONENTS_V2, + allowed_mentions: { parse: [], roles: live ? roleIds : [] }, + components: [ + { + type: 17, // Container + accent_color: ACCENT_COLOR, + components: [ + { type: 10, content: notes }, // Text Display + { + type: 1, // Action Row + components: [ + { + type: 2, + style: 5, + label: 'View on GitHub', + url: getReleaseUrl(version), + }, + ], + }, + ], + }, + ], + }) + console.log(`Posted v${version} announcement (message ${message.id}) to channel ${channelId}`) + + if (live) { + await discordPost(`/channels/${channelId}/messages/${message.id}/crosspost`) + console.log('Crossposted to following servers') + } +} + +await main() diff --git a/.scripts/release/releaseNotes.ts b/.scripts/release/releaseNotes.ts new file mode 100644 index 00000000..e6e72c0d --- /dev/null +++ b/.scripts/release/releaseNotes.ts @@ -0,0 +1,133 @@ +export interface ChangelogCategory { + title: string + list: string[] +} + +export interface ChangelogEntry { + title: string + author: string + date: string + categories: ChangelogCategory[] +} + +export type Changelog = Record + +export type ReleasePing = 'prerelease' | 'minor' | 'patch' | 'breaking' + +export interface RenderOptions { + /** Extra `{name}` template variables, such as `pings`. */ + vars?: Record + /** Drop changelog items from the end until the notes fit, noting that some were cut. */ + maxLength?: number + /** Replaces `[BREAKING]` in changelog items. */ + breakingLabel?: string +} + +const REPO_URL = 'https://github.com/Animated-Java/animated-java' +const BREAKING_TAG = '[BREAKING]' +const DEFAULT_BREAKING_LABEL = 'โš ๏ธ **BREAKING** โ€”' +const ESCAPE_URLS_MARKER = '[[ESCAPE_URLS]]' +const VERSION_REGEX = /^(\d+)\.(\d+)\.(\d+)(-.+)?$/ +// Skips URLs already wrapped in <>, so they aren't escaped twice. +const URL_REGEX = + /(? category.list.some(item => item.includes(BREAKING_TAG)))) + pings.push('breaking') + return pings +} + +function replaceTemplateVars(str: string, items: Record) { + return str.replace(/\{(.+?)\}/g, str => items[str.replace(/[\{\}]/g, '')] ?? str) +} + +function formatCategories(categories: ChangelogCategory[], breakingLabel: string) { + return categories + .filter(category => category.list.length > 0) + .map( + category => + `### ${category.title}\n\n` + + category.list + .map(item => '- ' + item.replaceAll(BREAKING_TAG, breakingLabel)) + .join('\n') + ) + .join('\n\n') +} + +/** Returns a copy of `categories` without its last item, or `undefined` if there are none left. */ +function dropLastItem(categories: ChangelogCategory[]) { + let index = categories.length - 1 + while (index >= 0 && categories[index].list.length === 0) index-- + if (index === -1) return + return categories.map((category, i) => + i === index ? { ...category, list: category.list.slice(0, -1) } : category + ) +} + +export function renderReleaseNotes( + template: string, + version: string, + entry: ChangelogEntry, + options: RenderOptions = {} +) { + const render = (categories: ChangelogCategory[], trimmed: boolean) => { + let formatted = formatCategories( + categories, + options.breakingLabel ?? DEFAULT_BREAKING_LABEL + ) + if (trimmed) { + formatted += `\n\n-# โ€ฆplus more in the [full release notes](${getReleaseUrl(version)})` + } + let content = replaceTemplateVars(template, { + ...options.vars, + version, + release_url: getReleaseUrl(version), + categories: formatted, + }) + if (content.includes(ESCAPE_URLS_MARKER)) { + content = content + .replace(ESCAPE_URLS_MARKER, '') + .replaceAll(URL_REGEX, match => `<${match}>`) + } + return content.trim() + '\n' + } + + let categories: ChangelogCategory[] | undefined = entry.categories + let notes = render(categories, false) + if (options.maxLength === undefined) return notes + + while (notes.length > options.maxLength) { + categories = dropLastItem(categories) + if (!categories) { + throw new Error( + `Release notes for ${version} don't fit in ${options.maxLength} characters, even with every changelog item removed` + ) + } + notes = render(categories, true) + } + return notes +} diff --git a/blockbench.config.mjs b/blockbench.config.mjs new file mode 100644 index 00000000..6e0084c1 --- /dev/null +++ b/blockbench.config.mjs @@ -0,0 +1,9 @@ +import { defineConfig } from '@snavesutit/jestbench' + +export default defineConfig({ + blockbenchVersion: 'latest', + environment: 'animated-java-tests', + // Built by `yarn prod` (the `test` script runs it first). The file name must + // stay in sync with `BBPlugin.register(PACKAGE.name)` in src/plugin.ts. + plugins: ['./dist/animated_java.js'], +}) diff --git a/bun.lock b/bun.lock index 0a05cac1..514da84b 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "animated_java", "dependencies": { + "block-model-renderer": "^2.15.2", "deepslate": "^0.19.2", "fflate": "^0.8.2", "generic-stream": "^3.0.1", @@ -13,10 +14,14 @@ "marked-gfm-heading-id": "^3.0.0", "request-progress": "^3.0.0", "svelte-ace": "^1.0.21", - "svelte-dnd-action": "^0.9.38", + "svelte-dnd-action": "^0.9.79", }, "devDependencies": { + "@jest/globals": "^30.5.1", "@novacbn/svelte-codejar": "^0.1.2", + "@snavesutit/jestbench": "^0.2.1", + "@swc/core": "^1.16.1", + "@swc/jest": "^0.2.39", "@types/download": "^8.0.5", "@types/eslint": "^8.21.1", "@types/js-yaml": "^4.0.5", @@ -24,9 +29,9 @@ "@types/websocket": "^1.0.10", "@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/parser": "^5.54.0", - "blockbench-patch-manager": "^1.1.0", - "book-and-quill": "^1.0.10", - "esbuild": "^0.17.10", + "blockbench-patch-manager": "^1.3.0", + "book-and-quill": "^1.1.0", + "esbuild": "^0.21.5", "esbuild-plugin-import-folder": "^1.0.1", "esbuild-plugin-import-glob": "^0.1.1", "esbuild-plugin-inline-image": "^0.0.9", @@ -35,12 +40,14 @@ "eslint": "^9.37.0", "eslint-plugin-svelte": "^3.12.4", "firebase": "^9.19.0", + "jest": "^30", "jiti": "^2.6.1", "js-yaml": "^4.1.0", "mc-build": "^4.1.3", "node-modules-vscode-problems-patch": "^1.0.9", "octokit": "^5.0.3", "prettier": "^3.8.2", + "prettier-plugin-svelte": "^4.1.1", "simple-subpub": "^1.2.0", "svelte": "^5.55.3", "svelte-awesome-color-picker": "^3.0.0-beta.7", @@ -52,74 +59,148 @@ "svelte-preprocess-esbuild": "^3.0.1", "typescript": "^6.0.2", "typescript-eslint": "^8.45.0", - "vitest": "^3.2.4", }, }, }, + "trustedDependencies": [ + "electron", + "esbuild", + "sharp", + ], "packages": { "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], + + "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], + + "@babel/generator": ["@babel/generator@7.29.8", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="], + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.24.1", "", {}, "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ=="], "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.24.5", "", {}, "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA=="], - "@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], + + "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], + + "@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], + + "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="], + + "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="], + + "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="], + + "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg=="], + + "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="], + + "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="], + + "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="], + + "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="], + + "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="], + + "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="], + + "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="], + + "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="], + + "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="], + + "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA=="], + + "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], + + "@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="], "@babel/types": ["@babel/types@7.24.5", "", { "dependencies": { "@babel/helper-string-parser": "^7.24.1", "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" } }, "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ=="], + "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="], + + "@cronvel/get-pixels": ["@cronvel/get-pixels@3.4.1", "", { "dependencies": { "jpeg-js": "^0.4.4", "ndarray": "^1.0.19", "ndarray-pack": "^1.1.1", "node-bitmap": "0.0.1", "omggif": "^1.0.10", "pngjs": "^6.0.0" } }, "sha512-gB5C5nDIacLUdsMuW8YsM9SzK3vaFANe4J11CVXpovpy7bZUGrcJKmc6m/0gWG789pKr6XSZY2aEetjFvSRw5g=="], + "@electron/get": ["@electron/get@2.0.3", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w=="], + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.17.19", "", { "os": "android", "cpu": "arm" }, "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.17.19", "", { "os": "android", "cpu": "arm64" }, "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.17.19", "", { "os": "android", "cpu": "x64" }, "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.17.19", "", { "os": "darwin", "cpu": "arm64" }, "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.17.19", "", { "os": "darwin", "cpu": "x64" }, "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.17.19", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.17.19", "", { "os": "freebsd", "cpu": "x64" }, "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.17.19", "", { "os": "linux", "cpu": "arm" }, "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.17.19", "", { "os": "linux", "cpu": "arm64" }, "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.17.19", "", { "os": "linux", "cpu": "ia32" }, "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.17.19", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.17.19", "", { "os": "linux", "cpu": "none" }, "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.17.19", "", { "os": "linux", "cpu": "s390x" }, "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.17.19", "", { "os": "linux", "cpu": "x64" }, "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.17.19", "", { "os": "none", "cpu": "x64" }, "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.10", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.17.19", "", { "os": "openbsd", "cpu": "x64" }, "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.10", "", { "os": "none", "cpu": "arm64" }, "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.17.19", "", { "os": "sunos", "cpu": "x64" }, "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.17.19", "", { "os": "win32", "cpu": "arm64" }, "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.17.19", "", { "os": "win32", "cpu": "ia32" }, "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.17.19", "", { "os": "win32", "cpu": "x64" }, "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], @@ -235,12 +316,108 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="], "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@istanbuljs/load-nyc-config": ["@istanbuljs/load-nyc-config@1.1.0", "", { "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.6", "", {}, "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw=="], + + "@jest/console": ["@jest/console@30.5.1", "", { "dependencies": { "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", "jest-message-util": "30.5.1", "jest-util": "30.5.1", "slash": "^3.0.0" } }, "sha512-u5Ncuc+gXVUwjNMFQOnphHo2Qx2DxyC8Dvpmf4HCx4y0kvSkRRNiQYRixrvOP4V7y52JcSuNxqochCt0PpdHVg=="], + + "@jest/core": ["@jest/core@30.5.1", "", { "dependencies": { "@jest/console": "30.5.1", "@jest/pattern": "30.5.0", "@jest/reporters": "30.5.1", "@jest/test-result": "30.5.1", "@jest/transform": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-changed-files": "30.5.1", "jest-config": "30.5.1", "jest-haste-map": "30.5.1", "jest-message-util": "30.5.1", "jest-regex-util": "30.5.0", "jest-resolve": "30.5.1", "jest-resolve-dependencies": "30.5.1", "jest-runner": "30.5.1", "jest-runtime": "30.5.1", "jest-snapshot": "30.5.1", "jest-util": "30.5.1", "jest-validate": "30.5.1", "jest-watcher": "30.5.1", "pretty-format": "30.5.1", "slash": "^3.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-BL9g6CJUUhIbdoAflz/Va658erSSXUIvU8XUYiWNTbZljJjZ5yaC9EJ9/dQ19rpbYV3ZOK4sBACqhPaTyhoUIA=="], + + "@jest/create-cache-key-function": ["@jest/create-cache-key-function@30.5.1", "", { "dependencies": { "@jest/types": "30.5.1" } }, "sha512-5qkif//qhlbt54255O/M2JtUZNlnefOzE12bi7FlApOIYO4pqrZcAwhNCfP4jOGFubez8uoLgY9czWFjYY57ow=="], + + "@jest/diff-sequences": ["@jest/diff-sequences@30.5.0", "", {}, "sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg=="], + + "@jest/environment": ["@jest/environment@30.5.1", "", { "dependencies": { "@jest/fake-timers": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "jest-mock": "30.5.1" } }, "sha512-eYJAkOsrpwDXPcoLNEG6lN9Zo3Cy35pxnVQD74vyIfsi/Q8wB/lZFsEjU4wrecOgT4ZviQDZaX/cFIJyMdMxTw=="], + + "@jest/expect": ["@jest/expect@30.5.1", "", { "dependencies": { "expect": "30.5.1", "jest-snapshot": "30.5.1" } }, "sha512-uOGd40P/COyUp9xHf5jeGiGJC2/ANg+2+Tk9/xN5/LxmlY/r/gxsPrx3DTEtaRZsLAX4wgNSLEDELZ5bmVs2bA=="], + + "@jest/expect-utils": ["@jest/expect-utils@30.5.1", "", { "dependencies": { "@jest/get-type": "30.5.0" } }, "sha512-WcRWhHQdTMRDpyWKZ/6MINBmovI7zeD+bL8wFjCncRV3NQOwKy1X45IfyblfHR4k/XciIlNEdFL9QjFO+HNKOg=="], + + "@jest/fake-timers": ["@jest/fake-timers@30.5.1", "", { "dependencies": { "@jest/types": "30.5.1", "@sinonjs/fake-timers": "^15.4.0", "@types/node": "*", "jest-message-util": "30.5.1", "jest-mock": "30.5.1", "jest-util": "30.5.1" } }, "sha512-rEkV6YzpBXo/L9cnj2ibyuYZuyGiNWaPUsyCu3HYJbqCV4jnEiKmf7hId20z8eKjZ0JQ9jtIYKxRSmYB/OYSsA=="], + + "@jest/get-type": ["@jest/get-type@30.5.0", "", {}, "sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q=="], + + "@jest/globals": ["@jest/globals@30.5.1", "", { "dependencies": { "@jest/environment": "30.5.1", "@jest/expect": "30.5.1", "@jest/types": "30.5.1", "jest-mock": "30.5.1" } }, "sha512-VhqvQ251XIC7pk46YymI3HCeBLOdvriDw9zibekodAHEwoVvbVVgpU5H13GvmyOAzxtZCfsm1uvzqkaqJf2I+g=="], + + "@jest/pattern": ["@jest/pattern@30.5.0", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.5.0" } }, "sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w=="], + + "@jest/react-is-18": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "@jest/react-is-19": ["react-is@19.2.8", "", {}, "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ=="], + + "@jest/reporters": ["@jest/reporters@30.5.1", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "30.5.1", "@jest/test-result": "30.5.1", "@jest/transform": "30.5.1", "@jest/types": "30.5.1", "@jridgewell/trace-mapping": "^0.3.31", "@types/node": "*", "chalk": "^4.1.2", "collect-v8-coverage": "^1.0.2", "exit-x": "^0.2.2", "glob": "^13.0.6", "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "30.5.1", "jest-util": "30.5.1", "jest-worker": "30.5.1", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-RbUXIfv85KxitJn4l3MpAoMilkvXe2QCO5lXxHWftywo/VdZ5vkEoHRDgphcxP6qmoIkUaN8/UZj6NhdkIFdJg=="], + + "@jest/schemas": ["@jest/schemas@30.5.0", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg=="], + + "@jest/snapshot-utils": ["@jest/snapshot-utils@30.5.1", "", { "dependencies": { "@jest/types": "30.5.1", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" } }, "sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw=="], + + "@jest/source-map": ["@jest/source-map@30.5.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "callsites": "^3.1.0", "convert-source-map": "^2.0.0", "graceful-fs": "^4.2.11" } }, "sha512-xWpTJP9D0bDFGbPGT8XuWSwwha/iHADyyKzUnMx4UbdgnHugxrDaQFO4RZ8x4ZsFzRP6pNii8uvlgKCDxCIuDg=="], + + "@jest/test-result": ["@jest/test-result@30.5.1", "", { "dependencies": { "@jest/console": "30.5.1", "@jest/types": "30.5.1", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" } }, "sha512-A/1S6ZBdpic50E0pxLgvaB9XNPL4k7AksmG69OO2oiotxciWZwHkbOec+qbIi+uUtIIByOVlXJUl97oZUsz+Jw=="], + + "@jest/test-sequencer": ["@jest/test-sequencer@30.5.1", "", { "dependencies": { "@jest/test-result": "30.5.1", "graceful-fs": "^4.2.11", "jest-haste-map": "30.5.1", "slash": "^3.0.0" } }, "sha512-SHcPnrjdVRYJv6y6l4JUTy4Jccu7zmO6BmiOfOA34UiVBto22s19WiDC0A/2qfM7MWB/qdcoqfSIRMitpjTT4A=="], + + "@jest/transform": ["@jest/transform@30.5.1", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/types": "30.5.1", "@jridgewell/trace-mapping": "^0.3.31", "babel-plugin-istanbul": "^8.0.0", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-haste-map": "30.5.1", "jest-regex-util": "30.5.0", "jest-util": "30.5.1", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" } }, "sha512-EDnDhn0jleU9ZhpVoA4gvqw+Ev0iw/r5upNT2b79RiwiaTiYAMMhvNJP3lmocjIe5J2ZkoNr0B3K/J6O5GIm4Q=="], + + "@jest/types": ["@jest/types@30.5.1", "", { "dependencies": { "@jest/pattern": "30.5.0", "@jest/schemas": "30.5.0", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], @@ -253,6 +430,8 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.3", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], @@ -261,6 +440,10 @@ "@novacbn/svelte-codejar": ["@novacbn/svelte-codejar@0.1.2", "", { "dependencies": { "codejar": "^3.5.0", "svelte": "^3.42.3" } }, "sha512-lZd6r+dbdU+zN8d4QW005QEmTT6WDKjpTXvbPIcqIWGSnbWBVoEMFPOwJ0C3PYM4hHAjb2GHF4DBywlWQogNLw=="], + "@npmcli/agent": ["@npmcli/agent@2.2.2", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og=="], + + "@npmcli/fs": ["@npmcli/fs@3.1.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg=="], + "@octokit/app": ["@octokit/app@16.1.0", "", { "dependencies": { "@octokit/auth-app": "^8.1.0", "@octokit/auth-unauthenticated": "^7.0.1", "@octokit/core": "^7.0.2", "@octokit/oauth-app": "^8.0.1", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/types": "^14.0.0", "@octokit/webhooks": "^14.0.0" } }, "sha512-OdKHnm0CYLk8Setr47CATT4YnRTvWkpTYvE+B/l2B0mjszlfOIit3wqPHVslD2jfc1bD4UbO7Mzh6gjCuMZKsA=="], "@octokit/auth-app": ["@octokit/auth-app@8.1.0", "", { "dependencies": { "@octokit/auth-oauth-app": "^9.0.1", "@octokit/auth-oauth-user": "^6.0.0", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "toad-cache": "^3.7.0", "universal-github-app-jwt": "^2.2.0", "universal-user-agent": "^7.0.0" } }, "sha512-6bWhyvLXqCSfHiqlwzn9pScLZ+Qnvh/681GR/UEEPCMIVwfpRDBw0cCzy3/t2Dq8B7W2X/8pBgmw6MOiyE0DXQ=="], @@ -311,6 +494,36 @@ "@octokit/webhooks-methods": ["@octokit/webhooks-methods@6.0.0", "", {}, "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ=="], + "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@pkgr/core": ["@pkgr/core@0.3.6", "", {}, "sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA=="], + "@polka/url": ["@polka/url@1.0.0-next.25", "", {}, "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ=="], "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], @@ -333,65 +546,71 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.52.4", "", { "os": "android", "cpu": "arm" }, "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.52.4", "", { "os": "android", "cpu": "arm64" }, "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w=="], + "@puppeteer/browsers": ["@puppeteer/browsers@2.6.1", "", { "dependencies": { "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.52.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg=="], + "@sinclair/typebox": ["@sinclair/typebox@0.34.52", "", {}, "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.52.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw=="], + "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.52.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ=="], + "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.52.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw=="], + "@sinonjs/fake-timers": ["@sinonjs/fake-timers@15.4.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.1" } }, "sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ=="], + "@snavesutit/jestbench": ["@snavesutit/jestbench@0.2.1", "", { "dependencies": { "envbench": "^4.1.0", "jest-environment-node": ">=29 <31", "jiti": "^2.7.0", "puppeteer-core": "^23.11.1" }, "peerDependencies": { "jest": ">=29 <31" } }, "sha512-qLiX6r2GP7gSHz1S/RfykVR/0BzJPqE+7F9F524rz5zvaFm0hzblwj7xcv37Dssen9qDqM9WQJLSnpz9pmjeQQ=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.52.4", "", { "os": "linux", "cpu": "arm" }, "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", {}, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg=="], + "@swc/core": ["@swc/core@1.16.1", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.28" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.16.1", "@swc/core-darwin-x64": "1.16.1", "@swc/core-linux-arm-gnueabihf": "1.16.1", "@swc/core-linux-arm64-gnu": "1.16.1", "@swc/core-linux-arm64-musl": "1.16.1", "@swc/core-linux-ppc64-gnu": "1.16.1", "@swc/core-linux-s390x-gnu": "1.16.1", "@swc/core-linux-x64-gnu": "1.16.1", "@swc/core-linux-x64-musl": "1.16.1", "@swc/core-win32-arm64-msvc": "1.16.1", "@swc/core-win32-ia32-msvc": "1.16.1", "@swc/core-win32-x64-msvc": "1.16.1" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-nUaeu91O5QZKrQdaDCHd402ogUIoNOOjpkZNq0UomWK0G6gDaGmLhvddF1/3BXf5O8aLyo6ZPY/aMDWvaJQ/hg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.52.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g=="], + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.16.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zlJblJ8ncErD43lKdxjbUaUskJQf+LxiPXYcWXD8/8ZMV+7uuAT+CwjciLXpyZBd5Pq/S726bMpeeAwSeL1hhg=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ=="], + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.16.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-IN0BmPWb0YAh/17mmlWB/HDBtTw2MfuW4hulf/tQAgTQBRH17l+z499bNJLK6LizSjqs0P7V+jU38Zj+vJC1DA=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.52.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g=="], + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.16.1", "", { "os": "linux", "cpu": "arm" }, "sha512-EYgrx2YOCQ2Twz2S793kqNjPkpvYVUPzzR95bIb7by+VQcyaai4lZZ2iz/tZvcFVKSNcN3/JTKwx+aBn2ZL52A=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg=="], + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.16.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-moyKm0YZlHdHohzm1YwgAyesqnE853rO0REMfJLFAova51wF9BNi+3ZW2PeS7Vqvn6HeJuepLpAHbBdZctxpHA=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.52.4", "", { "os": "linux", "cpu": "none" }, "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA=="], + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.16.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-kKGBO9wdapiSzuf5ZzZ2fYtlu1BNSYtIIUxvH1ir/gcelTOREEHGDCLTDFx/2Knf878nU11A40z7LxwasEFxqA=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.52.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA=="], + "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.16.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nZ6qahtLxC3PM54cWOQZHxt4lTCF/3J4LIoWWzz6v7A+rLs8Dx54anYQf7mH3eIi8KlNpgKci/ie8ZSqFN8O7A=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg=="], + "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.16.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-4ji5PNzhYq193Z4/4xUaSoNJza6iCkDJSzhetrbB6KOYxsr+kxtQr8ePWhMJUiMt6JUWtXaZ1PYT8FhtED+nGA=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.52.4", "", { "os": "linux", "cpu": "x64" }, "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw=="], + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.16.1", "", { "os": "linux", "cpu": "x64" }, "sha512-VJQxqrisHV+B394IgrOu8YsIIXZgffnf5tO+yc9Z/hoUpuZEvuQTjWwlnpZdpyD+0nx6LTD1/3k646JYm43yJA=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.52.4", "", { "os": "none", "cpu": "arm64" }, "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA=="], + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.16.1", "", { "os": "linux", "cpu": "x64" }, "sha512-r9oV1mwxxsIGcLV1IQ/tw76MW3doatKze1QFWuC+a7QqJUkhY/bKTSVk6NpKKUGm2LDsE33Va8VqSClfA7vSiQ=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.52.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ=="], + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.16.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-6huNRessoBLxWEqBm5zJXyCQ27TO7anvkdiuQ5MDO4CJni0nOXEqKtV9RllQ2TdyENKKsUMXVnIfW2hIXx/R5Q=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.52.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw=="], + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.16.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-OVKJFUzphrGmsh+BGtcZDesx0YryV7/Yvy5XGgTqnrZfjnyfcr5uaqYQugCckdIlupc5Vs3XtDjRAj12z4ZPlw=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ=="], + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.16.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Bt+VIhWYCGk4urklnkkteLUOeLv1VxigwTCeB/xC6rBZxY6IIKdDwCJf6on3E3SUGsIqmQS6QqtuJQc1VxF4Aw=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.52.4", "", { "os": "win32", "cpu": "x64" }, "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w=="], + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], - "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], + "@swc/jest": ["@swc/jest@0.2.39", "", { "dependencies": { "@jest/create-cache-key-function": "^30.0.0", "@swc/counter": "^0.1.3", "jsonc-parser": "^3.2.0" }, "peerDependencies": { "@swc/core": "*" } }, "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA=="], - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.9", "", {}, "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA=="], + "@swc/types": ["@swc/types@0.1.28", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw=="], "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], + "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], + "@types/aws-lambda": ["@types/aws-lambda@8.10.152", "", {}, "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw=="], - "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], - "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], - "@types/decompress": ["@types/decompress@4.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g=="], + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], - "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], + "@types/decompress": ["@types/decompress@4.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-9z+8yjKr5Wn73Pt17/ldnmQToaFHZxK0N1GHysuk/JIPT8RIdQeoInM01wWPgypRcvb6VH1drjuFpQ4zmY437g=="], "@types/dompurify": ["@types/dompurify@3.0.5", "", { "dependencies": { "@types/trusted-types": "*" } }, "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg=="], @@ -405,6 +624,12 @@ "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], + + "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="], + + "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], + "@types/jquery": ["@types/jquery@3.5.34", "", { "dependencies": { "@types/sizzle": "*" } }, "sha512-3m3939S3erqmTLJANS/uy0B6V7BorKx7RorcGZVjZ62dF5PAGbKEDZK1CuLtKombJkFA2T1jl8LAIIs7IV6gBQ=="], "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], @@ -425,6 +650,8 @@ "@types/sizzle": ["@types/sizzle@2.3.8", "", {}, "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg=="], + "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="], + "@types/three": ["@types/three@0.129.2", "", {}, "sha512-fZDNRtUFnq3baNjDiAzi4QoHYcczWtEdsduH/tpiwk91fbVk8COJiT/iLoN3tIOjLKMySoYsjUfP0VTmUfZKLw=="], "@types/tinycolor2": ["@types/tinycolor2@1.4.6", "", {}, "sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw=="], @@ -435,6 +662,10 @@ "@types/websocket": ["@types/websocket@1.0.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww=="], + "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="], + + "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], + "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@5.62.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/type-utils": "5.62.0", "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag=="], @@ -457,53 +688,131 @@ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="], - "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.4.0", "", {}, "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ=="], + + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.12.2", "", { "os": "android", "cpu": "arm" }, "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w=="], + + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.12.2", "", { "os": "android", "cpu": "arm64" }, "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ=="], + + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.12.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.12.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.12.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2", "", { "os": "linux", "cpu": "arm" }, "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.12.2", "", { "os": "linux", "cpu": "arm" }, "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.12.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg=="], - "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" } }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.12.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA=="], - "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + "@unrs/resolver-binding-linux-loong64-gnu": ["@unrs/resolver-binding-linux-loong64-gnu@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q=="], - "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + "@unrs/resolver-binding-linux-loong64-musl": ["@unrs/resolver-binding-linux-loong64-musl@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew=="], - "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.12.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg=="], - "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A=="], - "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.12.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.12.2", "", { "os": "linux", "cpu": "x64" }, "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.12.2", "", { "os": "linux", "cpu": "x64" }, "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A=="], + + "@unrs/resolver-binding-openharmony-arm64": ["@unrs/resolver-binding-openharmony-arm64@1.12.2", "", { "os": "none", "cpu": "arm64" }, "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.12.2", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.12.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.12.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.12.2", "", { "os": "win32", "cpu": "x64" }, "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA=="], "@vue/compiler-sfc": ["@vue/compiler-sfc@2.7.14", "", { "dependencies": { "@babel/parser": "^7.18.4", "postcss": "^8.4.14", "source-map": "^0.6.1" } }, "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA=="], + "abbrev": ["abbrev@2.0.0", "", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="], + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", {}, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + + "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="], + "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], - "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], + "b4a": ["b4a@1.8.1", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="], + + "babel-jest": ["babel-jest@30.5.1", "", { "dependencies": { "@jest/transform": "30.5.1", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^8.0.0", "babel-preset-jest": "30.5.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-0" } }, "sha512-ge1xUVZS91ml09YRMgRGgeKJ4YJpcOiuwteAxFBYLugQyp7cRw+hHej6Ho0vPjvLrjq60bb7JPHH9LAMA1/krA=="], + + "babel-plugin-istanbul": ["babel-plugin-istanbul@8.0.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-instrument": "^6.0.2", "test-exclude": "^7.0.1" } }, "sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg=="], + + "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@30.5.0", "", { "dependencies": { "@types/babel__core": "^7.20.5" } }, "sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A=="], + + "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="], + + "babel-preset-jest": ["babel-preset-jest@30.5.0", "", { "dependencies": { "babel-plugin-jest-hoist": "30.5.0", "babel-preset-current-node-syntax": "^1.2.0" }, "peerDependencies": { "@babel/core": "^7.11.0 || ^8.0.0-beta.1 || ^8.0.0" } }, "sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "bare-events": ["bare-events@2.9.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA=="], + + "bare-fs": ["bare-fs@4.8.1", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4", "bare-url": "^2.2.2", "fast-fifo": "^1.3.2" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg=="], + + "bare-path": ["bare-path@3.1.2", "", {}, "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw=="], + + "bare-stream": ["bare-stream@2.13.4", "", { "dependencies": { "b4a": "^1.8.1", "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "optionalPeers": ["bare-abort-controller", "bare-buffer", "bare-events"] }, "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA=="], + + "bare-url": ["bare-url@2.5.3", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-3absfEzoyFosWT8v83ZcJgbTJxv+S/sI7jBfeCMlUVatSaefRmwweqBhFpMllQv+HTxs/FbbToVOw1c05NORkQ=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.20", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw=="], + + "basic-ftp": ["basic-ftp@5.3.1", "", {}, "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw=="], + "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], - "blockbench-patch-manager": ["blockbench-patch-manager@1.1.0", "", { "dependencies": { "blockbench-types": "^5.1.0-beta.1", "simple-subpub": "^1.2.0", "svelte": "^5.46.3", "svelte-observable-store": "^1.0.1", "svelte-preprocess": "^6.0.3", "svelte-preprocess-esbuild": "^3.0.1" }, "peerDependencies": { "typescript": "^5" } }, "sha512-68FXezYJ3HdkVcam90r/MY8W2gS8jZeitfUz3XXnC/XyDkHJZlLr8dpFJmJrrUqUSBVRG7wweOhbs/tn+znotQ=="], + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bit-twiddle": ["bit-twiddle@1.0.2", "", {}, "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA=="], + + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], + + "block-model-renderer": ["block-model-renderer@2.15.2", "", { "dependencies": { "gl": "^8.1.6", "headless-three": "^1.8.1", "sharp": "^0.34.5", "skia-canvas": "^3.0.8" }, "peerDependencies": { "three": ">=0.152.0" }, "optionalPeers": ["three"] }, "sha512-xE2LcLsKh9GX9injZ4dButM/l0zE8ds3IBOcW4QYm/JXz8g/tt1UZMtcvuRDIoxK35/w5ys1R01LVUfndtO2bg=="], + + "blockbench-patch-manager": ["blockbench-patch-manager@1.3.0", "", { "dependencies": { "blockbench-types": "^5.1.0-beta.1", "simple-subpub": "^1.2.0", "svelte": "^5.46.3", "svelte-observable-store": "^1.0.1", "svelte-preprocess": "^6.0.3", "svelte-preprocess-esbuild": "^3.0.1" }, "peerDependencies": { "typescript": "^5" } }, "sha512-ZbygREV2TdfyPIsb5b3ylYaFOziF5U2Io/oycw0x1NduFMaBIe1/OGPeSx29ws7Jtt/MukMZ5/tsORf/ronWDA=="], "blockbench-types": ["blockbench-types@5.1.0", "", { "dependencies": { "@babel/types": "^7.20.7", "@types/dompurify": "^3.0.5", "@types/jquery": "^3.5.32", "@types/prismjs": "^1.26.0", "@types/three": "^0.129.2", "@types/tinycolor2": "^1.4.6", "dompurify": "^3.0.1", "electron": "^40.8.0", "prismjs": "^1.29.0", "tinycolor2": "^1.6.0", "typescript": "^5.8.3", "vue": "2.7.14", "wintersky": "^1.3.0" } }, "sha512-JLMHJZ+2J7aFQwSacfW4N/rvd56JRqvaBsHNH2R6sjyxkwKPuNPKYIeav/WtRXnq3dmlsEoH3rtg09s7yhe3sg=="], - "book-and-quill": ["book-and-quill@1.0.10", "", { "dependencies": { "@types/node": "^25.3.3", "tinycolor2": "^1.6.0" }, "peerDependencies": { "typescript": "^5" } }, "sha512-9NaTEOmnJM8GPJVsdvl8Th9peju97KgvAtWPhya3v+IGI4hAafpdpuVoIlCK7TjHkHjIqKJ2HLYmcJX2qd4kEQ=="], + "book-and-quill": ["book-and-quill@1.1.0", "", { "dependencies": { "@types/node": "^25.3.3", "tinycolor2": "^1.6.0" }, "peerDependencies": { "typescript": "^5" } }, "sha512-xYHwKKunplZRHyrwX7BnYCrufVxeMR2VgLT+aTOsHoLSUNT34RkxyY26FwIDlqCejkEH81kMsAtuvOecEcba6A=="], "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], @@ -515,9 +824,15 @@ "braces": ["braces@3.0.2", "", { "dependencies": { "fill-range": "^7.0.1" } }, "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A=="], + "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], + + "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="], + + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + "cacache": ["cacache@18.0.4", "", { "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" } }, "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ=="], "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], @@ -525,24 +840,42 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="], + "charenc": ["charenc@0.0.2", "", {}, "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA=="], - "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "chroma-js": ["chroma-js@2.6.0", "", {}, "sha512-BLHvCB9s8Z1EV4ethr6xnkl/P2YRFOGqfgvuMG/MyCbZPrTA+NeiByY6XvgF0zP4/2deU2CXnWyMa3zu1LqQ3A=="], + + "chromium-bidi": ["chromium-bidi@0.11.0", "", { "dependencies": { "mitt": "3.0.1", "zod": "3.23.8" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA=="], + + "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], + + "cjs-module-lexer": ["cjs-module-lexer@2.2.1", "", {}, "sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q=="], - "cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + "clean-stack": ["clean-stack@2.2.0", "", {}, "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="], + "code-red": ["code-red@1.0.4", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15", "@types/estree": "^1.0.1", "acorn": "^8.10.0", "estree-walker": "^3.0.3", "periscopic": "^3.1.0" } }, "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw=="], "codejar": ["codejar@3.7.0", "", {}, "sha512-rqyDu2zNwfu1EhXI++LEMQDzhykS+V0BV52RemtCj5lczgTgWSufyEa+tS7RP7qCXH/WXOkU0eIthmFUzvG78Q=="], + "collect-v8-coverage": ["collect-v8-coverage@1.0.3", "", {}, "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw=="], + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -551,12 +884,20 @@ "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + "compare-versions": ["compare-versions@6.1.1", "", {}, "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "console-clear": ["console-clear@1.1.1", "", {}, "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "crypt": ["crypt@0.0.2", "", {}, "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="], @@ -567,14 +908,22 @@ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "cwise-compiler": ["cwise-compiler@1.1.3", "", { "dependencies": { "uniq": "^1.0.0" } }, "sha512-WXlK/m+Di8DMMcCjcWr4i+XzcQra9eCdXIJrgh4TUgh0pIS/yJduLxS9JgefsHJ/YVLdgPtXm9r62W92MvanEQ=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="], + "debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="], "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], - "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="], + + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + "deepslate": ["deepslate@0.19.2", "", { "dependencies": { "gl-matrix": "^3.3.0", "md5": "^2.3.0", "pako": "^2.0.3" } }, "sha512-sDOjpBXv5WBMmtsquJGNhOoZJKm4ra7pzzQP7FjNJHbZwoL+qlzrsfId4OU3C9WtfC6e0+2mcH+kd3KL5mjrSg=="], "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], @@ -583,12 +932,20 @@ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="], + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="], + "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], "devalue": ["devalue@5.7.1", "", {}, "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA=="], + "devtools-protocol": ["devtools-protocol@0.0.1367902", "", {}, "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg=="], + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], "dompurify": ["dompurify@3.1.3", "", {}, "sha512-5sOWYSNPaxz6o2MUPvtyxTTqR4D3L77pr5rUQoWgD5ROQtVIZQgJkXbo1DLlK3vj11YGw5+LnF4SYti4gZmwng=="], @@ -597,21 +954,33 @@ "electron": ["electron@40.8.5", "", { "dependencies": { "@electron/get": "^2.0.0", "@types/node": "^24.9.0", "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" } }, "sha512-pgTY/VPQKaiU4sTjfU96iyxCXrFm4htVPCMRT4b7q9ijNTRgtLmLvcmzp2G4e7xDrq9p7OLHSmu1rBKFf6Y1/A=="], - "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "electron-to-chromium": ["electron-to-chromium@1.5.420", "", {}, "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA=="], + + "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="], + + "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "envbench": ["envbench@4.1.0", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^13.1.0", "compare-versions": "^6.1.1", "strip-ansi": "^7.1.0", "terminal-kit": "^3.1.1", "wrap-ansi": "^9.0.0", "yaml": "^2.8.2" }, "bin": { "envbench": "dist/cli.js" } }, "sha512-e7W0h91CLhser6SEqd3tKWvsE8rTwTpyuqwNUYU+OikeHVLx1ZpsfgMJU5NzXgCfhXeuGitPXjd/o/KDwPOUsQ=="], + + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], + "es-define-property": ["es-define-property@1.0.0", "", { "dependencies": { "get-intrinsic": "^1.2.4" } }, "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + "es-module-lexer": ["es-module-lexer@2.3.2", "", {}, "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw=="], "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], - "esbuild": ["esbuild@0.17.19", "", { "optionalDependencies": { "@esbuild/android-arm": "0.17.19", "@esbuild/android-arm64": "0.17.19", "@esbuild/android-x64": "0.17.19", "@esbuild/darwin-arm64": "0.17.19", "@esbuild/darwin-x64": "0.17.19", "@esbuild/freebsd-arm64": "0.17.19", "@esbuild/freebsd-x64": "0.17.19", "@esbuild/linux-arm": "0.17.19", "@esbuild/linux-arm64": "0.17.19", "@esbuild/linux-ia32": "0.17.19", "@esbuild/linux-loong64": "0.17.19", "@esbuild/linux-mips64el": "0.17.19", "@esbuild/linux-ppc64": "0.17.19", "@esbuild/linux-riscv64": "0.17.19", "@esbuild/linux-s390x": "0.17.19", "@esbuild/linux-x64": "0.17.19", "@esbuild/netbsd-x64": "0.17.19", "@esbuild/openbsd-x64": "0.17.19", "@esbuild/sunos-x64": "0.17.19", "@esbuild/win32-arm64": "0.17.19", "@esbuild/win32-ia32": "0.17.19", "@esbuild/win32-x64": "0.17.19" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw=="], + "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], "esbuild-plugin-import-folder": ["esbuild-plugin-import-folder@1.0.1", "", { "dependencies": { "eslint": "^9.38.0" } }, "sha512-vT3o+n7erSczdhTXpoL1Kuh0LCpysiEnLTMJYTgEI5MF72Rm22bJeM5AmltADBE8BM3ebG0l4+1CsDdwXoUh/A=="], @@ -627,6 +996,8 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], + "eslint": ["eslint@9.37.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.4.0", "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.37.0", "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig=="], "eslint-plugin-svelte": ["eslint-plugin-svelte@3.12.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.6.1", "@jridgewell/sourcemap-codec": "^1.5.0", "esutils": "^2.0.3", "globals": "^16.0.0", "known-css-properties": "^0.37.0", "postcss": "^8.4.49", "postcss-load-config": "^3.1.4", "postcss-safe-parser": "^7.0.0", "semver": "^7.6.3", "svelte-eslint-parser": "^1.3.0" } }, "sha512-hD7wPe+vrPgx3U2X2b/wyTMtWobm660PygMGKrWWYTc9lvtY8DpNFDaU2CJQn1szLjGbn/aJ3g8WiXuKakrEkw=="], @@ -639,6 +1010,8 @@ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], "esrap": ["esrap@2.2.5", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig=="], @@ -651,7 +1024,17 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="], + "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="], + + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "exit-x": ["exit-x@0.2.2", "", {}, "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ=="], + + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "expect": ["expect@30.5.1", "", { "dependencies": { "@jest/expect-utils": "30.5.1", "@jest/get-type": "30.5.0", "jest-matcher-utils": "30.5.1", "jest-message-util": "30.5.1", "jest-mock": "30.5.1", "jest-util": "30.5.1" } }, "sha512-m8YrYgvKe9+9gEnWEuKz+qCGfHqkrff7PPfyDnOFkjsfYRKqiYyOxDFMFieCGAuhtk/VNm63tvNgKZVzVy+Hvg=="], + + "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="], "extract-zip": ["extract-zip@2.0.1", "", { "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "optionalDependencies": { "@types/yauzl": "^2.9.1" }, "bin": { "extract-zip": "cli.js" } }, "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg=="], @@ -659,6 +1042,8 @@ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="], + "fast-glob": ["fast-glob@3.3.2", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow=="], "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], @@ -669,14 +1054,18 @@ "faye-websocket": ["faye-websocket@0.11.4", "", { "dependencies": { "websocket-driver": ">=0.5.1" } }, "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g=="], + "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], + "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="], - "fdir": ["fdir@6.5.0", "", {}, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + "fill-range": ["fill-range@7.0.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ=="], "find-cache-dir": ["find-cache-dir@3.3.2", "", { "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" } }, "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig=="], @@ -689,28 +1078,44 @@ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "follow-redirects": ["follow-redirects@1.16.0", "", {}, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "form-data": ["form-data@2.5.2", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12", "safe-buffer": "^5.2.1" } }, "sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q=="], + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + "fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], "generic-stream": ["generic-stream@3.0.1", "", {}, "sha512-hO6I0xmqm1FlIu51S5DCZPliLRACckiKlvjx654tC3YB10y43I8szT5ZkLOsmnL+N/hVzbGhXzopnRl9prhNtg=="], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + "get-intrinsic": ["get-intrinsic@1.2.4", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" } }, "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ=="], + "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="], + "get-port": ["get-port@3.2.0", "", {}, "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg=="], "get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], + "gl": ["gl@8.1.6", "", { "dependencies": { "bindings": "^1.5.0", "bit-twiddle": "^1.0.2", "glsl-tokenizer": "^2.1.5", "nan": "^2.22.0", "node-abi": "^3.71.0", "node-gyp": "^10.2.0", "prebuild-install": "^7.1.2" } }, "sha512-BcvkgW+jWiX2SjTddgq4lOfkFmeiKE/n1N3zFnq/JlSwemIvQvH1rLURz5oMdfp4ZT5bzseuIOE608zQI0DRYA=="], + "gl-matrix": ["gl-matrix@3.4.3", "", {}, "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="], "glob": ["glob@11.0.3", "", { "dependencies": { "foreground-child": "^3.3.1", "jackspeak": "^4.1.1", "minimatch": "^10.0.3", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA=="], @@ -725,6 +1130,8 @@ "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + "glsl-tokenizer": ["glsl-tokenizer@2.1.5", "", { "dependencies": { "through2": "^0.6.3" } }, "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA=="], + "gopd": ["gopd@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.1.3" } }, "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="], "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], @@ -743,98 +1150,210 @@ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "headless-three": ["headless-three@1.9.0", "", { "dependencies": { "gl": "^8.1.6", "sharp": "^0.34.5", "three": "0.162.0" } }, "sha512-4QuRO2VPE2Dlt7dhwkUU29oETHLjKNbZmd7vOks/GfDZnQG3WogF37QlUtrUr/uS7IHuzHodVr0uAg2uYszguA=="], + + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + "http-cache-semantics": ["http-cache-semantics@4.1.1", "", {}, "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="], "http-parser-js": ["http-parser-js@0.5.8", "", {}, "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q=="], + "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], + "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="], + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "ignore": ["ignore@5.3.1", "", {}, "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "iota-array": ["iota-array@1.0.0", "", {}, "sha512-pZ2xT+LOHckCatGQ3DcG/a+QuEqvoxqkiL7tvE8nn3uuu+f6i1TtpB5/FtWFbxUuVr5PZCx8KskuGatbJDXOWA=="], + + "ip-address": ["ip-address@10.2.0", "", {}, "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="], + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], - "jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="], + "isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], - "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="], - "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + "istanbul-lib-source-maps": ["istanbul-lib-source-maps@5.0.6", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0" } }, "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A=="], - "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="], - "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + "jackspeak": ["jackspeak@4.1.1", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" } }, "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ=="], - "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + "jest": ["jest@30.5.1", "", { "dependencies": { "@jest/core": "30.5.1", "@jest/types": "30.5.1", "import-local": "^3.2.0", "jest-cli": "30.5.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-3qrR8+ZXFnn7y0H2yjWQNkGGBLBY4zTRoTMAq9zJcgwLLtlyonfsCLviIXK9xuE2KgIyM+M36AFcoK2DgFR36w=="], - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "jest-changed-files": ["jest-changed-files@30.5.1", "", { "dependencies": { "execa": "^5.1.1", "jest-util": "30.5.1", "p-limit": "^3.1.0" } }, "sha512-0+bvMM/ENhDI29Z8q1r4HxiDIi4G5tnBmSw4esfPQoj9q8Nik7KIyuxHkTVnnniJQf05SxpGaKDQ+4h28ynGPg=="], - "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + "jest-circus": ["jest-circus@30.5.1", "", { "dependencies": { "@jest/environment": "30.5.1", "@jest/expect": "30.5.1", "@jest/test-result": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", "jest-each": "30.5.1", "jest-matcher-utils": "30.5.1", "jest-message-util": "30.5.1", "jest-runtime": "30.5.1", "jest-snapshot": "30.5.1", "jest-util": "30.5.1", "p-limit": "^3.1.0", "pretty-format": "30.5.1", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-NgliezXQ6yznqR4W5Gqw++0cZSbBZlF0NknNIAE5VmSJKWOtmWJmWnBq3TSkUOVBTPrT7FGGhVdA8DLWnxo2Sw=="], - "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], + "jest-cli": ["jest-cli@30.5.1", "", { "dependencies": { "@jest/core": "30.5.1", "@jest/test-result": "30.5.1", "@jest/types": "30.5.1", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", "jest-config": "30.5.1", "jest-util": "30.5.1", "jest-validate": "30.5.1", "yargs": "^17.7.2" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-uwNYepWgaNBCplm42fCIUZTf/tIEHIy5AYvx7eL1BrwIgyjPt+2poouR23UO2yopIP+kV8oZFHfv+l4pg/8prQ=="], - "ky": ["ky@2.0.1", "", {}, "sha512-HJPEjEpQPZQ5M3G5eu90/LWZDwysCnvqcfbLvq9FUvfizBZRi58WEixswyyI32LOLcFQd43w7kcfgkCPFxDt/Q=="], + "jest-config": ["jest-config@30.5.1", "", { "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.5.0", "@jest/pattern": "30.5.0", "@jest/test-sequencer": "30.5.1", "@jest/types": "30.5.1", "babel-jest": "30.5.1", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^13.0.6", "graceful-fs": "^4.2.11", "jest-circus": "30.5.1", "jest-docblock": "30.5.0", "jest-environment-node": "30.5.1", "jest-regex-util": "30.5.0", "jest-resolve": "30.5.1", "jest-runner": "30.5.1", "jest-util": "30.5.1", "jest-validate": "30.5.1", "parse-json": "^5.2.0", "pretty-format": "30.5.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "esbuild-register": ">=3.4.0", "ts-node": ">=9.0.0" }, "optionalPeers": ["@types/node", "esbuild-register", "ts-node"] }, "sha512-L8PKM2X/ngG8PxfLMqglKGZjylPgw84bVPUlMY9W/o76TnLqPWrmQgsaT0HrheGdRtpGE5FbmREA0Kvb+Qx5gQ=="], - "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "jest-diff": ["jest-diff@30.5.1", "", { "dependencies": { "@jest/diff-sequences": "30.5.0", "@jest/get-type": "30.5.0", "chalk": "^4.1.2", "pretty-format": "30.5.1" } }, "sha512-e3cNNMpv8Kh20MjjphTXs+3Vz7DQyLM1nft7KJhnh46atFhjVJRa+0Hq0beywuwsACtMQUBihQkFl8zxb7gt1Q=="], - "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], + "jest-docblock": ["jest-docblock@30.5.0", "", { "dependencies": { "detect-newline": "^3.1.0" } }, "sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw=="], - "local-access": ["local-access@1.1.0", "", {}, "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw=="], + "jest-each": ["jest-each@30.5.1", "", { "dependencies": { "@jest/get-type": "30.5.0", "@jest/types": "30.5.1", "chalk": "^4.1.2", "jest-util": "30.5.1", "pretty-format": "30.5.1" } }, "sha512-S1af0TU4v1EZ/AUlkFs/sxf/5KGsbAT9kRgdyoMX/x72y7C8ZEgETE5o1TPnbKRnrbprc5FR/moYLfdRmqEjsQ=="], - "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], + "jest-environment-node": ["jest-environment-node@30.5.1", "", { "dependencies": { "@jest/environment": "30.5.1", "@jest/fake-timers": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "jest-mock": "30.5.1", "jest-util": "30.5.1", "jest-validate": "30.5.1" } }, "sha512-LrPj3sPMjsQoOB3jrb8p/sa+XkSFNKo60TTsyc+EB2kxQJHgbwElpXnx1yX25fdFn5958FIObRtcLSHyV8VIAw=="], - "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "jest-haste-map": ["jest-haste-map@30.5.1", "", { "dependencies": { "@jest/types": "30.5.1", "@parcel/watcher": "^2.6.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "fdir": "^6.5.0", "graceful-fs": "^4.2.11", "jest-regex-util": "30.5.0", "jest-util": "30.5.1", "jest-worker": "30.5.1", "picomatch": "^4.0.3" } }, "sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ=="], - "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + "jest-leak-detector": ["jest-leak-detector@30.5.1", "", { "dependencies": { "@jest/get-type": "30.5.0", "pretty-format": "30.5.1" } }, "sha512-gt4GT2aWgEoCNTcBe4rqS74xTIUJxi+UD9SNSu9aOk5LmTEd6fS5KSTmAKAfitCCktQHNN+upUuL6EkBfFbMDQ=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + "jest-matcher-utils": ["jest-matcher-utils@30.5.1", "", { "dependencies": { "@jest/get-type": "30.5.0", "chalk": "^4.1.2", "jest-diff": "30.5.1", "pretty-format": "30.5.1" } }, "sha512-aroZVqwOz/wC2y6pC+obgFWKV9viaQWQTTSB6W5H55+egtUczIfXR/rxExTv92xD/ADYwpqaYfVWx1aqwKg7FA=="], - "long": ["long@4.0.0", "", {}, "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="], + "jest-message-util": ["jest-message-util@30.5.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.5.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-util": "30.5.1", "picomatch": "^4.0.3", "pretty-format": "30.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg=="], - "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], + "jest-mock": ["jest-mock@30.5.1", "", { "dependencies": { "@jest/expect-utils": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "jest-util": "30.5.1" } }, "sha512-9fVjc3leUpGID2/by/LU4Dvdcp7PFh9LlxS3QRWK3ABm+KtvEVsG/AEGeLY3gKOZsjkBxyfwGltoAVlW7dygHg=="], - "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], + "jest-regex-util": ["jest-regex-util@30.5.0", "", {}, "sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A=="], - "lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], + "jest-resolve": ["jest-resolve@30.5.1", "", { "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-haste-map": "30.5.1", "jest-util": "30.5.1", "jest-validate": "30.5.1", "slash": "^3.0.0", "unrs-resolver": "^1.12.1" } }, "sha512-wprhLejRtwN6h8ZgaqC0eYjGJ1uMdGPT/+b3eFncbG4NWuuP9QL+vWwRinu9waw7hkOLcpMJGVJAMgBwsPssMQ=="], - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "jest-resolve-dependencies": ["jest-resolve-dependencies@30.5.1", "", { "dependencies": { "jest-regex-util": "30.5.0", "jest-snapshot": "30.5.1" } }, "sha512-JKpXGONDcTaunrNVn8KCl6qAnwl06jIkvv70lhq0Ze47lsPx9sH5HoeEUiXX6iFGnliHN/qpIbQ0l38wrVmXaw=="], - "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + "jest-runner": ["jest-runner@30.5.1", "", { "dependencies": { "@jest/console": "30.5.1", "@jest/environment": "30.5.1", "@jest/source-map": "30.5.0", "@jest/test-result": "30.5.1", "@jest/transform": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-docblock": "30.5.0", "jest-environment-node": "30.5.1", "jest-haste-map": "30.5.1", "jest-leak-detector": "30.5.1", "jest-message-util": "30.5.1", "jest-resolve": "30.5.1", "jest-runtime": "30.5.1", "jest-util": "30.5.1", "jest-watcher": "30.5.1", "jest-worker": "30.5.1", "p-limit": "^3.1.0" } }, "sha512-FPlQE4+mwnFxXmpPrSi836KV2ZzvK1g6/nPCT8o5BcoDUUNJQeHo1/Qdkoe/QeoL4M7OeJpbnGUhYKhC1VMdaQ=="], - "marked": ["marked@4.3.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A=="], + "jest-runtime": ["jest-runtime@30.5.1", "", { "dependencies": { "@jest/environment": "30.5.1", "@jest/fake-timers": "30.5.1", "@jest/globals": "30.5.1", "@jest/source-map": "30.5.0", "@jest/test-result": "30.5.1", "@jest/transform": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.2.0", "collect-v8-coverage": "^1.0.2", "es-module-lexer": "^2.1.0", "glob": "^13.0.6", "graceful-fs": "^4.2.11", "jest-haste-map": "30.5.1", "jest-message-util": "30.5.1", "jest-mock": "30.5.1", "jest-regex-util": "30.5.0", "jest-resolve": "30.5.1", "jest-snapshot": "30.5.1", "jest-util": "30.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-UB88+NRkK2Tw/OqV7dofYcyiUGrVZtD41k/N0xQOs9fG//57XHK7JLWG52HD1UYpUAhjK4xm6DBvFX3yWudsMA=="], - "marked-gfm-heading-id": ["marked-gfm-heading-id@3.1.3", "", { "dependencies": { "github-slugger": "^2.0.0" } }, "sha512-A0cRU4PCueX/5m8VE4mT8uTQ36l3xMYRojz3Eqnk4BmUFZ0T+9Xhn2KvHcANP4qbhfOeuMrWJCTQbASIBR5xeg=="], + "jest-snapshot": ["jest-snapshot@30.5.1", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/generator": "^7.27.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", "@jest/expect-utils": "30.5.1", "@jest/get-type": "30.5.0", "@jest/snapshot-utils": "30.5.1", "@jest/transform": "30.5.1", "@jest/types": "30.5.1", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", "expect": "30.5.1", "graceful-fs": "^4.2.11", "jest-diff": "30.5.1", "jest-matcher-utils": "30.5.1", "jest-message-util": "30.5.1", "jest-util": "30.5.1", "pretty-format": "30.5.1", "semver": "^7.7.2", "synckit": "^0.11.8" } }, "sha512-cNWFdSb5xuDGl8hKkAZJ3YtI/PzHpAPFV+HUXWIOG8rMhpDTLVbvAc2d2wRicoYw2wGsJGLaurJT6BLC97bLXQ=="], - "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], + "jest-util": ["jest-util@30.5.1", "", { "dependencies": { "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg=="], - "mc-build": ["mc-build@4.1.3", "", { "bin": { "mcb3": "dist/mcb.js", "mc-build": "dist/mcb.js", "mcb": "dist/mcb.js" } }, "sha512-toWLAGIkd69Dc5V+RnTtuZQJkyFYR9H7rLWHMN3+e/0lIWp/srJZalE2qTVS1+HHdbMaq1iKtBADW0rW9JbAnQ=="], + "jest-validate": ["jest-validate@30.5.1", "", { "dependencies": { "@jest/get-type": "30.5.0", "@jest/types": "30.5.1", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", "pretty-format": "30.5.1" } }, "sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg=="], - "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], + "jest-watcher": ["jest-watcher@30.5.1", "", { "dependencies": { "@jest/test-result": "30.5.1", "@jest/types": "30.5.1", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", "jest-util": "30.5.1", "string-length": "^4.0.2" } }, "sha512-+FHJ7C+S7b3ySfhA1aFmoa6TztsnwZVv84ycPRn0tVN93np2EU4b8C/KadqA3l6igdjgLBTnUotab9ER0HLG8A=="], + + "jest-worker": ["jest-worker@30.5.1", "", { "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", "jest-util": "30.5.1", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" } }, "sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA=="], + + "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + + "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + + "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], + + "known-css-properties": ["known-css-properties@0.37.0", "", {}, "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ=="], + + "ky": ["ky@2.0.1", "", {}, "sha512-HJPEjEpQPZQ5M3G5eu90/LWZDwysCnvqcfbLvq9FUvfizBZRi58WEixswyyI32LOLcFQd43w7kcfgkCPFxDt/Q=="], + + "lazyness": ["lazyness@1.2.0", "", {}, "sha512-KenL6EFbwxBwRxG93t0gcUyi0Nw0Ub31FJKN1laA4UscdkL1K1AxUd0gYZdcLU3v+x+wcFi4uQKS5hL+fk500g=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "local-access": ["local-access@1.1.0", "", {}, "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw=="], + + "locate-character": ["locate-character@3.0.0", "", {}, "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "long": ["long@4.0.0", "", {}, "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="], + + "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], + + "lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "make-dir": ["make-dir@3.1.0", "", { "dependencies": { "semver": "^6.0.0" } }, "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw=="], + + "make-fetch-happen": ["make-fetch-happen@13.0.1", "", { "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" } }, "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA=="], + + "marked": ["marked@4.3.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A=="], + + "marked-gfm-heading-id": ["marked-gfm-heading-id@3.1.3", "", { "dependencies": { "github-slugger": "^2.0.0" } }, "sha512-A0cRU4PCueX/5m8VE4mT8uTQ36l3xMYRojz3Eqnk4BmUFZ0T+9Xhn2KvHcANP4qbhfOeuMrWJCTQbASIBR5xeg=="], + + "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], + + "mc-build": ["mc-build@4.1.3", "", { "bin": { "mcb3": "dist/mcb.js", "mc-build": "dist/mcb.js", "mcb": "dist/mcb.js" } }, "sha512-toWLAGIkd69Dc5V+RnTtuZQJkyFYR9H7rLWHMN3+e/0lIWp/srJZalE2qTVS1+HHdbMaq1iKtBADW0rW9JbAnQ=="], + + "md5": ["md5@2.3.0", "", { "dependencies": { "charenc": "0.0.2", "crypt": "0.0.2", "is-buffer": "~1.1.6" } }, "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g=="], "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], "micromatch": ["micromatch@4.0.5", "", { "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA=="], @@ -843,12 +1362,34 @@ "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="], + + "minipass-fetch": ["minipass-fetch@3.0.5", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg=="], + + "minipass-flush": ["minipass-flush@1.0.7", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA=="], + + "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], + + "minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], + + "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + "molangjs": ["molangjs@1.6.4", "", {}, "sha512-Evi2MbMcfDFwcG4HVjsX4MAj+jc7itlp1Ncd+sQ+4jel7N1pADUJpiWEdg3d9IIK+0RQwJw7EE3GrM+ERWbcQA=="], "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], @@ -857,24 +1398,62 @@ "ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], + "nan": ["nan@2.27.0", "", {}, "sha512-hC+0LidcL3XE4rp1C4H54KujgXKzbfyTngZTwBByQxsOxCEKZT0MPQ4hOKUH2jU1OYstqdDH4onyHPDzcV0XdQ=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + + "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], "natural-compare-lite": ["natural-compare-lite@1.4.0", "", {}, "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g=="], + "ndarray": ["ndarray@1.1.1", "", { "dependencies": { "iota-array": "^1.0.0", "is-buffer": "^1.0.2" } }, "sha512-AsE8w/M2MS+0pD3nP5qbRRtJFeJJJaJ+qXZaZr0XjVGXhy6LIj2TERTlkpdK2AI3WufoOP+pwPk3q2ilAJcZ9g=="], + + "ndarray-pack": ["ndarray-pack@1.2.1", "", { "dependencies": { "cwise-compiler": "^1.1.2", "ndarray": "^1.0.13" } }, "sha512-51cECUJMT0rUZNQa09EoKsnFeDL4x2dHRT0VR5U2H5ZgEcm95ZDWcMA5JShroXjHOejmAD/fg8+H+OvUnVXz2g=="], + + "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], + + "netmask": ["netmask@2.1.1", "", {}, "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA=="], + + "nextgen-events": ["nextgen-events@1.5.3", "", {}, "sha512-P6qw6kenNXP+J9XlKJNi/MNHUQ+Lx5K8FEcSfX7/w8KJdZan5+BB5MKzuNgL2RTjHG1Svg8SehfseVEp8zAqwA=="], + + "node-abi": ["node-abi@3.92.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ=="], + + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "node-bitmap": ["node-bitmap@0.0.1", "", {}, "sha512-Jx5lPaaLdIaOsj2mVLWMWulXF6GQVdyLvNSxmiYCvZ8Ma2hfKX0POoR2kgKOqz+oFsRreq0yYZjQ2wjE9VNzCA=="], + "node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" } }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], + "node-gyp": ["node-gyp@10.3.1", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^10.3.10", "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", "proc-log": "^4.1.0", "semver": "^7.3.5", "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ=="], + + "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], + "node-modules-vscode-problems-patch": ["node-modules-vscode-problems-patch@1.0.9", "", { "dependencies": { "esbuild": "^0.25.0", "glob": "^11.0.1" }, "bin": { "node-modules-vscode-problems-patch": "dist/index.js" } }, "sha512-PYS8ozhWFbPvksJBIKbWrdrKOD2e+MZaxl75amn/oaVAzObgmGQeYnk4VT5tT/d5KHhWiuUwzWWSgbQ57GVMfA=="], + "node-releases": ["node-releases@2.0.54", "", {}, "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ=="], + + "nopt": ["nopt@7.2.1", "", { "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], "octokit": ["octokit@5.0.3", "", { "dependencies": { "@octokit/app": "^16.0.1", "@octokit/core": "^7.0.2", "@octokit/oauth-app": "^8.0.1", "@octokit/plugin-paginate-graphql": "^6.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/plugin-rest-endpoint-methods": "^16.0.0", "@octokit/plugin-retry": "^8.0.1", "@octokit/plugin-throttling": "^11.0.1", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "@octokit/webhooks": "^14.0.0" } }, "sha512-+bwYsAIRmYv30NTmBysPIlgH23ekVDriB07oRxlPIAH5PI0yTMSxg5i5Xy0OetcnZw+nk/caD4szD7a9YZ3QyQ=="], + "omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="], + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], @@ -883,14 +1462,24 @@ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="], + + "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="], + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parenthesis": ["parenthesis@3.1.8", "", {}, "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -899,20 +1488,20 @@ "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - - "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], - "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="], "periscopic": ["periscopic@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", "is-reference": "^3.0.0" } }, "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="], + "pngjs": ["pngjs@6.0.0", "", {}, "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "postcss-load-config": ["postcss-load-config@3.1.4", "", { "dependencies": { "lilconfig": "^2.0.5", "yaml": "^1.10.2" } }, "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg=="], @@ -923,46 +1512,72 @@ "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.8.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q=="], + "prettier-plugin-svelte": ["prettier-plugin-svelte@4.1.1", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^5.0.0" } }, "sha512-wXvbXMjSvb4C9ENWTHXyd+ihakKCsJ6rJhLP6/8HFNj4GkZr48jqL9PoKsl2sk7SyCZRTnJ7O2TTowUpOxP/KA=="], + + "pretty-format": ["pretty-format@30.5.1", "", { "dependencies": { "@jest/react-is-18": "npm:react-is@^18.3.1", "@jest/react-is-19": "npm:react-is@^19.2.5", "@jest/schemas": "30.5.0", "ansi-styles": "^5.2.0" } }, "sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg=="], + "prismjs": ["prismjs@1.29.0", "", {}, "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="], + "proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + "protobufjs": ["protobufjs@6.11.4", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw=="], + "proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + "pump": ["pump@3.0.0", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "puppeteer-core": ["puppeteer-core@23.11.1", "", { "dependencies": { "@puppeteer/browsers": "2.6.1", "chromium-bidi": "0.11.0", "debug": "^4.4.0", "devtools-protocol": "0.0.1367902", "typed-query-selector": "^2.12.0", "ws": "^8.18.0" } }, "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg=="], + + "pure-rand": ["pure-rand@7.0.1", "", {}, "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="], + + "readable-stream": ["readable-stream@1.0.34", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg=="], + "request-progress": ["request-progress@3.0.0", "", { "dependencies": { "throttleit": "^1.0.0" } }, "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], - "rollup": ["rollup@4.52.4", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.4", "@rollup/rollup-android-arm64": "4.52.4", "@rollup/rollup-darwin-arm64": "4.52.4", "@rollup/rollup-darwin-x64": "4.52.4", "@rollup/rollup-freebsd-arm64": "4.52.4", "@rollup/rollup-freebsd-x64": "4.52.4", "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", "@rollup/rollup-linux-arm-musleabihf": "4.52.4", "@rollup/rollup-linux-arm64-gnu": "4.52.4", "@rollup/rollup-linux-arm64-musl": "4.52.4", "@rollup/rollup-linux-loong64-gnu": "4.52.4", "@rollup/rollup-linux-ppc64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-gnu": "4.52.4", "@rollup/rollup-linux-riscv64-musl": "4.52.4", "@rollup/rollup-linux-s390x-gnu": "4.52.4", "@rollup/rollup-linux-x64-gnu": "4.52.4", "@rollup/rollup-linux-x64-musl": "4.52.4", "@rollup/rollup-openharmony-arm64": "4.52.4", "@rollup/rollup-win32-arm64-msvc": "4.52.4", "@rollup/rollup-win32-ia32-msvc": "4.52.4", "@rollup/rollup-win32-x64-gnu": "4.52.4", "@rollup/rollup-win32-x64-msvc": "4.52.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + "semiver": ["semiver@1.1.0", "", {}, "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg=="], "semver": ["semver@7.6.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w=="], @@ -971,43 +1586,71 @@ "serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "seventh": ["seventh@0.9.4", "", { "dependencies": { "setimmediate": "^1.0.5" } }, "sha512-O85mosi4sOfxG+slvqy0j7zLuFD4ylUgEMt7Pvt9Q/wnwNwG/6MNnHKzV9JkAoPoPM26t/DLFn17p7o7u5kIBA=="], + + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + "simple-subpub": ["simple-subpub@1.2.0", "", {}, "sha512-cN0RBYgIydi0X+3oDYaEMY7/IfdopJjJZriLxXIiHDdsKW3eSVxDpyojAyBY5wWw0P8Z0NLOP93h0kCaeT/TuA=="], "sirv": ["sirv@1.0.19", "", { "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", "totalist": "^1.0.0" } }, "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ=="], "sirv-cli": ["sirv-cli@1.0.14", "", { "dependencies": { "console-clear": "^1.1.0", "get-port": "^3.2.0", "kleur": "^3.0.0", "local-access": "^1.0.1", "sade": "^1.6.0", "semiver": "^1.0.0", "sirv": "^1.0.13", "tinydate": "^1.0.0" }, "bin": { "sirv": "bin.js" } }, "sha512-yyUTNr984ANKDloqepkYbBSqvx3buwYg2sQKPWjSU+IBia5loaoka2If8N9CMwt8AfP179cdEl7kYJ//iWJHjQ=="], + "skia-canvas": ["skia-canvas@3.0.8", "", { "dependencies": { "detect-libc": "^2.1.1", "follow-redirects": "^1.15.11", "https-proxy-agent": "^7.0.6", "string-split-by": "^1.0.0" } }, "sha512-FSYKxp8Ng2vOeeOBiyPhnn6ui6FirPJXMyjk4PKl8N/OWzVrkMawUgY9zubIWHMdYtyWFn0gfX3QlRwg6HBmdg=="], + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], + + "socks": ["socks@2.8.9", "", { "dependencies": { "ip-address": "^10.1.1", "smart-buffer": "^4.2.0" } }, "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw=="], + + "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], + "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], - "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + "ssri": ["ssri@10.0.6", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ=="], + + "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="], + + "streamx": ["streamx@2.28.1", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA=="], - "std-env": ["std-env@3.9.0", "", {}, "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="], + "string-kit": ["string-kit@0.19.5", "", {}, "sha512-MqNWtQQw6xMFbOSa26HfyS5uyDu1tR4OEPz44VDP6JWa/S0E0N11uw8CXrPt5hme/tBXRp5AmoIvFl5B9lt7PA=="], - "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="], + + "string-split-by": ["string-split-by@1.0.0", "", { "dependencies": { "parenthesis": "^3.1.5" } }, "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A=="], + + "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], + "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], - "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], "sumchecker": ["sumchecker@3.0.1", "", { "dependencies": { "debug": "^4.1.0" } }, "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg=="], @@ -1021,7 +1664,7 @@ "svelte-awesome-slider": ["svelte-awesome-slider@1.1.0", "", {}, "sha512-MgY6ZdBON42HVZqNWNjq2HOgyDlC35q0TNbV/YO1l1/bcb5yhM8EE97h1AJ/7F6t6sLzXhQ3qPf5nGyCdDSnCg=="], - "svelte-dnd-action": ["svelte-dnd-action@0.9.47", "", {}, "sha512-Z343HCJfrGHgK98LCrp0ziGUwwWOd8UrpXk7b7A61OQErrB8nUS2tLVRZlaGzhMfE1UCivuqTGFLqxJ14KehfQ=="], + "svelte-dnd-action": ["svelte-dnd-action@0.9.79", "", { "peerDependencies": { "svelte": ">=3.23.0 || ^5.0.0-next.0" } }, "sha512-zCKaG1Q9hVgfJFyZXhY+uIpo9+cjsG03CqwNz8yBlWCRBphC8U2zli9FzIcrL4rhXEs8yV+asS4rV0RHDuQqQQ=="], "svelte-eslint-parser": ["svelte-eslint-parser@1.3.3", "", { "dependencies": { "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.0.0", "espree": "^10.0.0", "postcss": "^8.4.49", "postcss-scss": "^4.0.9", "postcss-selector-parser": "^7.0.0" } }, "sha512-oTrDR8Z7Wnguut7QH3YKh7JR19xv1seB/bz4dxU5J/86eJtZOU4eh0/jZq4dy6tAlz/KROxnkRQspv5ZEt7t+Q=="], @@ -1035,25 +1678,33 @@ "svelte-preprocess-esbuild": ["svelte-preprocess-esbuild@3.0.1", "", {}, "sha512-OV4P/onki7hfuzIpYOd92TT0JSm4y67PvkAAM7RigLd869VEvNh2f6J+ewrEqAgTnZzVQcOWzuaU4hPISNPFpA=="], - "three": ["three@0.134.0", "", {}, "sha512-LbBerg7GaSPjYtTOnu41AMp7tV6efUNR3p4Wk5NzkSsNTBuA5mDGOfwwZL1jhhVMLx9V20HolIUo0+U3AXehbg=="], + "synckit": ["synckit@0.11.13", "", { "dependencies": { "@pkgr/core": "^0.3.6" } }, "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg=="], - "throttleit": ["throttleit@1.0.1", "", {}, "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ=="], + "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + "tar-fs": ["tar-fs@3.1.3", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ=="], - "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], + "tar-stream": ["tar-stream@3.2.1", "", { "dependencies": { "b4a": "^1.6.4", "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ=="], - "tinydate": ["tinydate@1.3.0", "", {}, "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w=="], + "teex": ["teex@1.0.1", "", { "dependencies": { "streamx": "^2.12.5" } }, "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg=="], - "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "terminal-kit": ["terminal-kit@3.1.4", "", { "dependencies": { "@cronvel/get-pixels": "^3.4.1", "chroma-js": "^2.4.2", "lazyness": "^1.2.0", "ndarray": "^1.0.19", "nextgen-events": "^1.5.3", "seventh": "^0.9.4", "string-kit": "^0.19.5", "tree-kit": "^0.8.10" } }, "sha512-0BfyIa7pY69E+UgV0P655uNk2rjp2eWTA0uZCTMlGzyrgcrH7kO6yZDGdHqB2vNF5uEjQ5+6ZilHfGtzrhLQNg=="], - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "test-exclude": ["test-exclude@7.0.2", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^10.2.2" } }, "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw=="], - "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + "text-decoder": ["text-decoder@1.2.7", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ=="], + + "three": ["three@0.162.0", "", {}, "sha512-xfCYj4RnlozReCmUd+XQzj6/5OjDNHBy5nT6rVwrOKGENAvpXe2z1jL+DZYaMu4/9pNsjH/4Os/VvS9IrH7IOQ=="], + + "throttleit": ["throttleit@1.0.1", "", {}, "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ=="], - "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], - "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="], + "through2": ["through2@0.6.5", "", { "dependencies": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" } }, "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg=="], + + "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], + + "tinydate": ["tinydate@1.3.0", "", {}, "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w=="], "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], @@ -1065,37 +1716,53 @@ "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "tree-kit": ["tree-kit@0.8.10", "", {}, "sha512-mwuV3lHL+utI9z7vxah/27wrMJprx925xhkw1N4KuGa1dqIi0DLHWfXJpHEyR+ZI0Ij80zN58ztiGp3KlH0wtw=="], + "ts-api-utils": ["ts-api-utils@2.1.0", "", {}, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], "tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], "tsutils": ["tsutils@3.21.0", "", { "dependencies": { "tslib": "^1.8.1" } }, "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA=="], + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="], + + "type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="], + + "typed-query-selector": ["typed-query-selector@2.12.2", "", {}, "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="], "typescript": ["typescript@6.0.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ=="], "typescript-eslint": ["typescript-eslint@8.45.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.45.0", "@typescript-eslint/parser": "8.45.0", "@typescript-eslint/typescript-estree": "8.45.0", "@typescript-eslint/utils": "8.45.0" } }, "sha512-qzDmZw/Z5beNLUrXfd0HIW6MzIaAV5WNDxmMs9/3ojGOpYavofgNAAD/nC6tGV2PczIi0iw8vot2eAe/sBn7zg=="], + "unbzip2-stream": ["unbzip2-stream@1.4.3", "", { "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" } }, "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg=="], + "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "uniq": ["uniq@1.0.1", "", {}, "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA=="], + + "unique-filename": ["unique-filename@3.0.0", "", { "dependencies": { "unique-slug": "^4.0.0" } }, "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g=="], + + "unique-slug": ["unique-slug@4.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ=="], + "universal-github-app-jwt": ["universal-github-app-jwt@2.2.2", "", {}, "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw=="], "universal-user-agent": ["universal-user-agent@7.0.3", "", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="], "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "unrs-resolver": ["unrs-resolver@1.12.2", "", { "dependencies": { "napi-postinstall": "^0.3.4" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.12.2", "@unrs/resolver-binding-android-arm64": "1.12.2", "@unrs/resolver-binding-darwin-arm64": "1.12.2", "@unrs/resolver-binding-darwin-x64": "1.12.2", "@unrs/resolver-binding-freebsd-x64": "1.12.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", "@unrs/resolver-binding-linux-x64-musl": "1.12.2", "@unrs/resolver-binding-openharmony-arm64": "1.12.2", "@unrs/resolver-binding-wasm32-wasi": "1.12.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" } }, "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ=="], - "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "update-browserslist-db": ["update-browserslist-db@1.3.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw=="], - "vite": ["vite@7.1.9", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "vite": "bin/vite.js" } }, "sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg=="], + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], "vue": ["vue@2.7.14", "", { "dependencies": { "@vue/compiler-sfc": "2.7.14", "csstype": "^3.1.0" } }, "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ=="], @@ -1109,25 +1776,31 @@ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "wintersky": ["wintersky@1.3.0", "", { "dependencies": { "molangjs": "^1.6.3", "three": "^0.134.0", "tinycolor2": "^1.4.2" } }, "sha512-ibeUF+sgoIrFAfgqcNsPlr8+4l0KOfhGw+JgjxKcgtbckSy3gAxqAeNX5LjuQK9y7jcBZDwUIXg9sZDGQ1W+hQ=="], "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], + + "ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], @@ -1135,10 +1808,48 @@ "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], - "@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], + + "@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/core/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/core/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/generator/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/generator/@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-module-imports/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/helper-module-transforms/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/helpers/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/parser/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/template/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/traverse/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@babel/traverse/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "@electron/get/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + "@emnapi/core/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@emnapi/runtime/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@emnapi/wasi-threads/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@eslint/config-array/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], @@ -1209,16 +1920,72 @@ "@grpc/grpc-js/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], + "@grpc/proto-loader/yargs": ["yargs@16.2.0", "", { "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" } }, "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw=="], + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + + "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.15.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w=="], + + "@istanbuljs/load-nyc-config/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "@jest/console/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "@jest/core/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "@jest/environment/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "@jest/fake-timers/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "@jest/pattern/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "@jest/reporters/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@jest/reporters/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "@jest/reporters/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "@jest/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@jest/transform/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@jest/types/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + "@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], "@novacbn/svelte-codejar/svelte": ["svelte@3.59.2", "", {}, "sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA=="], + "@npmcli/agent/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "@npmcli/fs/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + "@octokit/core/@octokit/types": ["@octokit/types@15.0.0", "", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ=="], "@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@15.0.0", "", { "dependencies": { "@octokit/openapi-types": "^26.0.0" } }, "sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ=="], + "@puppeteer/browsers/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "@puppeteer/browsers/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "@snavesutit/jestbench/jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "@tybys/wasm-util/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "@types/babel__core/@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], + + "@types/babel__core/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "@types/babel__generator/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@types/babel__template/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + + "@types/babel__traverse/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], + "@types/cacheable-request/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], "@types/decompress/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], @@ -1243,19 +2010,31 @@ "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@vitest/mocker/magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + "@unrs/resolver-binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], - "@vitest/snapshot/magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + "@vue/compiler-sfc/@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], "@vue/compiler-sfc/postcss": ["postcss@8.5.9", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw=="], + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "ast-types/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], + + "bl/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + "blockbench-patch-manager/svelte": ["svelte@5.55.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-q8DFohk6vUswSng95IZb9nzWJnbINZsK7OiM1snAa3qCjJBL0ZQpvMyAaVXjUukdM75J/m8UE8xwqat8Ors/zQ=="], "blockbench-types/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "book-and-quill/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], - "chai/loupe": ["loupe@3.1.2", "", {}, "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg=="], + "cacache/fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], + + "cacache/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "cacache/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1271,6 +2050,8 @@ "electron/@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], + "envbench/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "esbuild-plugin-import-folder/eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], "esbuild-plugin-inline-worker/esbuild": ["esbuild@0.21.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.3", "@esbuild/android-arm": "0.21.3", "@esbuild/android-arm64": "0.21.3", "@esbuild/android-x64": "0.21.3", "@esbuild/darwin-arm64": "0.21.3", "@esbuild/darwin-x64": "0.21.3", "@esbuild/freebsd-arm64": "0.21.3", "@esbuild/freebsd-x64": "0.21.3", "@esbuild/linux-arm": "0.21.3", "@esbuild/linux-arm64": "0.21.3", "@esbuild/linux-ia32": "0.21.3", "@esbuild/linux-loong64": "0.21.3", "@esbuild/linux-mips64el": "0.21.3", "@esbuild/linux-ppc64": "0.21.3", "@esbuild/linux-riscv64": "0.21.3", "@esbuild/linux-s390x": "0.21.3", "@esbuild/linux-x64": "0.21.3", "@esbuild/netbsd-x64": "0.21.3", "@esbuild/openbsd-x64": "0.21.3", "@esbuild/sunos-x64": "0.21.3", "@esbuild/win32-arm64": "0.21.3", "@esbuild/win32-ia32": "0.21.3", "@esbuild/win32-x64": "0.21.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw=="], @@ -1289,29 +2070,121 @@ "estree-walker/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "get-uri/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "glob/minimatch": ["minimatch@10.0.3", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw=="], + "http-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "https-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "is-reference/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + "istanbul-lib-instrument/@babel/parser": ["@babel/parser@7.29.2", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA=="], + + "istanbul-lib-instrument/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "istanbul-lib-report/make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], + + "istanbul-lib-source-maps/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "istanbul-lib-source-maps/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "jest-circus/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-config/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "jest-environment-node/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-haste-map/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-mock/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-runner/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-runtime/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-runtime/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "jest-snapshot/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "jest-snapshot/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "jest-util/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-watcher/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-worker/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], "make-dir/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "node-abi/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "node-gyp/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "node-gyp/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "node-gyp/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + "node-modules-vscode-problems-patch/esbuild": ["esbuild@0.25.10", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", "@esbuild/android-arm64": "0.25.10", "@esbuild/android-x64": "0.25.10", "@esbuild/darwin-arm64": "0.25.10", "@esbuild/darwin-x64": "0.25.10", "@esbuild/freebsd-arm64": "0.25.10", "@esbuild/freebsd-x64": "0.25.10", "@esbuild/linux-arm": "0.25.10", "@esbuild/linux-arm64": "0.25.10", "@esbuild/linux-ia32": "0.25.10", "@esbuild/linux-loong64": "0.25.10", "@esbuild/linux-mips64el": "0.25.10", "@esbuild/linux-ppc64": "0.25.10", "@esbuild/linux-riscv64": "0.25.10", "@esbuild/linux-s390x": "0.25.10", "@esbuild/linux-x64": "0.25.10", "@esbuild/netbsd-arm64": "0.25.10", "@esbuild/netbsd-x64": "0.25.10", "@esbuild/openbsd-arm64": "0.25.10", "@esbuild/openbsd-x64": "0.25.10", "@esbuild/openharmony-arm64": "0.25.10", "@esbuild/sunos-x64": "0.25.10", "@esbuild/win32-arm64": "0.25.10", "@esbuild/win32-ia32": "0.25.10", "@esbuild/win32-x64": "0.25.10" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ=="], + "pac-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "periscopic/@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], + "postcss-load-config/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "prebuild-install/tar-fs": ["tar-fs@2.1.4", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ=="], + + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "protobufjs/@types/node": ["@types/node@20.12.12", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw=="], - "rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "puppeteer-core/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], + + "resolve-cwd/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "serialize-error/type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + + "sharp/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "socks-proxy-agent/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="], + + "string-length/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1323,6 +2196,12 @@ "svelte-patching-tools/svelte": ["svelte@5.55.4", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.6.4", "esm-env": "^1.2.1", "esrap": "^2.2.4", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-q8DFohk6vUswSng95IZb9nzWJnbINZsK7OiM1snAa3qCjJBL0ZQpvMyAaVXjUukdM75J/m8UE8xwqat8Ors/zQ=="], + "tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "test-exclude/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "test-exclude/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], + "typescript-eslint/@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.45.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/type-utils": "8.45.0", "@typescript-eslint/utils": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" } }, "sha512-HC3y9CVuevvWCl/oyZuI47dOeDF9ztdMEfMH8/DW/Mhwa9cCLnK1oD7JoTVGW/u7kFzNZUKUoyJEqkaJh5y3Wg=="], "typescript-eslint/@typescript-eslint/parser": ["@typescript-eslint/parser@8.45.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/types": "8.45.0", "@typescript-eslint/typescript-estree": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0", "debug": "^4.3.4" } }, "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ=="], @@ -1331,23 +2210,57 @@ "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.45.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.45.0", "@typescript-eslint/types": "8.45.0", "@typescript-eslint/typescript-estree": "8.45.0" } }, "sha512-bxi1ht+tLYg4+XV2knz/F7RVhU0k6VrSMc9sb8DQ6fyCTrGQLHfo7lDtN0QJjZjKkLA2ThrKuCdHEvLReqtIGg=="], - "vite/esbuild": ["esbuild@0.25.10", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.10", "@esbuild/android-arm": "0.25.10", "@esbuild/android-arm64": "0.25.10", "@esbuild/android-x64": "0.25.10", "@esbuild/darwin-arm64": "0.25.10", "@esbuild/darwin-x64": "0.25.10", "@esbuild/freebsd-arm64": "0.25.10", "@esbuild/freebsd-x64": "0.25.10", "@esbuild/linux-arm": "0.25.10", "@esbuild/linux-arm64": "0.25.10", "@esbuild/linux-ia32": "0.25.10", "@esbuild/linux-loong64": "0.25.10", "@esbuild/linux-mips64el": "0.25.10", "@esbuild/linux-ppc64": "0.25.10", "@esbuild/linux-riscv64": "0.25.10", "@esbuild/linux-s390x": "0.25.10", "@esbuild/linux-x64": "0.25.10", "@esbuild/netbsd-arm64": "0.25.10", "@esbuild/netbsd-x64": "0.25.10", "@esbuild/openbsd-arm64": "0.25.10", "@esbuild/openbsd-x64": "0.25.10", "@esbuild/openharmony-arm64": "0.25.10", "@esbuild/sunos-x64": "0.25.10", "@esbuild/win32-arm64": "0.25.10", "@esbuild/win32-ia32": "0.25.10", "@esbuild/win32-x64": "0.25.10" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ=="], + "update-browserslist-db/escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], - "vite-node/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "v8-to-istanbul/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "vitest/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - - "vitest/magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], + "wintersky/three": ["three@0.134.0", "", {}, "sha512-LbBerg7GaSPjYtTOnu41AMp7tV6efUNR3p4Wk5NzkSsNTBuA5mDGOfwwZL1jhhVMLx9V20HolIUo0+U3AXehbg=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@babel/core/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/core/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/core/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "@babel/generator/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/generator/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/generator/@jridgewell/gen-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@babel/generator/@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/helper-module-imports/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/helper-module-imports/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/helpers/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/helpers/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/template/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/template/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/traverse/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "@eslint/config-array/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], @@ -1357,21 +2270,77 @@ "@grpc/grpc-js/@grpc/proto-loader/protobufjs": ["protobufjs@7.3.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g=="], - "@grpc/grpc-js/@grpc/proto-loader/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "@grpc/proto-loader/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], + + "@grpc/proto-loader/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "@grpc/proto-loader/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], + + "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], + + "@jest/console/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "@jest/core/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "@jest/environment/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "@jest/fake-timers/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "@jest/pattern/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "@jest/reporters/@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jest/reporters/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "@jest/reporters/glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], + + "@jest/reporters/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "@jest/reporters/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "@jest/source-map/@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jest/transform/@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jest/types/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@26.0.0", "", {}, "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="], "@octokit/plugin-rest-endpoint-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@26.0.0", "", {}, "sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA=="], + "@puppeteer/browsers/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "@types/babel__core/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@types/babel__core/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@types/babel__generator/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@types/babel__generator/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@types/babel__template/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@types/babel__template/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@types/babel__traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@types/babel__traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + "@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], "@typescript-eslint/utils/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - "@vitest/mocker/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "@unrs/resolver-binding-wasm32-wasi/@emnapi/runtime/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], - "@vitest/snapshot/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "@vue/compiler-sfc/@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "bl/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "blockbench-patch-manager/svelte/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], @@ -1379,6 +2348,14 @@ "book-and-quill/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "cacache/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "cacache/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "cacache/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "electron/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], @@ -1405,6 +2382,8 @@ "esbuild-plugin-import-folder/eslint/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "esbuild-plugin-inline-worker/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w=="], + "esbuild-plugin-inline-worker/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.21.3", "", { "os": "android", "cpu": "arm" }, "sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ=="], "esbuild-plugin-inline-worker/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.3", "", { "os": "android", "cpu": "arm64" }, "sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw=="], @@ -1451,6 +2430,62 @@ "eslint/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "get-uri/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "http-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "https-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "istanbul-lib-instrument/@babel/parser/@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + + "istanbul-lib-report/make-dir/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "istanbul-lib-source-maps/@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "istanbul-lib-source-maps/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "jest-circus/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-config/glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], + + "jest-config/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "jest-config/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "jest-environment-node/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-haste-map/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-mock/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-runner/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-runtime/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-runtime/glob/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], + + "jest-runtime/glob/minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "jest-runtime/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "jest-snapshot/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "jest-snapshot/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "jest-util/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-watcher/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "jest-worker/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + + "node-gyp/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "node-gyp/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "node-gyp/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "node-gyp/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], + "node-modules-vscode-problems-patch/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.10", "", { "os": "aix", "cpu": "ppc64" }, "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw=="], "node-modules-vscode-problems-patch/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.10", "", { "os": "android", "cpu": "arm" }, "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w=="], @@ -1497,11 +2532,23 @@ "node-modules-vscode-problems-patch/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.10", "", { "os": "win32", "cpu": "x64" }, "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw=="], + "pac-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "prebuild-install/tar-fs/chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], - "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "prebuild-install/tar-fs/tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "puppeteer-core/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "socks-proxy-agent/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "string-length/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "svelte-multiselect/svelte/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.4.15", "", {}, "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="], @@ -1517,6 +2564,14 @@ "svelte-patching-tools/svelte/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "test-exclude/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "test-exclude/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "test-exclude/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "test-exclude/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], + "typescript-eslint/@typescript-eslint/eslint-plugin/@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "@typescript-eslint/visitor-keys": "8.45.0" } }, "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA=="], @@ -1547,77 +2602,67 @@ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], - "vite-node/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.10", "", { "os": "aix", "cpu": "ppc64" }, "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw=="], - - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.10", "", { "os": "android", "cpu": "arm" }, "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w=="], + "v8-to-istanbul/@jridgewell/trace-mapping/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.10", "", { "os": "android", "cpu": "arm64" }, "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg=="], + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.10", "", { "os": "android", "cpu": "x64" }, "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg=="], - - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA=="], - - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg=="], - - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.10", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg=="], + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA=="], + "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.10", "", { "os": "linux", "cpu": "arm" }, "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg=="], + "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ=="], + "@grpc/proto-loader/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.10", "", { "os": "linux", "cpu": "ia32" }, "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ=="], + "@grpc/proto-loader/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg=="], + "@grpc/proto-loader/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA=="], + "@grpc/proto-loader/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.10", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA=="], + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.10", "", { "os": "linux", "cpu": "none" }, "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA=="], + "@istanbuljs/load-nyc-config/js-yaml/argparse/sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.10", "", { "os": "linux", "cpu": "s390x" }, "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew=="], + "@jest/reporters/glob/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA=="], + "@vue/compiler-sfc/@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.10", "", { "os": "none", "cpu": "x64" }, "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig=="], + "@vue/compiler-sfc/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.10", "", { "os": "openbsd", "cpu": "x64" }, "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw=="], + "cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.10", "", { "os": "sunos", "cpu": "x64" }, "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ=="], + "esbuild-plugin-import-folder/eslint/@eslint/config-array/@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw=="], + "esbuild-plugin-import-folder/eslint/@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.10", "", { "os": "win32", "cpu": "ia32" }, "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw=="], + "esbuild-plugin-import-folder/eslint/@eslint/eslintrc/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.10", "", { "os": "win32", "cpu": "x64" }, "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw=="], + "esbuild-plugin-import-folder/eslint/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "vitest/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "istanbul-lib-instrument/@babel/parser/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], - "vitest/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "istanbul-lib-instrument/@babel/parser/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], - "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "jest-config/glob/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + "jest-runtime/glob/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "node-gyp/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "@grpc/grpc-js/@grpc/proto-loader/yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "node-gyp/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "esbuild-plugin-import-folder/eslint/@eslint/config-array/@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], - "esbuild-plugin-import-folder/eslint/@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + "prebuild-install/tar-fs/tar-stream/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], - "esbuild-plugin-import-folder/eslint/@eslint/eslintrc/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + "svelte-multiselect/svelte/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], - "esbuild-plugin-import-folder/eslint/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "test-exclude/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], - "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="], + "test-exclude/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "svelte-multiselect/svelte/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + "test-exclude/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "typescript-eslint/@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.45.0", "", {}, "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA=="], @@ -1633,18 +2678,28 @@ "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.45.0", "", { "dependencies": { "@typescript-eslint/types": "8.45.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag=="], - "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@grpc/proto-loader/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "@grpc/proto-loader/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "@jest/reporters/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "jest-config/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "jest-runtime/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + "prebuild-install/tar-fs/tar-stream/readable-stream/string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/micromatch/braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "@grpc/grpc-js/@grpc/proto-loader/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "typescript-eslint/@typescript-eslint/typescript-estree/fast-glob/micromatch/braces/fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], } } diff --git a/eslint.config.ts b/eslint.config.ts index bef3f6f7..eb26f65e 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -12,10 +12,25 @@ const IGNORE_PATTERNS = [ '.github', '.vscode', '**/node_modules/**', + 'test-packs/**', + 'test_blueprints/**', + 'test_ajmodels/**', // Blockbench Plugin Template 'dist/**/*', + // Test-runner config (plain ESM, not part of the TS project) + 'jest.config.mjs', + 'jest.unit.config.mjs', + 'blockbench.config.mjs', + + // Plain JS/CJS build shims and helpers (not part of the TS project) + '.scripts/*.js', + '.scripts/*.cjs', + + // Plain-CJS stub modules for the unit lane (not part of the TS project) + 'src/tests/unit/__stubs__/**', + // Ignore files for PNPM, NPM and YARN 'pnpm-lock.yaml', 'package-lock.json', diff --git a/jest.config.mjs b/jest.config.mjs new file mode 100644 index 00000000..cb3d7773 --- /dev/null +++ b/jest.config.mjs @@ -0,0 +1,27 @@ +import preset from '@snavesutit/jestbench/jest-preset.js' + +// jestbench's preset supplies the Blockbench test environment, global +// setup/teardown, custom matchers, `maxWorkers: 1` and an extended timeout. +// We only add the TypeScript transform and point it at our suite. + +/** @type {import('jest').Config} */ +export default { + ...preset, + rootDir: '.', + testMatch: ['/src/tests/**/*.test.ts'], + // The fast pure-logic lane runs under `jest.unit.config.mjs` (plain Node, no + // Blockbench). Keep it out of the jestbench run. + testPathIgnorePatterns: ['/src/tests/unit/'], + // Tests open blueprints, which fetch the target Minecraft version's assets + // (downloaded and cached on first run). + testTimeout: 120_000, + transform: { + '^.+\\.tsx?$': [ + '@swc/jest', + { + jsc: { parser: { syntax: 'typescript' }, target: 'es2022' }, + module: { type: 'commonjs' }, + }, + ], + }, +} diff --git a/jest.unit.config.mjs b/jest.unit.config.mjs new file mode 100644 index 00000000..dbaf9251 --- /dev/null +++ b/jest.unit.config.mjs @@ -0,0 +1,36 @@ +/** + * Fast unit lane: plain-Node Jest for modules of pure logic that never touch + * Blockbench's host globals. No plugin build, no headless Blockbench launch - + * these run in milliseconds. + * + * End-to-end tests that need the real app stay in `jest.config.mjs` + * (jestbench). That config ignores `src/tests/unit/`. + * + * @type {import('jest').Config} + */ +export default { + rootDir: '.', + testEnvironment: 'node', + testMatch: ['/src/tests/unit/**/*.test.ts'], + setupFiles: ['/src/tests/unit/setup.ts'], + // A few util modules import host-dependent siblings at load time (an fs + // accessor, block/registry lookups) that only their non-pure functions ever + // call. Swap those imports for a no-op so the pure functions can be reached. + moduleNameMapper: { + '(^|/)constants$': '/src/tests/unit/__stubs__/hostModule.cjs', + '/systems/minecraft/blockModelManager$': + '/src/tests/unit/__stubs__/hostModule.cjs', + '/systems/minecraft/blockstateManager$': + '/src/tests/unit/__stubs__/hostModule.cjs', + '/systems/minecraft/registryManager$': '/src/tests/unit/__stubs__/hostModule.cjs', + }, + transform: { + '^.+\\.tsx?$': [ + '@swc/jest', + { + jsc: { parser: { syntax: 'typescript' }, target: 'es2022' }, + module: { type: 'commonjs' }, + }, + ], + }, +} diff --git a/package.json b/package.json index 90fe060f..bed98c39 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "title": "Animated Java", "icon": "icon.svg", "description": "Effortlessly craft complex animations for Minecraft: Java Edition", - "version": "1.10.2", + "version": "1.11.0", "min_blockbench_version": "5.1.4", "variant": "desktop", "tags": [ @@ -30,10 +30,8 @@ } ], "subscription_supporters": [ - "123yeah_boi321", + "CodeNeon", "alumina6767", - "LadyCailin", - "VonLeipenstein", "Zoe" ], "special_thanks": [ @@ -78,13 +76,18 @@ "dev": "yarn build:scripts && node ./dist/build.cjs --mode=dev", "prod": "node ./.scripts/cleanupDist.cjs && yarn build:scripts && node ./dist/build.cjs", "format": "prettier --write .", - "test": "yarn build:scripts && vitest run", - "coverage": "yarn build:scripts && vitest run --coverage", + "test": "yarn test:unit && yarn prod && jest", + "test:unit": "jest --config jest.unit.config.mjs", + "test:only": "jest", "check-formatting": "prettier . --check", "lint": "eslint . --max-warnings=0 --no-warn-ignored" }, "devDependencies": { + "@jest/globals": "^30.5.1", "@novacbn/svelte-codejar": "^0.1.2", + "@snavesutit/jestbench": "^0.2.1", + "@swc/core": "^1.16.1", + "@swc/jest": "^0.2.39", "@types/download": "^8.0.5", "@types/eslint": "^8.21.1", "@types/js-yaml": "^4.0.5", @@ -92,9 +95,9 @@ "@types/websocket": "^1.0.10", "@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/parser": "^5.54.0", - "blockbench-patch-manager": "^1.1.0", - "book-and-quill": "^1.0.10", - "esbuild": "^0.17.10", + "blockbench-patch-manager": "^1.3.0", + "book-and-quill": "^1.1.0", + "esbuild": "^0.21.5", "esbuild-plugin-import-folder": "^1.0.1", "esbuild-plugin-import-glob": "^0.1.1", "esbuild-plugin-inline-image": "^0.0.9", @@ -103,12 +106,14 @@ "eslint": "^9.37.0", "eslint-plugin-svelte": "^3.12.4", "firebase": "^9.19.0", + "jest": "^30", "jiti": "^2.6.1", "js-yaml": "^4.1.0", "mc-build": "^4.1.3", "node-modules-vscode-problems-patch": "^1.0.9", "octokit": "^5.0.3", "prettier": "^3.8.2", + "prettier-plugin-svelte": "^4.1.1", "simple-subpub": "^1.2.0", "svelte": "^5.55.3", "svelte-awesome-color-picker": "^3.0.0-beta.7", @@ -119,10 +124,10 @@ "svelte-preprocess": "^6.0.3", "svelte-preprocess-esbuild": "^3.0.1", "typescript": "^6.0.2", - "typescript-eslint": "^8.45.0", - "vitest": "^3.2.4" + "typescript-eslint": "^8.45.0" }, "dependencies": { + "block-model-renderer": "^2.15.2", "deepslate": "^0.19.2", "fflate": "^0.8.2", "generic-stream": "^3.0.1", @@ -131,7 +136,12 @@ "marked-gfm-heading-id": "^3.0.0", "request-progress": "^3.0.0", "svelte-ace": "^1.0.21", - "svelte-dnd-action": "^0.9.38" + "svelte-dnd-action": "^0.9.79" }, + "trustedDependencies": [ + "electron", + "esbuild", + "sharp" + ], "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/schemas/example-plugin-blueprint.json b/schemas/example-plugin-blueprint.json index d3e084d2..d4e63ec0 100644 --- a/schemas/example-plugin-blueprint.json +++ b/schemas/example-plugin-blueprint.json @@ -1,6 +1,6 @@ { "$schema": "./plugin-blueprint.schema.json", - "format_version": 1, + "format_version": 3, "settings": { "id": "animated_java:blueprint" }, @@ -19,13 +19,10 @@ "resource_location": "minecraft:block/stone" } }, - "texture_palettes": { - "default_palette": { - "active_state": "default", - "states": { - "default": { "texture": "custom_texture" }, - "alternative": { "texture": "reference_texture" } - } + "texture_slots": { + "body": { + "default_texture": "custom_texture", + "textures": ["custom_texture", "reference_texture"] } }, "nodes": { @@ -39,7 +36,7 @@ "rotation": [5, 180, 0], "head_rotation": [5, 180] }, - "display_properties": { + "entity_properties": { "billboard": "vertical", "custom_brightness": 10, "custom_name": "'Bone Node'", @@ -90,8 +87,8 @@ "down": { "uv": [0, 0, 16, 16], "texture_provider": { - "type": "texture_palette", - "texture_palette": "default_palette" + "type": "texture_slot", + "texture_slot": "body" } } }, @@ -138,8 +135,8 @@ "down": { "uv": [0, 0, 16, 16], "texture_provider": { - "type": "texture_palette", - "texture_palette": "default_palette" + "type": "texture_slot", + "texture_slot": "body" } } }, @@ -180,8 +177,8 @@ "down": { "uv": [0, 0, 16, 16], "texture_provider": { - "type": "texture_palette", - "texture_palette": "default_palette" + "type": "texture_slot", + "texture_slot": "body" } } }, @@ -198,7 +195,7 @@ }, "position": [0, 1.625, 0] }, - "display_properties": { + "entity_properties": { "billboard": "vertical", "is_glowing": true, "shadow_radius": 3.0, @@ -224,7 +221,7 @@ "head_rotation": [4.61854, 202.57734], "scale": [1.0625, 1.125, 1] }, - "display_properties": { + "entity_properties": { "billboard": "horizontal", "custom_brightness": 15, "custom_name": "'Block Display Node'", @@ -235,7 +232,7 @@ }, "text_display_node": { "type": "text_display", - "display_properties": { + "entity_properties": { "custom_brightness": 5, "is_custom_brightness_enabled": true, "is_glowing": true, @@ -260,9 +257,9 @@ "start_delay": "0.0", "length": 3.0, "global_keyframes": { - "texture": { - "0.0": { "default_palette": "default" }, - "1.5": { "default_palette": "alternative" } + "texture_slot": { + "0.0": { "body": "custom_texture" }, + "1.5": { "body": "reference_texture" } }, "event": { "1.5": { "events": ["event_1", "event_2"] }, diff --git a/schemas/plugin-blueprint.schema.json b/schemas/plugin-blueprint.schema.json index 33804ef9..258d1fd4 100644 --- a/schemas/plugin-blueprint.schema.json +++ b/schemas/plugin-blueprint.schema.json @@ -27,12 +27,21 @@ } } }, - "texture_palettes": { + "texture_slots": { "type": "object", "default": {}, "patternProperties": { "^[a-z0-9_]+$": { - "$ref": "#/definitions/texture_palette" + "$ref": "#/definitions/texture_slot" + } + } + }, + "variants": { + "type": "object", + "default": {}, + "patternProperties": { + "^[a-z0-9_]+$": { + "$ref": "#/definitions/variant" } } }, @@ -128,30 +137,57 @@ } ] }, - "texture_palette": { + "texture_slot": { "type": "object", - "required": ["active_state", "states"], + "description": "A group of faces that can be switched to any of the slot's textures.", + "required": ["default_texture", "textures"], "properties": { - "active_state": { + "default_texture": { "type": "string", - "description": "The name of the currently active state. This value must match one of the keys defined in the 'states' map.", + "description": "The key of the texture the slot starts with. Must be one of 'textures'.", "pattern": "^[a-z0-9_]+$" }, - "states": { + "textures": { + "type": "array", + "description": "Keys of the textures the slot can switch to, from the 'textures' section.", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^[a-z0-9_]+$" + } + } + } + }, + "variant": { + "type": "object", + "description": "A named set of changes to the rig. Applying a Variant changes every node it doesn't exclude.", + "required": ["texture_slots", "excluded_nodes", "entity_properties"], + "properties": { + "is_default": { + "type": "boolean", + "default": false, + "description": "Whether this is the default Variant. Exactly one Variant is the default." + }, + "texture_slots": { + "$ref": "#/definitions/texture_slot_changes", + "description": "The texture each slot switches to, on nodes this Variant doesn't exclude. Slots not listed are unchanged. The default Variant lists every slot with its default texture." + }, + "excluded_nodes": { + "type": "array", + "default": [], + "description": "Keys from the 'nodes' section this Variant leaves unchanged, including their texture slots.", + "items": { + "type": "string", + "pattern": "^[a-z0-9_]+$" + } + }, + "entity_properties": { "type": "object", - "description": "A map that links state names to objects representing individual states.", - "minProperties": 1, + "default": {}, + "description": "Entity properties this Variant merges onto nodes, by key from the 'nodes' section. Each value has the same shape as that node's 'entity_properties'. For the default Variant, these are the nodes' default properties.", "patternProperties": { "^[a-z0-9_]+$": { - "type": "object", - "required": ["texture"], - "properties": { - "texture": { - "type": "string", - "description": "The key of the texture used for this state, referencing an entry from the 'textures' section.", - "pattern": "^[a-z0-9_]+$" - } - } + "type": "object" } } } @@ -164,6 +200,10 @@ "type": { "type": "string" }, + "parent": { + "type": "string", + "pattern": "^[a-z0-9_]+$" + }, "default_transformation": { "$ref": "#/definitions/node_transformation" } @@ -179,7 +219,7 @@ "type": "object", "required": ["elements"], "properties": { - "display_properties": { + "entity_properties": { "$ref": "#/definitions/bone_display_properties" }, "elements": { @@ -200,7 +240,7 @@ "then": { "type": "object", "properties": { - "display_properties": { + "entity_properties": { "$ref": "#/definitions/item_display_properties" } } @@ -215,7 +255,7 @@ "then": { "type": "object", "properties": { - "display_properties": { + "entity_properties": { "$ref": "#/definitions/block_display_properties" } } @@ -230,12 +270,27 @@ "then": { "type": "object", "properties": { - "display_properties": { + "entity_properties": { "$ref": "#/definitions/text_display_properties" } } } }, + { + "if": { + "properties": { + "type": { "const": "interaction" } + } + }, + "then": { + "type": "object", + "properties": { + "entity_properties": { + "$ref": "#/definitions/interaction_entity_properties" + } + } + } + }, { "if": { "properties": { @@ -419,14 +474,14 @@ } }, { - "required": ["type", "texture_palette"], + "required": ["type", "texture_slot"], "properties": { "type": { - "const": "texture_palette" + "const": "texture_slot" }, - "texture_palette": { + "texture_slot": { "type": "string", - "description": "A valid key from the 'texture_palettes' section." + "description": "A valid key from the 'texture_slots' section." } } } @@ -605,6 +660,20 @@ } ] }, + "interaction_entity_properties": { + "type": "object", + "default": {}, + "properties": { + "width": { + "type": "number", + "default": 1 + }, + "height": { + "type": "number", + "default": 1 + } + } + }, "dynamic_animation": { "type": "object", "required": ["loop_mode", "length"], @@ -649,14 +718,25 @@ "global_keyframes": { "type": "object", "default": {}, + "description": "Keyframes that aren't tied to a node. When a 'variant' and a 'texture_slot' keyframe share a timestamp, the Variants apply first.", "properties": { - "texture": { + "variant": { "type": "object", "default": {}, - "description": "A collection of texture keyframes, identified by a floating-point timestamp.", + "description": "A collection of variant keyframes, identified by a floating-point timestamp.", "patternProperties": { "^\\d+\\.\\d+$": { - "$ref": "#/definitions/texture_keyframe" + "$ref": "#/definitions/variant_keyframe" + } + } + }, + "texture_slot": { + "type": "object", + "default": {}, + "description": "A collection of texture slot keyframes, identified by a floating-point timestamp. Each one changes every node with faces in the listed slots, regardless of Variant exclusions.", + "patternProperties": { + "^\\d+\\.\\d+$": { + "$ref": "#/definitions/texture_slot_changes" } } }, @@ -726,10 +806,19 @@ "minItems": 3, "maxItems": 3 }, - "texture_keyframe": { + "variant_keyframe": { + "type": "array", + "description": "Keys from the 'variants' section, applied in order. Later Variants override earlier ones on the nodes they change.", + "minItems": 1, + "items": { + "type": "string", + "pattern": "^[a-z0-9_]+$" + } + }, + "texture_slot_changes": { "type": "object", "default": {}, - "description": "Maps texture palettes to active states. Each key corresponds to a valid texture palette key from the 'texture_palette' section, and the value defines its active state.", + "description": "Maps keys from the 'texture_slots' section to the key of the texture each slot switches to. Slots not listed are unchanged.", "patternProperties": { "^[a-z0-9_]+$": { "type": "string", diff --git a/src/animationPreview.ts b/src/animationPreview.ts new file mode 100644 index 00000000..d4841d0d --- /dev/null +++ b/src/animationPreview.ts @@ -0,0 +1,161 @@ +import { EFFECT_ANIMATOR_CHANNELS } from './mods/customKeyframes' +import { VanillaBlockDisplay } from './outliner/vanillaBlockDisplay' +import { VanillaItemDisplay } from './outliner/vanillaItemDisplay' +import { getSlotDefaultTexture, getSlotPreviewTexture, getSlotTextures } from './textureSlots' +import { Variant } from './variants' + +/** + * What an animation has applied to the rig at the previewed time. Only exists in Animate mode with + * an animation selected. Otherwise the editor shows the Variant selected in the Variants panel. + */ +interface AnimationPreviewState { + /** Every Variant applied so far, in order. */ + variants: Variant[] + /** Bone UUID -> slot UUID -> texture UUID. Slots left out show their default texture. */ + boneSlots: Map> +} + +type PreviewEvent = + | { time: number; variants: Variant[] } + | { time: number; textureSlots: Record } + +let state: AnimationPreviewState | undefined +let stateKey = '' + +/** + * The Variant whose display entity config `node` shows: the last applied Variant that changes it. + */ +export function getPreviewVariant(node: OutlinerNode): Variant | undefined { + if (!state) return Variant.selected + for (let i = state.variants.length - 1; i >= 0; i--) { + const variant = state.variants[i] + if (variant.excludedNodes.has(node.uuid)) continue + const configs = (node as { configs?: { variants?: Record } }).configs + if (variant.isDefault || configs?.variants?.[variant.uuid] !== undefined) return variant + } + return Variant.getDefault() +} + +/** + * The texture a slot shows on faces of `bone`. + */ +export function getPreviewSlotTexture(slot: Texture, bone: OutlinerNode | undefined) { + if (!state) { + // The selected Variant leaves the slots it sets on excluded bones at their default. + const variant = Variant.selected + const excluded = + bone && variant?.excludedNodes.has(bone.uuid) && variant.slotTextures.has(slot.uuid) + return excluded ? getSlotDefaultTexture(slot) : getSlotPreviewTexture(slot) + } + const uuid = bone && state.boneSlots.get(bone.uuid)?.get(slot.uuid) + const textures = getSlotTextures(slot) + return textures.find(t => t.uuid === uuid) ?? textures[0] +} + +function getAnimationStartVariants(animation: _Animation): Variant[] { + const variants = (animation.preview_variants ?? []) + .map(uuid => Variant.getByUUID(uuid)) + .filter((v): v is Variant => !!v) + return variants.length ? variants : [Variant.getDefault()] +} + +function getPreviewEvents(animation: _Animation, time: number): PreviewEvent[] { + const effects = animation.animators.effects as unknown as EffectAnimator | undefined + const events: PreviewEvent[] = [] + if (effects && !effects.muted[EFFECT_ANIMATOR_CHANNELS.VARIANT]) { + for (const kf of effects[EFFECT_ANIMATOR_CHANNELS.VARIANT] as _Keyframe[]) { + if (kf.time <= time) events.push({ time: kf.time, variants: kf.variants ?? [] }) + } + } + if (effects && !effects.muted[EFFECT_ANIMATOR_CHANNELS.TEXTURE_SLOT]) { + for (const kf of effects[EFFECT_ANIMATOR_CHANNELS.TEXTURE_SLOT] as _Keyframe[]) { + if (kf.time <= time) + events.push({ time: kf.time, textureSlots: kf.texture_slots ?? {} }) + } + } + // Variants apply before texture slots on the same frame, like in-game. + return events.sort( + (a, b) => a.time - b.time || Number('textureSlots' in a) - Number('textureSlots' in b) + ) +} + +/** + * Replays what `animation` applies to the rig, from its start state up to `time`. + */ +export function computeAnimationPreviewState( + animation: _Animation, + time: number +): AnimationPreviewState { + const result: AnimationPreviewState = { variants: [], boneSlots: new Map() } + const bones = Group.all + + const applyVariant = (variant: Variant) => { + result.variants.push(variant) + for (const bone of bones) { + if (variant.excludedNodes.has(bone.uuid)) continue + if (variant.isDefault) { + result.boneSlots.delete(bone.uuid) + continue + } + for (const [slotUuid, textureUuid] of variant.slotTextures) { + setBoneSlot(bone.uuid, slotUuid, textureUuid) + } + } + } + const applyTextureSlots = (textureSlots: Record) => { + for (const [slotUuid, textureUuid] of Object.entries(textureSlots)) { + for (const bone of bones) setBoneSlot(bone.uuid, slotUuid, textureUuid) + } + } + const setBoneSlot = (boneUuid: string, slotUuid: string, textureUuid: string) => { + let slots = result.boneSlots.get(boneUuid) + if (!slots) result.boneSlots.set(boneUuid, (slots = new Map())) + slots.set(slotUuid, textureUuid) + } + + for (const variant of getAnimationStartVariants(animation)) applyVariant(variant) + applyTextureSlots(animation.preview_texture_slots ?? {}) + for (const event of getPreviewEvents(animation, time)) { + if ('variants' in event) event.variants.forEach(applyVariant) + else applyTextureSlots(event.textureSlots) + } + return result +} + +function getStateKey(previewState: AnimationPreviewState | undefined) { + if (!previewState) return '' + const slots = [...previewState.boneSlots].map(([bone, map]) => [bone, [...map]]) + return JSON.stringify([previewState.variants.map(v => v.uuid), slots]) +} + +/** + * Forgets the previewed animation, so the next update starts fresh. Used when switching projects. + */ +export function resetAnimationPreview() { + state = undefined + stateKey = '' +} + +/** + * Re-renders everything that depends on which Variant or slot texture is shown. + */ +export function refreshVariantPreview() { + Canvas.updateAllFaces() + VanillaBlockDisplay.forceUpdateAll() + VanillaItemDisplay.forceUpdateAll() +} + +/** + * Previews the selected animation's Variants and texture slots in Animate mode, or the Variants + * panel's selection everywhere else. Only re-renders when what's shown changes. + */ +export function updateAnimationPreview() { + const animation = Modes.animate ? Blockbench.Animation.selected : undefined + const next = animation ? computeAnimationPreviewState(animation, animation.time) : undefined + const nextKey = getStateKey(next) + const wasActive = !!state + state = next + if (nextKey === stateKey && wasActive === !!next) return + stateKey = nextKey + refreshVariantPreview() +} diff --git a/src/assets/vanillaAssetOverrides/animated_java/textures/steve.png b/src/assets/vanillaAssetOverrides/animated_java/textures/steve.png deleted file mode 100644 index 784d21cf..00000000 Binary files a/src/assets/vanillaAssetOverrides/animated_java/textures/steve.png and /dev/null differ diff --git a/src/assets/vanillaAssetOverrides/index.json b/src/assets/vanillaAssetOverrides/index.json deleted file mode 100644 index 0967ef42..00000000 --- a/src/assets/vanillaAssetOverrides/index.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/black_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/black_bed.json deleted file mode 100644 index 462eb463..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/black_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/black_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/black_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/black_shulker_box.json deleted file mode 100644 index 4ac7e959..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/black_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/black_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/blue_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/blue_bed.json deleted file mode 100644 index 9fd7a60e..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/blue_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/blue_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/blue_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/blue_shulker_box.json deleted file mode 100644 index 9fbb5eb4..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/blue_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/blue_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/brown_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/brown_bed.json deleted file mode 100644 index c6ae2896..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/brown_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/brown_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/brown_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/brown_shulker_box.json deleted file mode 100644 index 50c0e4bd..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/brown_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/brown_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/chest.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/chest.json deleted file mode 100644 index 9889d2bd..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/chest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/chest" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/conduit.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/conduit.json deleted file mode 100644 index 509c7e8e..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/conduit.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/conduit" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/cyan_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/cyan_bed.json deleted file mode 100644 index 28f99dcf..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/cyan_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/cyan_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/cyan_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/cyan_shulker_box.json deleted file mode 100644 index 1e0167f9..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/cyan_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/cyan_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/ender_chest.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/ender_chest.json deleted file mode 100644 index 045830a0..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/ender_chest.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/ender_chest" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/gray_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/gray_bed.json deleted file mode 100644 index 3cb3af71..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/gray_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/gray_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/gray_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/gray_shulker_box.json deleted file mode 100644 index 214ca7c4..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/gray_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/gray_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/green_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/green_bed.json deleted file mode 100644 index d4c9dc4c..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/green_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/green_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/green_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/green_shulker_box.json deleted file mode 100644 index 7623bc3e..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/green_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/green_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_blue_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_blue_bed.json deleted file mode 100644 index 0c2dbdbd..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_blue_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/light_blue_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_blue_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_blue_shulker_box.json deleted file mode 100644 index c40ecde7..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_blue_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/light_blue_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_gray_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_gray_bed.json deleted file mode 100644 index ce874ca9..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_gray_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/light_gray_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_gray_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_gray_shulker_box.json deleted file mode 100644 index 11b479b5..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/light_gray_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/light_gray_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/lime_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/lime_bed.json deleted file mode 100644 index f8980092..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/lime_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/lime_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/lime_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/lime_shulker_box.json deleted file mode 100644 index 743f5a78..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/lime_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/lime_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/magenta_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/magenta_bed.json deleted file mode 100644 index ccafa9d4..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/magenta_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/magenta_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/magenta_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/magenta_shulker_box.json deleted file mode 100644 index 3cee5dfd..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/magenta_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/magenta_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/orange_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/orange_bed.json deleted file mode 100644 index 08f1c48b..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/orange_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/orange_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/orange_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/orange_shulker_box.json deleted file mode 100644 index bc22a74b..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/orange_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/orange_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/pink_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/pink_bed.json deleted file mode 100644 index af614849..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/pink_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/pink_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/pink_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/pink_shulker_box.json deleted file mode 100644 index a2adcbe3..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/pink_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/pink_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/purple_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/purple_bed.json deleted file mode 100644 index d35c2246..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/purple_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/purple_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/purple_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/purple_shulker_box.json deleted file mode 100644 index 0c1e0711..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/purple_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/purple_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/red_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/red_bed.json deleted file mode 100644 index 281d5a44..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/red_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/red_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/red_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/red_shulker_box.json deleted file mode 100644 index d580b1b3..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/red_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/red_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/shulker_box.json deleted file mode 100644 index 9efe89ad..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/white_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/white_bed.json deleted file mode 100644 index 0c1244f2..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/white_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/white_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/white_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/white_shulker_box.json deleted file mode 100644 index 4524b795..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/white_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/white_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/yellow_bed.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/yellow_bed.json deleted file mode 100644 index dec2d725..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/yellow_bed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/yellow_bed" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/blockstates/yellow_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/blockstates/yellow_shulker_box.json deleted file mode 100644 index bd67c758..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/blockstates/yellow_shulker_box.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "variants": { - "": { - "model": "minecraft:block/yellow_shulker_box" - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/bed.json deleted file mode 100644 index 0f4a12a3..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/bed.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 64], - "elements": [ - { - "name": "bed", - "from": [0, 3, 0], - "to": [16, 9, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 0, 0]}, - "faces": { - "north": {"uv": [9.5, 0, 5.5, 1.5], "rotation": 180, "texture": "#0"}, - "east": {"uv": [0, 1.5, 1.5, 5.5], "rotation": 270, "texture": "#0"}, - "south": {"uv": [5.5, 1.5, 1.5, 0], "texture": "#0"}, - "west": {"uv": [5.5, 1.5, 7, 5.5], "rotation": 90, "texture": "#0"}, - "up": {"uv": [1.5, 1.5, 5.5, 5.5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [7, 1.5, 11, 5.5], "texture": "#0"} - } - }, - { - "name": "bed", - "from": [0, 3, -16], - "to": [16, 9, 0], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 0, 0]}, - "faces": { - "north": {"uv": [9.5, 5.5, 5.5, 7], "rotation": 180, "texture": "#0"}, - "east": {"uv": [0, 7, 1.5, 11], "rotation": 270, "texture": "#0"}, - "south": {"uv": [5.5, 7, 1.5, 5.5], "texture": "#0"}, - "west": {"uv": [5.5, 7, 7, 11], "rotation": 90, "texture": "#0"}, - "up": {"uv": [1.5, 7, 5.5, 11], "rotation": 180, "texture": "#0"}, - "down": {"uv": [7, 7, 11, 11], "texture": "#0"} - } - }, - { - "name": "leg0", - "from": [13, 0, -16], - "to": [16, 3, -13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]}, - "faces": { - "north": {"uv": [13.25, 0.75, 14, 1.5], "texture": "#0"}, - "east": {"uv": [12.5, 0.75, 13.25, 1.5], "texture": "#0"}, - "south": {"uv": [14.75, 0.75, 15.5, 1.5], "texture": "#0"}, - "west": {"uv": [14, 0.75, 14.75, 1.5], "texture": "#0"}, - "up": {"uv": [14, 0.75, 13.25, 0], "texture": "#0"}, - "down": {"uv": [14.75, 0, 14, 0.75], "texture": "#0"} - } - }, - { - "name": "leg1", - "from": [13, 0, 13], - "to": [16, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]}, - "faces": { - "north": {"uv": [13.25, 2.25, 14, 3], "texture": "#0"}, - "east": {"uv": [12.5, 2.25, 13.25, 3], "texture": "#0"}, - "south": {"uv": [14.75, 2.25, 15.5, 3], "texture": "#0"}, - "west": {"uv": [14, 2.25, 14.75, 3], "texture": "#0"}, - "up": {"uv": [14, 2.25, 13.25, 1.5], "texture": "#0"}, - "down": {"uv": [14.75, 1.5, 14, 2.25], "texture": "#0"} - } - }, - { - "name": "leg2", - "from": [0, 0, -16], - "to": [3, 3, -13], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]}, - "faces": { - "north": {"uv": [13.25, 3.75, 14, 4.5], "texture": "#0"}, - "east": {"uv": [12.5, 3.75, 13.25, 4.5], "texture": "#0"}, - "south": {"uv": [14.75, 3.75, 15.5, 4.5], "texture": "#0"}, - "west": {"uv": [14, 3.75, 14.75, 4.5], "texture": "#0"}, - "up": {"uv": [14, 3.75, 13.25, 3], "texture": "#0"}, - "down": {"uv": [14.75, 3, 14, 3.75], "texture": "#0"} - } - }, - { - "name": "leg3", - "from": [0, 0, 13], - "to": [3, 3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 0]}, - "faces": { - "north": {"uv": [13.25, 5.25, 14, 6], "texture": "#0"}, - "east": {"uv": [12.5, 5.25, 13.25, 6], "texture": "#0"}, - "south": {"uv": [14.75, 5.25, 15.5, 6], "texture": "#0"}, - "west": {"uv": [14, 5.25, 14.75, 6], "texture": "#0"}, - "up": {"uv": [14, 5.25, 13.25, 4.5], "texture": "#0"}, - "down": {"uv": [14.75, 4.5, 14, 5.25], "texture": "#0"} - } - } - ], - "groups": [ - { - "name": "bed", - "origin": [8, 0, 8], - "color": 0, - "children": [0, 1] - }, - { - "name": "leg0", - "origin": [14.5, 1.5, -6.5], - "color": 0, - "children": [2] - }, - { - "name": "leg1", - "origin": [14.5, 1.5, 22.5], - "color": 0, - "children": [3] - }, - { - "name": "leg2", - "origin": [1.5, 1.5, -6.5], - "color": 0, - "children": [4] - }, - { - "name": "leg3", - "origin": [1.5, 1.5, 22.5], - "color": 0, - "children": [5] - } - ] -} \ No newline at end of file diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/black_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/black_bed.json deleted file mode 100644 index 57c82022..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/black_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/black" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/black_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/black_shulker_box.json deleted file mode 100644 index eb269330..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/black_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_black" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/blue_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/blue_bed.json deleted file mode 100644 index fdaf6806..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/blue_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/blue" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/blue_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/blue_shulker_box.json deleted file mode 100644 index 472d1f7a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/blue_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_blue" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/brown_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/brown_bed.json deleted file mode 100644 index 2b88c6a6..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/brown_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/brown" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/brown_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/brown_shulker_box.json deleted file mode 100644 index 606900fd..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/brown_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_brown" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/chest.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/chest.json deleted file mode 100644 index 73a8d454..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/chest.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "parent": "block/block", - "textures": { - "0": "entity/chest/normal" - }, - "elements": [ - { - "from": [1, 9, 1], - "to": [15, 14, 15], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 11.5, 8] }, - "faces": { - "north": { "uv": [7, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" }, - "east": { "uv": [3.5, 3.5, 0, 4.75], "rotation": 180, "texture": "#0" }, - "south": { "uv": [14, 3.5, 10.5, 4.75], "rotation": 180, "texture": "#0" }, - "west": { "uv": [10.5, 3.5, 7, 4.75], "rotation": 180, "texture": "#0" }, - "up": { "uv": [7, 3.5, 10.5, 0], "texture": "#0" }, - "down": { "uv": [3.5, 3.5, 7, 0], "texture": "#0" } - } - }, - { - "from": [7, 8, 15], - "to": [9, 12, 16], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 10, 15.5] }, - "faces": { - "north": { "uv": [1, 1.25, 0.5, 0.25], "texture": "#0" }, - "east": { "uv": [0.5, 1.25, 0.25, 0.25], "texture": "#0" }, - "south": { "uv": [1, 1.25, 0.5, 0.25], "texture": "#0" }, - "west": { "uv": [1.25, 1.25, 1, 0.25], "texture": "#0" }, - "up": { "uv": [0.5, 0.25, 1, 0], "texture": "#0" }, - "down": { "uv": [0.5, 0.25, 1, 0], "texture": "#0" } - } - }, - { - "from": [1, 0, 1], - "to": [15, 10, 15], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 5, 8] }, - "faces": { - "north": { "uv": [7, 8.25, 3.5, 10.75], "rotation": 180, "texture": "#0" }, - "east": { "uv": [10.5, 8.25, 7, 10.75], "rotation": 180, "texture": "#0" }, - "south": { "uv": [14, 8.25, 10.5, 10.75], "rotation": 180, "texture": "#0" }, - "west": { "uv": [3.5, 8.25, 0, 10.75], "rotation": 180, "texture": "#0" }, - "up": { "uv": [7, 8.25, 10.5, 4.75], "texture": "#0" }, - "down": { "uv": [3.5, 8.25, 7, 4.75], "rotation": 180, "texture": "#0" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/conduit.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/conduit.json deleted file mode 100644 index f0e4447e..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/conduit.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [32, 16], - "textures": { - "0": "minecraft:entity/conduit/base", - "particle": "minecraft:entity/conduit/base" - }, - "elements": [ - { - "from": [5, 5, 5], - "to": [11, 11, 11], - "rotation": { "angle": 0, "axis": "y", "origin": [5, 5, 5] }, - "faces": { - "north": { "uv": [3, 6, 6, 12], "texture": "#0" }, - "east": { "uv": [0, 6, 3, 12], "texture": "#0" }, - "south": { "uv": [9, 6, 12, 12], "texture": "#0" }, - "west": { "uv": [6, 6, 9, 12], "texture": "#0" }, - "up": { "uv": [6, 6, 3, 0], "texture": "#0" }, - "down": { "uv": [9, 0, 6, 6], "texture": "#0" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/cyan_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/cyan_bed.json deleted file mode 100644 index 9fccd84a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/cyan_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/cyan" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/cyan_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/cyan_shulker_box.json deleted file mode 100644 index 42e269ab..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/cyan_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_cyan" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/ender_chest.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/ender_chest.json deleted file mode 100644 index 25ddd45b..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/ender_chest.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "textures": { - "0": "entity/chest/ender" - }, - "elements": [ - { - "from": [1, 9, 1], - "to": [15, 14, 15], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 11.5, 8] }, - "faces": { - "north": { "uv": [10.5, 3.5, 14, 4.75], "rotation": 180, "texture": "#0" }, - "east": { "uv": [0, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" }, - "south": { "uv": [3.5, 3.5, 7, 4.75], "rotation": 180, "texture": "#0" }, - "west": { "uv": [7, 3.5, 10.5, 4.75], "rotation": 180, "texture": "#0" }, - "up": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" }, - "down": { "uv": [3.5, 0, 7, 3.5], "texture": "#0" } - } - }, - { - "from": [7, 8, 0], - "to": [9, 12, 1], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 10, 0.5] }, - "faces": { - "north": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" }, - "east": { "uv": [0.25, 1.25, 0.5, 0.25], "texture": "#0" }, - "south": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" }, - "west": { "uv": [1, 1.25, 1.25, 0.25], "texture": "#0" }, - "up": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" }, - "down": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" } - } - }, - { - "from": [1, 0, 1], - "to": [15, 10, 15], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 5, 8] }, - "faces": { - "north": { "uv": [10.5, 8.25, 14, 10.75], "rotation": 180, "texture": "#0" }, - "east": { "uv": [7, 8.25, 10.5, 10.75], "rotation": 180, "texture": "#0" }, - "south": { "uv": [3.5, 8.25, 7, 10.75], "rotation": 180, "texture": "#0" }, - "west": { "uv": [0, 8.25, 3.5, 10.75], "rotation": 180, "texture": "#0" }, - "up": { "uv": [7, 4.75, 10.5, 8.25], "texture": "#0" }, - "down": { "uv": [3.5, 4.75, 7, 8.25], "rotation": 180, "texture": "#0" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/gray_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/gray_bed.json deleted file mode 100644 index fd3d5140..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/gray_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/gray" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/gray_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/gray_shulker_box.json deleted file mode 100644 index 3b33366d..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/gray_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_gray" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/green_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/green_bed.json deleted file mode 100644 index 405c6d60..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/green_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/green" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/green_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/green_shulker_box.json deleted file mode 100644 index 50c46318..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/green_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_green" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_blue_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/light_blue_bed.json deleted file mode 100644 index f58cbc75..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_blue_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/light_blue" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_blue_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/light_blue_shulker_box.json deleted file mode 100644 index 83266db8..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_blue_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_light_blue" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_gray_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/light_gray_bed.json deleted file mode 100644 index d7ce483c..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_gray_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/light_gray" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_gray_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/light_gray_shulker_box.json deleted file mode 100644 index 65c79552..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/light_gray_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_light_gray" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/lime_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/lime_bed.json deleted file mode 100644 index d99d5162..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/lime_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/lime" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/lime_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/lime_shulker_box.json deleted file mode 100644 index ae717b4e..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/lime_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_lime" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/magenta_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/magenta_bed.json deleted file mode 100644 index 6ff52613..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/magenta_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/magenta" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/magenta_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/magenta_shulker_box.json deleted file mode 100644 index 917a4600..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/magenta_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_magenta" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/orange_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/orange_bed.json deleted file mode 100644 index 868a5c5b..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/orange_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/orange" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/orange_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/orange_shulker_box.json deleted file mode 100644 index 34c7214d..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/orange_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_orange" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/pink_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/pink_bed.json deleted file mode 100644 index 32b11d80..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/pink_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/pink" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/pink_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/pink_shulker_box.json deleted file mode 100644 index 072c5abb..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/pink_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_pink" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/purple_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/purple_bed.json deleted file mode 100644 index 1edecbdf..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/purple_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/purple" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/purple_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/purple_shulker_box.json deleted file mode 100644 index 10798664..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/purple_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_purple" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/red_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/red_bed.json deleted file mode 100644 index f39725ac..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/red_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/red" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/red_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/red_shulker_box.json deleted file mode 100644 index f2a185f3..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/red_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_red" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/shulker_box.json deleted file mode 100644 index d4890e6d..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/shulker_box.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "0": "entity/shulker/shulker", - "particle": "entity/shulker/shulker" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { "uv": [0, 9, 4, 13], "texture": "#0" }, - "east": { "uv": [0, 9, 4, 13], "texture": "#0" }, - "south": { "uv": [0, 9, 4, 13], "texture": "#0" }, - "west": { "uv": [0, 9, 4, 13], "texture": "#0" }, - "down": { "uv": [8, 7, 12, 11], "texture": "#0" } - } - }, - { - "from": [0, 0, 0], - "to": [16, 16, 16], - "faces": { - "north": { "uv": [0, 4, 4, 8], "texture": "#0" }, - "east": { "uv": [0, 4, 4, 8], "texture": "#0" }, - "south": { "uv": [0, 4, 4, 8], "texture": "#0" }, - "west": { "uv": [0, 4, 4, 8], "texture": "#0" }, - "up": { "uv": [4, 0, 8, 4], "texture": "#0" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/white_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/white_bed.json deleted file mode 100644 index e889fa63..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/white_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/white" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/white_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/white_shulker_box.json deleted file mode 100644 index f41d2b06..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/white_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_white" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/yellow_bed.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/yellow_bed.json deleted file mode 100644 index 200a1d46..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/yellow_bed.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/bed", - "textures": { - "0": "entity/bed/yellow" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/block/yellow_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/block/yellow_shulker_box.json deleted file mode 100644 index 3e184271..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/block/yellow_shulker_box.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "block/shulker_box", - "textures": { - "0": "entity/shulker/shulker_yellow" - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/black_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/black_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/black_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/black_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/black_shulker_box.json deleted file mode 100644 index a9ba4851..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/black_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/black_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/blue_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/blue_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/blue_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/blue_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/blue_shulker_box.json deleted file mode 100644 index e5f42972..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/blue_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/blue_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/brown_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/brown_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/brown_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/brown_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/brown_shulker_box.json deleted file mode 100644 index 57a3a34f..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/brown_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/brown_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/conduit.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/conduit.json deleted file mode 100644 index ecce55d6..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/conduit.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "parent": "block/conduit", - "textures": { - "particle": "block/conduit" - }, - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [1.0, 1.0, 1.0] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.5, 0.5, 0.5] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.5, 0.5, 0.5] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.8, 0.8, 0.8] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/creeper_head.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/creeper_head.json deleted file mode 100644 index 627544a8..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/creeper_head.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 32], - "textures": { - "0": "entity/creeper/creeper" - }, - "elements": [ - { - "name": "Head", - "from": [4, -8, 4], - "to": [12, 0, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -4, 8]}, - "faces": { - "north": {"uv": [2, 4, 4, 8], "texture": "#0"}, - "east": {"uv": [0, 4, 2, 8], "texture": "#0"}, - "south": {"uv": [6, 4, 8, 8], "texture": "#0"}, - "west": {"uv": [4, 4, 6, 8], "texture": "#0"}, - "up": {"uv": [4, 4, 2, 0], "texture": "#0"}, - "down": {"uv": [6, 0, 4, 4], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/cyan_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/cyan_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/cyan_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/cyan_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/cyan_shulker_box.json deleted file mode 100644 index 7374e97a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/cyan_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/cyan_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/decorated_pot.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/decorated_pot.json deleted file mode 100644 index f2679f4c..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/decorated_pot.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "0": "entity/decorated_pot/decorated_pot_side", - "1": "entity/decorated_pot/decorated_pot_base", - "particle": "entity/decorated_pot/decorated_pot_side" - }, - "elements": [ - { - "from": [1, 0, 1], - "to": [15, 16, 15], - "faces": { - "north": { "uv": [1, 0, 15, 16], "texture": "#0" }, - "east": { "uv": [1, 0, 15, 16], "texture": "#0" }, - "south": { "uv": [1, 0, 15, 16], "texture": "#0" }, - "west": { "uv": [1, 0, 15, 16], "texture": "#0" }, - "up": { "uv": [7, 6.5, 14, 13.5], "texture": "#1" }, - "down": { "uv": [0, 6.5, 7, 13.5], "texture": "#1" } - } - }, - { - "from": [4.75, 16, 4.75], - "to": [11.25, 20, 11.25], - "rotation": { "angle": 0, "axis": "y", "origin": [6, 16, 6] }, - "faces": { - "north": { "uv": [0, 4, 4, 6], "texture": "#1" }, - "east": { "uv": [0, 4, 4, 6], "texture": "#1" }, - "south": { "uv": [0, 4, 4, 6], "texture": "#1" }, - "west": { "uv": [0, 4, 4, 6], "texture": "#1" } - } - }, - { - "from": [4, 17, 4], - "to": [12, 20, 12], - "rotation": { "angle": 0, "axis": "y", "origin": [6, 17, 6] }, - "faces": { - "north": { "uv": [12, 4, 16, 5.5], "texture": "#1" }, - "east": { "uv": [12, 4, 16, 5.5], "texture": "#1" }, - "south": { "uv": [12, 4, 16, 5.5], "texture": "#1" }, - "west": { "uv": [12, 4, 16, 5.5], "texture": "#1" }, - "up": { "uv": [4, 0, 8, 4], "texture": "#1" }, - "down": { "uv": [8, 0, 12, 4], "texture": "#1" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/dragon_head.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/dragon_head.json deleted file mode 100644 index 715432d9..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/dragon_head.json +++ /dev/null @@ -1,128 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [256, 256], - "textures": { - "0": "enderdragon" - }, - "elements": [ - { - "name": "head", - "from": [2, -6, -16], - "to": [14, -1, 0], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 8]}, - "faces": { - "north": {"uv": [12, 3.75, 12.75, 4.0625], "texture": "#0"}, - "east": {"uv": [11, 3.75, 12, 4.0625], "texture": "#0"}, - "south": {"uv": [13.75, 3.75, 14.5, 4.0625], "texture": "#0"}, - "west": {"uv": [12.75, 3.75, 13.75, 4.0625], "texture": "#0"}, - "up": {"uv": [12.75, 3.75, 12, 2.75], "texture": "#0"}, - "down": {"uv": [13.5, 2.75, 12.75, 3.75], "texture": "#0"} - } - }, - { - "name": "head", - "from": [0, -10, 0], - "to": [16, 6, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 24]}, - "faces": { - "north": {"uv": [8, 2.875, 9, 3.875], "texture": "#0"}, - "east": {"uv": [7, 2.875, 8, 3.875], "texture": "#0"}, - "south": {"uv": [10, 2.875, 11, 3.875], "texture": "#0"}, - "west": {"uv": [9, 2.875, 10, 3.875], "texture": "#0"}, - "up": {"uv": [9, 2.875, 8, 1.875], "texture": "#0"}, - "down": {"uv": [10, 1.875, 9, 2.875], "texture": "#0"} - } - }, - { - "name": "head", - "from": [11, 6, 6], - "to": [13, 10, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 30]}, - "faces": { - "north": {"uv": [0.5, 0.375, 0.375, 0.625], "texture": "#0"}, - "east": {"uv": [0.875, 0.375, 0.5, 0.625], "texture": "#0"}, - "south": {"uv": [1, 0.375, 0.875, 0.625], "texture": "#0"}, - "west": {"uv": [0.375, 0.375, 0, 0.625], "texture": "#0"}, - "up": {"uv": [0.375, 0.375, 0.5, 0], "texture": "#0"}, - "down": {"uv": [0.5, 0, 0.625, 0.375], "texture": "#0"} - } - }, - { - "name": "head", - "from": [11, -1, -16], - "to": [13, 1, -12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 8]}, - "faces": { - "north": {"uv": [7.375, 0.25, 7.25, 0.375], "texture": "#0"}, - "east": {"uv": [7.625, 0.25, 7.375, 0.375], "texture": "#0"}, - "south": {"uv": [7.75, 0.25, 7.625, 0.375], "texture": "#0"}, - "west": {"uv": [7.25, 0.25, 7, 0.375], "texture": "#0"}, - "up": {"uv": [7.25, 0.25, 7.375, 0], "texture": "#0"}, - "down": {"uv": [7.375, 0, 7.5, 0.25], "texture": "#0"} - } - }, - { - "name": "head", - "from": [3, 6, 6], - "to": [5, 10, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 30]}, - "faces": { - "north": {"uv": [0.375, 0.375, 0.5, 0.625], "texture": "#0"}, - "east": {"uv": [0, 0.375, 0.375, 0.625], "texture": "#0"}, - "south": {"uv": [0.875, 0.375, 1, 0.625], "texture": "#0"}, - "west": {"uv": [0.5, 0.375, 0.875, 0.625], "texture": "#0"}, - "up": {"uv": [0.5, 0.375, 0.375, 0], "texture": "#0"}, - "down": {"uv": [0.625, 0, 0.5, 0.375], "texture": "#0"} - } - }, - { - "name": "head", - "from": [3, -1, -16], - "to": [5, 1, -12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -9, 8]}, - "faces": { - "north": {"uv": [7.25, 0.25, 7.375, 0.375], "texture": "#0"}, - "east": {"uv": [7, 0.25, 7.25, 0.375], "texture": "#0"}, - "south": {"uv": [7.625, 0.25, 7.75, 0.375], "texture": "#0"}, - "west": {"uv": [7.375, 0.25, 7.625, 0.375], "texture": "#0"}, - "up": {"uv": [7.375, 0.25, 7.25, 0], "texture": "#0"}, - "down": {"uv": [7.5, 0, 7.375, 0.25], "texture": "#0"} - } - }, - { - "name": "jaw", - "from": [2, -10, -16], - "to": [14, -6, 0], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, -6, 0]}, - "faces": { - "north": {"uv": [12, 5.0625, 12.75, 5.3125], "texture": "#0"}, - "east": {"uv": [11, 5.0625, 12, 5.3125], "texture": "#0"}, - "south": {"uv": [13.75, 5.0625, 14.5, 5.3125], "texture": "#0"}, - "west": {"uv": [12.75, 5.0625, 13.75, 5.3125], "texture": "#0"}, - "up": {"uv": [12.75, 5.0625, 12, 4.0625], "texture": "#0"}, - "down": {"uv": [13.5, 4.0625, 12.75, 5.0625], "texture": "#0"} - } - } - ], - "groups": [ - { - "name": "head", - "origin": [8, 7, -50], - "color": 0, - "children": [ - 0, - 1, - 2, - 3, - 4, - 5, - { - "name": "jaw", - "origin": [8, 3, -63], - "color": 0, - "children": [6] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/ender_chest.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/ender_chest.json deleted file mode 100644 index 3620ea87..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/ender_chest.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "minecraft:block/ender_chest" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/gray_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/gray_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/gray_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/gray_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/gray_shulker_box.json deleted file mode 100644 index 84577af2..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/gray_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/gray_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/green_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/green_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/green_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/green_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/green_shulker_box.json deleted file mode 100644 index 3ab83019..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/green_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/green_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_blue_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/light_blue_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_blue_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_blue_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/light_blue_shulker_box.json deleted file mode 100644 index 645965d6..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_blue_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/light_blue_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_gray_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/light_gray_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_gray_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_gray_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/light_gray_shulker_box.json deleted file mode 100644 index 2ad2c558..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/light_gray_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/light_gray_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/lime_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/lime_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/lime_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/lime_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/lime_shulker_box.json deleted file mode 100644 index 2e01765d..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/lime_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/lime_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/magenta_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/magenta_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/magenta_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/magenta_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/magenta_shulker_box.json deleted file mode 100644 index 91fa9d1a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/magenta_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/magenta_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/mob_skull.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/mob_skull.json deleted file mode 100644 index e8041a1b..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/mob_skull.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "elements": [ - { - "name": "head", - "from": [4, 0, 4], - "to": [12, 8, 12], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] }, - "faces": { - "north": { "uv": [2, 4, 4, 8], "texture": "#skull" }, - "east": { "uv": [0, 4, 2, 8], "texture": "#skull" }, - "south": { "uv": [6, 4, 8, 8], "texture": "#skull" }, - "west": { "uv": [4, 4, 6, 8], "texture": "#skull" }, - "up": { "uv": [4, 4, 2, 0], "texture": "#skull" }, - "down": { "uv": [6, 0, 4, 4], "texture": "#skull" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/orange_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/orange_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/orange_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/orange_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/orange_shulker_box.json deleted file mode 100644 index f2c1dc2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/orange_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/orange_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/piglin_head.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/piglin_head.json deleted file mode 100644 index 6bd42612..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/piglin_head.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 64], - "textures": { - "0": "entity/piglin/piglin" - }, - "elements": [ - { - "name": "rightear", - "from": [12.5, -7, 6], - "to": [13.5, -2, 10], - "rotation": {"angle": 45, "axis": "z", "origin": [13, -2, 8]}, - "faces": { - "north": {"uv": [10.75, 2.5, 11, 3.75], "texture": "#0"}, - "east": {"uv": [9.75, 2.5, 10.75, 3.75], "texture": "#0"}, - "south": {"uv": [12, 2.5, 12.25, 3.75], "texture": "#0"}, - "west": {"uv": [11, 2.5, 12, 3.75], "texture": "#0"}, - "up": {"uv": [11, 2.5, 10.75, 1.5], "texture": "#0"}, - "down": {"uv": [11.25, 1.5, 11, 2.5], "texture": "#0"} - } - }, - { - "name": "leftear", - "from": [2.5, -7, 6], - "to": [3.5, -2, 10], - "rotation": {"angle": -45, "axis": "z", "origin": [3, -2, 8]}, - "faces": { - "north": {"uv": [13.75, 2.5, 14, 3.75], "texture": "#0"}, - "east": {"uv": [12.75, 2.5, 13.75, 3.75], "texture": "#0"}, - "south": {"uv": [15, 2.5, 15.25, 3.75], "texture": "#0"}, - "west": {"uv": [14, 2.5, 15, 3.75], "texture": "#0"}, - "up": {"uv": [14, 2.5, 13.75, 1.5], "texture": "#0"}, - "down": {"uv": [14.25, 1.5, 14, 2.5], "texture": "#0"} - } - }, - { - "name": "head", - "from": [10, -8, 3], - "to": [11, -6, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]}, - "faces": { - "north": {"uv": [0.75, 0.25, 1, 0.75], "texture": "#0"}, - "east": {"uv": [0.5, 0.25, 0.75, 0.75], "texture": "#0"}, - "south": {"uv": [1.25, 0.25, 1.5, 0.75], "texture": "#0"}, - "west": {"uv": [1, 0.25, 1.25, 0.75], "texture": "#0"}, - "up": {"uv": [1, 0.25, 0.75, 0], "texture": "#0"}, - "down": {"uv": [1.25, 0, 1, 0.25], "texture": "#0"} - } - }, - { - "name": "head", - "from": [5, -8, 3], - "to": [6, -6, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]}, - "faces": { - "north": {"uv": [0.75, 1.25, 1, 1.75], "texture": "#0"}, - "east": {"uv": [0.5, 1.25, 0.75, 1.75], "texture": "#0"}, - "south": {"uv": [1.25, 1.25, 1.5, 1.75], "texture": "#0"}, - "west": {"uv": [1, 1.25, 1.25, 1.75], "texture": "#0"}, - "up": {"uv": [1, 1.25, 0.75, 1], "texture": "#0"}, - "down": {"uv": [1.25, 1, 1, 1.25], "texture": "#0"} - } - }, - { - "name": "head", - "from": [6, -8, 3], - "to": [10, -4, 4], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]}, - "faces": { - "north": {"uv": [8, 0.5, 9, 1.5], "texture": "#0"}, - "east": {"uv": [7.75, 0.5, 8, 1.5], "texture": "#0"}, - "south": {"uv": [9.25, 0.5, 10.25, 1.5], "texture": "#0"}, - "west": {"uv": [9, 0.5, 9.25, 1.5], "texture": "#0"}, - "up": {"uv": [9, 0.5, 8, 0.25], "texture": "#0"}, - "down": {"uv": [10, 0.25, 9, 0.5], "texture": "#0"} - } - }, - { - "name": "head", - "from": [3.02, -7.98, 4.02], - "to": [12.98, -0.02, 11.98], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]}, - "faces": { - "north": {"uv": [2, 2, 4.5, 4], "texture": "#0"}, - "east": {"uv": [0, 2, 2, 4], "texture": "#0"}, - "south": {"uv": [6.5, 2, 9, 4], "texture": "#0"}, - "west": {"uv": [4.5, 2, 6.5, 4], "texture": "#0"}, - "up": {"uv": [4.5, 2, 2, 0], "texture": "#0"}, - "down": {"uv": [7, 0, 4.5, 2], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/pink_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/pink_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/pink_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/pink_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/pink_shulker_box.json deleted file mode 100644 index a9bdc762..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/pink_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/pink_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/player_head.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/player_head.json deleted file mode 100644 index 189ab21e..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/player_head.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 64], - "textures": { - "0": "animated_java:steve" - }, - "elements": [ - { - "name": "Hat Layer", - "from": [3.5, -8.5, 3.5], - "to": [12.5, 0.5, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -31.5, 8]}, - "faces": { - "north": {"uv": [10, 2, 12, 4], "texture": "#0"}, - "east": {"uv": [8, 2, 10, 4], "texture": "#0"}, - "south": {"uv": [14, 2, 16, 4], "texture": "#0"}, - "west": {"uv": [12, 2, 14, 4], "texture": "#0"}, - "up": {"uv": [12, 2, 10, 0], "texture": "#0"}, - "down": {"uv": [14, 0, 12, 2], "texture": "#0"} - } - }, - { - "name": "Head", - "from": [4, -8, 4], - "to": [12, 0, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]}, - "faces": { - "north": {"uv": [2, 2, 4, 4], "texture": "#0"}, - "east": {"uv": [0, 2, 2, 4], "texture": "#0"}, - "south": {"uv": [6, 2, 8, 4], "texture": "#0"}, - "west": {"uv": [4, 2, 6, 4], "texture": "#0"}, - "up": {"uv": [4, 2, 2, 0], "texture": "#0"}, - "down": {"uv": [6, 0, 4, 2], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/purple_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/purple_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/purple_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/purple_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/purple_shulker_box.json deleted file mode 100644 index 5cfadf62..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/purple_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/purple_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/red_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/red_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/red_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/red_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/red_shulker_box.json deleted file mode 100644 index 45a5e0d9..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/red_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/red_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/shield.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/shield.json deleted file mode 100644 index f8dc8aed..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/shield.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 64], - "textures": { - "0": "entity/shield_base" - }, - "elements": [ - { - "name": "shield", - "from": [16, -11, 13], - "to": [18, -5, 19], - "rotation": {"angle": 0, "axis": "y", "origin": [18, -36, 13]}, - "faces": { - "north": {"uv": [8, 1.5, 8.5, 3], "texture": "#0"}, - "east": {"uv": [6.5, 1.5, 8, 3], "texture": "#0"}, - "south": {"uv": [10, 1.5, 10.5, 3], "texture": "#0"}, - "west": {"uv": [8.5, 1.5, 10, 3], "texture": "#0"}, - "up": {"uv": [8.5, 1.5, 8, 0], "texture": "#0"}, - "down": {"uv": [9, 0, 8.5, 1.5], "texture": "#0"} - } - }, - { - "name": "shield", - "from": [11, -19, 12], - "to": [23, 3, 13], - "rotation": {"angle": 0, "axis": "y", "origin": [18, -29, 13]}, - "faces": { - "north": {"uv": [0.25, 0.25, 3.25, 5.75], "texture": "#0"}, - "east": {"uv": [0, 0.25, 0.25, 5.75], "texture": "#0"}, - "south": {"uv": [3.5, 0.25, 6.5, 5.75], "texture": "#0"}, - "west": {"uv": [3.25, 0.25, 3.5, 5.75], "texture": "#0"}, - "up": {"uv": [3.25, 0.25, 0.25, 0], "texture": "#0"}, - "down": {"uv": [6.25, 0, 3.25, 0.25], "texture": "#0"} - } - } - ], - "groups": [ - { - "name": "shield", - "origin": [7, 15.5, 11], - "color": 0, - "children": [0, 1] - } - ] -} \ No newline at end of file diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/shulker_box.json deleted file mode 100644 index 5bf34410..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/skeleton_skull.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/skeleton_skull.json deleted file mode 100644 index 1672d386..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/skeleton_skull.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 32], - "textures": { - "0": "minecraft:entity/skeleton/skeleton" - }, - "elements": [ - { - "name": "Hat Layer", - "from": [3.5, -8.5, 3.5], - "to": [12.5, 0.5, 12.5], - "rotation": { "angle": 0, "axis": "y", "origin": [8, -31.5, 8] }, - "faces": { - "north": { "uv": [10, 4, 12, 8], "texture": "#0" }, - "east": { "uv": [8, 4, 10, 8], "texture": "#0" }, - "south": { "uv": [14, 4, 16, 8], "texture": "#0" }, - "west": { "uv": [12, 4, 14, 8], "texture": "#0" }, - "up": { "uv": [12, 4, 10, 0], "texture": "#0" }, - "down": { "uv": [14, 0, 12, 4], "texture": "#0" } - } - }, - { - "name": "Head", - "from": [4, -8, 4], - "to": [12, 0, 12], - "rotation": { "angle": 0, "axis": "y", "origin": [8, -32, 8] }, - "faces": { - "north": { "uv": [2, 4, 4, 8], "texture": "#0" }, - "east": { "uv": [0, 4, 2, 8], "texture": "#0" }, - "south": { "uv": [6, 4, 8, 8], "texture": "#0" }, - "west": { "uv": [4, 4, 6, 8], "texture": "#0" }, - "up": { "uv": [4, 4, 2, 0], "texture": "#0" }, - "down": { "uv": [6, 0, 4, 4], "texture": "#0" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/template_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/template_banner.json deleted file mode 100644 index 657b3caf..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/template_banner.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 64], - "textures": { - "0": "entity/banner/base", - "tint": "entity/banner/base" - }, - "elements": [ - { - "name": "stand", - "from": [-2, 30, 7], - "to": [18, 32, 9], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 7] }, - "faces": { - "north": { "uv": [0.5, 11, 5.5, 11.5], "texture": "#0" }, - "east": { "uv": [0, 11, 0.5, 11.5], "texture": "#0" }, - "south": { "uv": [6, 11, 11, 11.5], "texture": "#0" }, - "west": { "uv": [5.5, 11, 6, 11.5], "texture": "#0" }, - "up": { "uv": [5.5, 11, 0.5, 10.5], "texture": "#0" }, - "down": { "uv": [10.5, 10.5, 5.5, 11], "texture": "#0" } - } - }, - { - "name": "stand", - "from": [7, -12, 7], - "to": [9, 30, 9], - "rotation": { "angle": 0, "axis": "y", "origin": [8, -2, 7] }, - "faces": { - "north": { "uv": [11.5, 0.5, 12, 11], "texture": "#0" }, - "east": { "uv": [11, 0.5, 11.5, 11], "texture": "#0" }, - "south": { "uv": [12.5, 0.5, 13, 11], "texture": "#0" }, - "west": { "uv": [12, 0.5, 12.5, 11], "texture": "#0" }, - "up": { "uv": [12, 0.5, 11.5, 0], "texture": "#0" }, - "down": { "uv": [12.5, 0, 12, 0.5], "texture": "#0" } - } - }, - { - "name": "banner", - "from": [-2, -8, 6], - "to": [18, 32, 7], - "rotation": { "angle": 0.5, "axis": "x", "origin": [8, 32, 7] }, - "faces": { - "north": { "uv": [0.25, 0.25, 5.25, 10.25], "texture": "#tint" }, - "east": { "uv": [0, 0.25, 0.25, 10.25], "texture": "#tint" }, - "south": { "uv": [5.5, 0.25, 10.5, 10.25], "texture": "#tint" }, - "west": { "uv": [5.25, 0.25, 5.5, 10.25], "texture": "#tint" }, - "up": { "uv": [5.25, 0.25, 0.25, 0], "texture": "#tint" }, - "down": { "uv": [10.25, 0, 5.25, 0.25], "texture": "#tint" } - } - } - ], - "display": { - "thirdperson_righthand": { - "rotation": [0, 90, 0], - "translation": [0, 2, 0.5], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 90, 0], - "scale": [0.375, 0.375, 0.375] - }, - "ground": { - "translation": [0, 1, 0], - "scale": [0.25, 0.25, 0.25] - }, - "gui": { - "rotation": [30, 20, 0], - "translation": [0, -3.25, 0], - "scale": [0.5325, 0.5325, 0.5325] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 16, 7], - "scale": [1.5, 1.5, 1.5] - }, - "fixed": { - "rotation": [0, 180, 0], - "scale": [0.5, 0.5, 0.5] - } - }, - "groups": [ - { - "name": "stand", - "origin": [8, 0, 8], - "color": 0, - "children": [ - 0, - 1, - { - "name": "banner", - "origin": [8, 44, 8], - "color": 0, - "children": [2] - } - ] - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/template_chest.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/template_chest.json deleted file mode 100644 index 70769b4c..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/template_chest.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "parent": "block/block", - "textures": { - "0": "entity/chest/normal" - }, - "elements": [ - { - "from": [1, 9, 1], - "to": [15, 14, 15], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 11.5, 8] }, - "faces": { - "north": { "uv": [10.5, 3.5, 14, 4.75], "rotation": 180, "texture": "#0" }, - "east": { "uv": [0, 3.5, 3.5, 4.75], "rotation": 180, "texture": "#0" }, - "south": { "uv": [3.5, 3.5, 7, 4.75], "rotation": 180, "texture": "#0" }, - "west": { "uv": [7, 3.5, 10.5, 4.75], "rotation": 180, "texture": "#0" }, - "up": { "uv": [7, 0, 10.5, 3.5], "texture": "#0" }, - "down": { "uv": [3.5, 0, 7, 3.5], "texture": "#0" } - } - }, - { - "from": [7, 8, 0], - "to": [9, 12, 1], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 10, 0.5] }, - "faces": { - "north": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" }, - "east": { "uv": [0.25, 1.25, 0.5, 0.25], "texture": "#0" }, - "south": { "uv": [0.5, 1.25, 1, 0.25], "texture": "#0" }, - "west": { "uv": [1, 1.25, 1.25, 0.25], "texture": "#0" }, - "up": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" }, - "down": { "uv": [0.5, 0, 1, 0.25], "texture": "#0" } - } - }, - { - "from": [1, 0, 1], - "to": [15, 10, 15], - "rotation": { "angle": 0, "axis": "y", "origin": [8, 5, 8] }, - "faces": { - "north": { "uv": [10.5, 8.25, 14, 10.75], "rotation": 180, "texture": "#0" }, - "east": { "uv": [7, 8.25, 10.5, 10.75], "rotation": 180, "texture": "#0" }, - "south": { "uv": [3.5, 8.25, 7, 10.75], "rotation": 180, "texture": "#0" }, - "west": { "uv": [0, 8.25, 3.5, 10.75], "rotation": 180, "texture": "#0" }, - "up": { "uv": [7, 4.75, 10.5, 8.25], "texture": "#0" }, - "down": { "uv": [3.5, 4.75, 7, 8.25], "rotation": 180, "texture": "#0" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/trident.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/trident.json deleted file mode 100644 index 2f48b5e5..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/trident.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "credit": "Made with Blockbench", - "textures": { - "0": "entity/trident", - "particle": "entity/trident" - }, - "elements": [ - { - "from": [15, -34, 15], - "to": [16, -3, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [15, -18, 15]}, - "faces": { - "north": {"uv": [1.5, 0.5, 2, 16], "texture": "#0"}, - "east": {"uv": [1, 0.5, 1.5, 16], "texture": "#0"}, - "south": {"uv": [0.5, 0.5, 1, 16], "texture": "#0"}, - "west": {"uv": [0, 0.5, 0.5, 16], "texture": "#0"}, - "up": {"uv": [0.5, 0, 1, 0.5], "texture": "#0"}, - "down": {"uv": [1, 0, 1.5, 0.5], "texture": "#0"} - } - }, - { - "from": [14, -9, 15], - "to": [17, -7, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [14, -18, 15]}, - "faces": { - "north": {"uv": [2.5, 0.5, 4, 1.5], "texture": "#0"}, - "east": {"uv": [2, 0.5, 2.5, 1.5], "texture": "#0"}, - "south": {"uv": [2.5, 0.5, 4, 1.5], "texture": "#0"}, - "west": {"uv": [3, 0.5, 3.5, 1.5], "texture": "#0"}, - "up": {"uv": [2.5, 0, 4, 0.5], "texture": "#0"}, - "down": {"uv": [4, 0, 5.5, 0.5], "texture": "#0"} - } - }, - { - "from": [13, -8, 15], - "to": [14, -4, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [13, -17, 15]}, - "faces": { - "north": {"uv": [2.5, 2, 3, 4], "texture": "#0"}, - "east": {"uv": [2, 2, 2.5, 4], "texture": "#0"}, - "south": {"uv": [3.5, 2, 4, 4], "texture": "#0"}, - "west": {"uv": [3, 2, 3.5, 4], "texture": "#0"}, - "up": {"uv": [2.5, 1.5, 3, 2], "texture": "#0"}, - "down": {"uv": [3, 1.5, 3.5, 2], "texture": "#0"} - } - }, - { - "from": [17, -8, 15], - "to": [18, -4, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [17, -17, 15]}, - "faces": { - "north": {"uv": [2.5, 2, 3, 4], "texture": "#0"}, - "east": {"uv": [2, 2, 2.5, 4], "texture": "#0"}, - "south": {"uv": [3.5, 2, 4, 4], "texture": "#0"}, - "west": {"uv": [3, 2, 3.5, 4], "texture": "#0"}, - "up": {"uv": [2.5, 1.5, 3, 2], "texture": "#0"}, - "down": {"uv": [3, 1.5, 3.5, 2], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/white_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/white_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/white_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/white_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/white_shulker_box.json deleted file mode 100644 index 4c1417c1..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/white_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/white_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/wither_skeleton_skull.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/wither_skeleton_skull.json deleted file mode 100644 index cacd60f5..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/wither_skeleton_skull.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 32], - "textures": { - "0": "entity/skeleton/wither_skeleton" - }, - "elements": [ - { - "name": "Hat Layer", - "from": [3.5, -1, 3.5], - "to": [12.5, 8, 12.5], - "rotation": { "angle": 0, "axis": "y", "origin": [8, -24, 8] }, - "faces": { - "north": { "uv": [10, 4, 12, 8], "texture": "#0" }, - "east": { "uv": [8, 4, 10, 8], "texture": "#0" }, - "south": { "uv": [14, 4, 16, 8], "texture": "#0" }, - "west": { "uv": [12, 4, 14, 8], "texture": "#0" }, - "up": { "uv": [12, 4, 10, 0], "texture": "#0" }, - "down": { "uv": [14, 0, 12, 4], "texture": "#0" } - } - }, - { - "name": "Head", - "from": [4, 0, 4], - "to": [12, 8, 12], - "rotation": { "angle": 0, "axis": "y", "origin": [8, -24, 8] }, - "faces": { - "north": { "uv": [2, 4, 4, 8], "texture": "#0" }, - "east": { "uv": [0, 4, 2, 8], "texture": "#0" }, - "south": { "uv": [6, 4, 8, 8], "texture": "#0" }, - "west": { "uv": [4, 4, 6, 8], "texture": "#0" }, - "up": { "uv": [4, 4, 2, 0], "texture": "#0" }, - "down": { "uv": [6, 0, 4, 4], "texture": "#0" } - } - } - ] -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/yellow_banner.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/yellow_banner.json deleted file mode 100644 index 47720f2a..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/yellow_banner.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "item/template_banner" -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/yellow_shulker_box.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/yellow_shulker_box.json deleted file mode 100644 index f1ef0550..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/yellow_shulker_box.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "parent": "block/yellow_shulker_box", - "display": { - "gui": { - "rotation": [30, 45, 0], - "translation": [0, 0, 0], - "scale": [0.625, 0.625, 0.625] - }, - "ground": { - "rotation": [0, 0, 0], - "translation": [0, 3, 0], - "scale": [0.25, 0.25, 0.25] - }, - "head": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [1, 1, 1] - }, - "fixed": { - "rotation": [0, 180, 0], - "translation": [0, 0, 0], - "scale": [0.5, 0.5, 0.5] - }, - "thirdperson_righthand": { - "rotation": [75, 315, 0], - "translation": [0, 2.5, 0], - "scale": [0.375, 0.375, 0.375] - }, - "firstperson_righthand": { - "rotation": [0, 315, 0], - "translation": [0, 0, 0], - "scale": [0.4, 0.4, 0.4] - } - } -} diff --git a/src/assets/vanillaAssetOverrides/minecraft/models/item/zombie_head.json b/src/assets/vanillaAssetOverrides/minecraft/models/item/zombie_head.json deleted file mode 100644 index d6a8b8e1..00000000 --- a/src/assets/vanillaAssetOverrides/minecraft/models/item/zombie_head.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "credit": "Made with Blockbench", - "texture_size": [64, 64], - "textures": { - "0": "entity/zombie/zombie" - }, - "elements": [ - { - "name": "Hat Layer", - "from": [3.5, -8.5, 3.5], - "to": [12.5, 0.5, 12.5], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -31.5, 8]}, - "faces": { - "north": {"uv": [10, 2, 12, 4], "texture": "#0"}, - "east": {"uv": [8, 2, 10, 4], "texture": "#0"}, - "south": {"uv": [14, 2, 16, 4], "texture": "#0"}, - "west": {"uv": [12, 2, 14, 4], "texture": "#0"}, - "up": {"uv": [12, 2, 10, 0], "texture": "#0"}, - "down": {"uv": [14, 0, 12, 2], "texture": "#0"} - } - }, - { - "name": "Head", - "from": [4, -8, 4], - "to": [12, 0, 12], - "rotation": {"angle": 0, "axis": "y", "origin": [8, -32, 8]}, - "faces": { - "north": {"uv": [2, 2, 4, 4], "texture": "#0"}, - "east": {"uv": [0, 2, 2, 4], "texture": "#0"}, - "south": {"uv": [6, 2, 8, 4], "texture": "#0"}, - "west": {"uv": [4, 2, 6, 4], "texture": "#0"}, - "up": {"uv": [4, 2, 2, 0], "texture": "#0"}, - "down": {"uv": [6, 0, 4, 2], "texture": "#0"} - } - } - ] -} \ No newline at end of file diff --git a/src/blockbenchTypeMods.d.ts b/src/blockbenchTypeMods.d.ts index 47416cf5..8e8ece2d 100644 --- a/src/blockbenchTypeMods.d.ts +++ b/src/blockbenchTypeMods.d.ts @@ -7,4 +7,25 @@ declare module 'three' { } } +declare global { + namespace Interface.CustomElements { + /** Blockbench's number field with a drag-to-change handle, as used by dialog forms. */ + class NumericInput { + node: HTMLElement + value: number + constructor( + id: string, + options: { + value?: number + min?: number + max?: number + step?: number + readonly?: boolean + onChange?(value: number, event: Event): void + } + ) + } + } +} + export {} diff --git a/src/dialogs/about/about.svelte b/src/dialogs/about/about.svelte index 4ff9c349..23556936 100644 --- a/src/dialogs/about/about.svelte +++ b/src/dialogs/about/about.svelte @@ -1,100 +1,101 @@
-
- - -
-

Animated Java

-

v{PACKAGE.version}

+
+
+ + +
+
+
+

Animated Java

+ v{PACKAGE.version} +
+

{PACKAGE.description}

-

Created by Titus Evans (SnaveSutit)

-

- {PACKAGE.description} -

+

Created by Titus Evans (SnaveSutit)

Special Thanks to

-
+

Ian Senne (FetchBot)

For always being there to help.

-
+

Jesse Spicer (Dominexis)

For making quaternions and matrices make sense.

-
+

Jannis Petersen

For creating an amazing tool and community.

-
+

Ewan Howell

For keeping me sane as I dig through Blockbench source code.

-
+

Boxic

For throwing absurd amounts of money at me.

-
+

Flubberschnub

For showing off the power of AJ with his boss fights.

Ko-fi Supporters

-
+
{#each PACKAGE.subscription_supporters.sort() as special} -

{special}

+ {special} {/each}
+ +
+ โค๏ธAnimated Java? +
+ Ko-fi +
+

Cool People who helped make AJ what it is today

-
+
{#each PACKAGE.special_thanks.sort() as special} -

{special}

+ {special} {/each}
diff --git a/src/dialogs/animationProperties/animationProperties.svelte b/src/dialogs/animationProperties/animationProperties.svelte index 597a0d78..7d849c25 100644 --- a/src/dialogs/animationProperties/animationProperties.svelte +++ b/src/dialogs/animationProperties/animationProperties.svelte @@ -9,6 +9,8 @@ @@ -66,12 +63,6 @@ {/if} {#if dataPackExportFormat !== 'none'} - - {#if !autoRenderBox} + import { onDestroy } from 'svelte' + import { validatePreviewResourcePack } from '../../../formats/blueprint/settings' + import type { ValueCheckResult } from '../../../svelteComponents/sidebarDialogItems/sidebarDialogTypes' + import { + applyPreviewResourcePack, + reloadPreviewResourcePack, + } from '../../../systems/minecraft/previewResourcePack' + import { createScopedTranslator } from '../../../util/lang' + + const translate = createScopedTranslator('dialog.blueprint_settings') + + let packs = $state([...Project.animated_java.preview_resource_packs]) + + let checks = $state>([]) + $effect(() => { + checks = packs.map(p => validatePreviewResourcePack(p)) + }) + + function save() { + Project.animated_java.preview_resource_packs = packs.map(p => p.trim()).filter(Boolean) + } + + function addPack() { + packs.push('') + } + + function removePack(index: number) { + packs.splice(index, 1) + } + + function movePack(index: number, delta: number) { + const target = index + delta + if (target < 0 || target >= packs.length) return + ;[packs[index], packs[target]] = [packs[target], packs[index]] + } + + function browseFolder(index: number) { + const result = Filesystem.pickDirectory({ + title: 'Select Resource Pack Folder', + startpath: packs[index], + resource_id: 'animated_java:preview_resource_pack_folder', + }) + if (result) packs[index] = result + } + + function browseZip(index: number) { + Filesystem.importFile( + { + title: 'Select Resource Pack Zip', + startpath: packs[index], + type: 'zip', + extensions: ['zip'], + readtype: 'none', + resource_id: 'animated_java:preview_resource_pack_zip', + }, + files => { + if (files.length > 0) packs[index] = files[0].path + } + ) + } + + onDestroy(() => { + save() + void applyPreviewResourcePack() + }) + + +
+
+ {translate('preview.list.title')} + +
+
{@html translate('preview.list.hint')}
+ + {#if packs.length === 0} +

{translate('preview.list.empty')}

+ {:else} +
+ {#each packs as _, index (index)} +
+
+ {index + 1} +
+ + browseZip(index)} + > + browseFolder(index)} + > +
+
+ movePack(index, -1)} + > + movePack(index, 1)} + > + removePack(index)} + > +
+
+ {#if checks[index]} +
+ {@html checks[index]?.message} +
+ {/if} +
+ {/each} +
+ {/if} + + {#if packs.some(p => p.trim() !== '')} + + {/if} +
+ + diff --git a/src/dialogs/blueprintSettings/pages/resourcepack.svelte b/src/dialogs/blueprintSettings/pages/resourcepack.svelte index 809f23d2..ae804ff6 100644 --- a/src/dialogs/blueprintSettings/pages/resourcepack.svelte +++ b/src/dialogs/blueprintSettings/pages/resourcepack.svelte @@ -25,23 +25,22 @@
{:else if resourcePackExportFormat === 'zip'} { Project.animated_java.custom_rig_entity_tags = customRigEntityTags Project.animated_java.interpolation_duration = interpolationDuration Project.animated_java.teleportation_duration = teleportationDuration + Project.animated_java.shadow_radius = shadowRadius + Project.animated_java.shadow_strength = shadowStrength + Project.animated_java.auto_update_rig_orientation = autoUpdateRigOrientation Project.animated_java.use_entity_stacking = useEntityStacking }) - - - - - - - +
+ + + + + + + + + + + {#if dataPackExportFormat !== 'none'} + + {/if} + + +
+ + diff --git a/src/dialogs/exportProgress/exportProgress.svelte b/src/dialogs/exportProgress/exportProgress.svelte index 377676bc..ed4201dc 100644 --- a/src/dialogs/exportProgress/exportProgress.svelte +++ b/src/dialogs/exportProgress/exportProgress.svelte @@ -7,16 +7,38 @@ export let progress: Observable export let maxProgress: Observable export let progressDescription: Observable + export let progressDetail: Observable + export let subProgress: Observable + export let subMaxProgress: Observable + + $: primaryValue = $maxProgress > 0 ? $progress / $maxProgress : 0 + $: secondaryValue = $subMaxProgress > 0 ? $subProgress / $subMaxProgress : 0
-
-

{$progressDescription}

+
+
+

{$progressDescription}

+ {#if $progressDetail} +

{$progressDetail}

+ {/if} +
+ {#if $progress !== 0} - +
+ + {$progress}/{$maxProgress} +
+ {/if} + + {#if $subMaxProgress > 0} +
+ + {$subProgress}/{$subMaxProgress} +
{/if}
@@ -24,18 +46,62 @@ .dialog-container { display: flex; flex-direction: column; - align-items: center; + align-items: stretch; + gap: 8px; } - .progress-container { + .header { width: 100%; display: flex; flex-direction: row; align-items: center; justify-content: space-between; + gap: 8px; + } + + .labels { + display: flex; + flex-direction: column; + min-width: 0; + gap: 2px; + } + + .description { + margin: 0; } - progress { + .detail { + margin: 0; + font-size: 0.85em; + color: var(--color-subtle_text); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .bar-row { width: 100%; + display: flex; + flex-direction: row; + align-items: center; + gap: 8px; + } + + .bar-row progress { + flex: 1 1 auto; + min-width: 0; + height: 16px; + } + + .bar-row.secondary progress { + height: 10px; + } + + .count { + flex: 0 0 auto; + font-size: 0.8em; + color: var(--color-subtle_text); + font-variant-numeric: tabular-nums; + white-space: nowrap; } diff --git a/src/dialogs/exportProgress/exportProgress.ts b/src/dialogs/exportProgress/exportProgress.ts index fb75fcb9..84d9732f 100644 --- a/src/dialogs/exportProgress/exportProgress.ts +++ b/src/dialogs/exportProgress/exportProgress.ts @@ -4,25 +4,49 @@ import { PACKAGE } from '../../constants' import { localize as translate } from '../../util/lang' import ExportProgressDialogSvelteComponent from './exportProgress.svelte' +/** Primary phase label, e.g. "Rendering Animations..." */ +export const PROGRESS_DESCRIPTION = observable('') +/** Primary progress bar. Hidden while {@link PROGRESS} is 0. */ export const PROGRESS = observable(0) export const MAX_PROGRESS = observable(1) -export const PROGRESS_DESCRIPTION = observable('') +/** Secondary line under the phase label, e.g. the current animation or file name. */ +export const PROGRESS_DETAIL = observable('') +/** Secondary progress bar. Hidden while {@link SUB_MAX_PROGRESS} is 0. */ +export const SUB_PROGRESS = observable(0) +export const SUB_MAX_PROGRESS = observable(0) -export function openExportProgressDialog(debug?: boolean) { +/** + * Starts a new export phase: sets the primary label and resets both progress + * bars and the detail line. Pass `maxProgress` to show the primary bar. + */ +export function setExportProgressPhase(description: string, maxProgress = 1) { + PROGRESS_DESCRIPTION.set(description) + PROGRESS_DETAIL.set('') PROGRESS.set(0) - MAX_PROGRESS.set(1) - PROGRESS_DESCRIPTION.set('Preparing...') - - if (debug) { - MAX_PROGRESS.set(1000) - setInterval(() => { - // logMessage('Debug:', Math.random()) - PROGRESS.set(PROGRESS.get() + 1) - if (PROGRESS.get() >= MAX_PROGRESS.get()) { - PROGRESS.set(0) - } - }, 10) + MAX_PROGRESS.set(maxProgress) + SUB_PROGRESS.set(0) + SUB_MAX_PROGRESS.set(0) +} + +/** Sets up the secondary progress bar for a sub-task of the current phase. */ +export function setExportProgressSubTask(detail: string, subMaxProgress = 0) { + PROGRESS_DETAIL.set(detail) + SUB_PROGRESS.set(0) + SUB_MAX_PROGRESS.set(subMaxProgress) +} + +let realClose: ((button?: number, event?: Event) => void) | undefined +let previewTimer: ReturnType | undefined + +function stopPreview() { + if (previewTimer !== undefined) { + clearInterval(previewTimer) + previewTimer = undefined } +} + +function createDialog(closeable: boolean, onClose?: () => void) { + closeExportProgressDialog() const dialog = new SvelteDialog({ id: `${PACKAGE.name}:exportProgressDialog`, @@ -33,9 +57,150 @@ export function openExportProgressDialog(debug?: boolean) { progress: PROGRESS, maxProgress: MAX_PROGRESS, progressDescription: PROGRESS_DESCRIPTION, + progressDetail: PROGRESS_DETAIL, + subProgress: SUB_PROGRESS, + subMaxProgress: SUB_MAX_PROGRESS, }, disableKeybinds: true, + cancel_on_click_outside: false, buttons: [], + onClose, }).show() + + realClose = dialog.close.bind(dialog) + if (!closeable) { + // Blocks all interaction with Blockbench, so the user cannot + // dismiss the dialog. Every user-facing close path (the + // title-bar X, Escape, backdrop clicks) routes through + // `Dialog.prototype.close`, so shadow it with a no-op and keep a private + // reference for `closeExportProgressDialog` to use once the export is done. + dialog.close = () => { + /* Blocked: only closeExportProgressDialog() may dismiss this dialog. */ + } + dialog.object?.querySelector('.dialog_close_button')?.remove() + } + return dialog } + +export function openExportProgressDialog() { + setExportProgressPhase('Preparing...') + return createDialog(false) +} + +/** Closes the export progress dialog. This is the only way it can be dismissed. */ +export function closeExportProgressDialog() { + stopPreview() + realClose?.(0) + realClose = undefined +} + +interface PreviewPhase { + label: string + /** Primary bar total. Omit for a label-only phase. */ + total?: number + /** Detail line for primary step `i` (0-indexed). */ + detail?: (i: number) => string + /** Secondary bar total for primary step `i`. */ + subTotal?: (i: number) => number +} + +/** Ticks a label-only preview phase lingers before advancing (~33ms each). */ +const PREVIEW_HOLD_TICKS = 40 +const PREVIEW_ANIMATIONS = ['idle', 'walk', 'run', 'wave', 'attack', 'death'] +const PREVIEW_FILES = [ + 'summon.mcfunction', + 'on_load.mcfunction', + 'animations/walk/zzz/frames/12.mcfunction', + 'apply_default_pose.mcfunction', + 'remove/this.mcfunction', + 'variants/red/apply.mcfunction', + 'animations/idle/tween.mcfunction', + 'zzz/summon/as_root_entity.mcfunction', +] + +const PREVIEW_PHASES: PreviewPhase[] = [ + { label: 'Preparing...' }, + { label: 'Rendering Rig...' }, + { + label: 'Rendering Animations...', + total: PREVIEW_ANIMATIONS.length, + detail: i => PREVIEW_ANIMATIONS[i], + subTotal: i => 20 + i * 15, + }, + { label: 'Hashing Rendered Objects...' }, + { + label: 'Creating Animation Storage...', + total: PREVIEW_ANIMATIONS.length, + detail: i => PREVIEW_ANIMATIONS[i], + subTotal: i => 20 + i * 15, + }, + { + label: 'Writing Data Pack...', + total: 60, + detail: i => PREVIEW_FILES[i % PREVIEW_FILES.length], + }, + { + label: 'Merging Function Tags...', + total: 8, + detail: i => + `tags/function/${PREVIEW_FILES[i % PREVIEW_FILES.length].replace(/\.mcfunction$/, '.json')}`, + }, + { label: 'Compiling Resource Pack...' }, + { + label: 'Writing Resource Pack...', + total: 40, + detail: i => PREVIEW_FILES[i % PREVIEW_FILES.length].replace('.mcfunction', '.json'), + }, +] + +/** + * Opens the export progress dialog in a closeable preview that loops through + * every phase and bar/detail combination with dummy values, so the dialog can + * be eyeballed without running a real export. Exposed on the `AnimatedJava` + * global; close the dialog (X / Escape) to stop it. + */ +export function debugExportProgressDialog() { + setExportProgressPhase('Preparing...') + createDialog(true, stopPreview) + + let phase = 0 + let step = 0 + let sub = 0 + let hold = 0 + + previewTimer = setInterval(() => { + const p = PREVIEW_PHASES[phase] + + if (p.total === undefined) { + PROGRESS_DESCRIPTION.set(p.label) + PROGRESS_DETAIL.set('') + PROGRESS.set(0) + SUB_MAX_PROGRESS.set(0) + if (++hold >= PREVIEW_HOLD_TICKS) { + hold = 0 + phase = (phase + 1) % PREVIEW_PHASES.length + } + return + } + + PROGRESS_DESCRIPTION.set(p.label) + MAX_PROGRESS.set(p.total) + PROGRESS.set(step + 1) + PROGRESS_DETAIL.set(p.detail ? p.detail(step) : '') + + const subMax = p.subTotal ? p.subTotal(step) : 0 + SUB_MAX_PROGRESS.set(subMax) + if (subMax > 0) { + sub += Math.max(1, Math.round(subMax / 25)) + SUB_PROGRESS.set(Math.min(sub, subMax)) + if (sub < subMax) return + sub = 0 + } + + if (++step >= p.total) { + step = 0 + phase = (phase + 1) % PREVIEW_PHASES.length + } + }, 33) +} diff --git a/src/dialogs/itemModelProperties/itemModelProperties.svelte b/src/dialogs/itemModelProperties/itemModelProperties.svelte index 68fbaa51..81d3d97a 100644 --- a/src/dialogs/itemModelProperties/itemModelProperties.svelte +++ b/src/dialogs/itemModelProperties/itemModelProperties.svelte @@ -1,137 +1,472 @@ +{#snippet fields(tint: TintSource, detailed: boolean)} + {@const id = getElementId(tint)} + {#if tint.type === 'minecraft:constant'} + + (tint.value = value)} + /> + + {:else if tint.type === 'minecraft:grass'} + + (tint.temperature = value)} + /> + + + (tint.downfall = value)} + /> + + {:else} + {#if tint.type === 'minecraft:custom_model_data'} + +
+ (tint.index = value)} + /> +
+
+ {/if} + + (tint.default = value)} + /> + + {/if} +{/snippet} +
-
-

{localize('dialog.item_properties.tint_constants')}

- +
+

{localize('dialog.item_properties.description')}

+ + {localize('dialog.item_properties.target')}: {targetVersion} +
-

{@html localize('dialog.item_properties.description')}

- {#if tintValues.length === 0} -

{localize('dialog.item_properties.empty_state')}

- {:else} -
- {#each tintValues as _, index} +
+ {#if tints.length === 0} +

{localize('dialog.item_properties.empty_state')}

+ {:else} +
+ + # + {localize('dialog.item_properties.column.type')} + {localize('dialog.item_properties.column.value')} + +
+ {/if} + + {#each tints as tint, index (tint)} + {@const isExpanded = expanded === tint} + {@const supported = isTintSourceTypeAvailable(tint.type, targetVersion)} +
- - normalizeTintValue(index)} - /> - toggleExpanded(tint)} > + {isExpanded ? 'expand_more' : 'chevron_right'} + + {index} +
+ {#if isExpanded} + {getTypeDescription(tint.type)} + {:else} +
{@render fields(tint, false)}
+ {/if} +
- {/each} -
- {/if} + + {#if !supported} +

+ warning + {localize( + 'dialog.item_properties.unsupported_type', + getTypeName(tint.type), + targetVersion + )} +

+ {/if} + + {#if isExpanded} +
+ {@render fields(tint, true)} + {#if hasAlpha(tint.type)} +

+ info + {localize('dialog.item_properties.alpha_note')} +

+ {/if} +
+ {/if} +
+ {/each} + + +
diff --git a/src/dialogs/itemModelProperties/itemModelProperties.ts b/src/dialogs/itemModelProperties/itemModelProperties.ts index fe5ec3cc..7743f9b7 100644 --- a/src/dialogs/itemModelProperties/itemModelProperties.ts +++ b/src/dialogs/itemModelProperties/itemModelProperties.ts @@ -5,6 +5,7 @@ import { activeProjectIsBlueprintFormat, projectTargetVersionIsAtLeast, } from '../../formats/blueprint' +import { TINT_SOURCES_MIN_VERSION } from '../../systems/minecraft/tintSources' import { localize } from '../../util/lang' import ItemModelProperties from './itemModelProperties.svelte' @@ -18,6 +19,7 @@ export function openItemPropertiesDialog(group: Group) { component: ItemModelProperties, props: { itemTints, + targetVersion: Project!.animated_java.target_minecraft_version, } as any, disableKeybinds: true, onConfirm() { @@ -43,7 +45,7 @@ registerDeletableHandlerPatch({ name: localize('action.open_item_model_properties.name'), condition: () => activeProjectIsBlueprintFormat() && - projectTargetVersionIsAtLeast('1.21.4') && + projectTargetVersionIsAtLeast(TINT_SOURCES_MIN_VERSION) && Group.first_selected?.children.some(child => child instanceof Cube), click: () => { const group = Group.first_selected diff --git a/src/dialogs/itemModelProperties/tintColorInput.svelte b/src/dialogs/itemModelProperties/tintColorInput.svelte new file mode 100644 index 00000000..71d0e28a --- /dev/null +++ b/src/dialogs/itemModelProperties/tintColorInput.svelte @@ -0,0 +1,91 @@ + + +
+
+
+ + {#if alpha} + ARGB + {/if} +
+
+ + diff --git a/src/dialogs/itemModelProperties/tintField.svelte b/src/dialogs/itemModelProperties/tintField.svelte new file mode 100644 index 00000000..a5f1fd68 --- /dev/null +++ b/src/dialogs/itemModelProperties/tintField.svelte @@ -0,0 +1,63 @@ + + +{#if detailed} +
+ +
+ {@render children()} +

{description}

+
+
+{:else} + {#if inlineLabel} + + {/if} + {@render children()} +{/if} + + diff --git a/src/dialogs/itemModelProperties/tintNumberInput.svelte b/src/dialogs/itemModelProperties/tintNumberInput.svelte new file mode 100644 index 00000000..61728818 --- /dev/null +++ b/src/dialogs/itemModelProperties/tintNumberInput.svelte @@ -0,0 +1,53 @@ + + +
+ + diff --git a/src/dialogs/textureSlotConfig/textureSlotConfig.svelte b/src/dialogs/textureSlotConfig/textureSlotConfig.svelte new file mode 100644 index 00000000..e0ef83f3 --- /dev/null +++ b/src/dialogs/textureSlotConfig/textureSlotConfig.svelte @@ -0,0 +1,278 @@ + + + + +
+ + + {#if !supportsSlotCommands} +
+ info + + {translate( + 'dialog.texture_slot.old_version_notice', + TEXTURE_SLOT_COMMANDS_MIN_VERSION + )} + +
+ {/if} + +
+
{translate('dialog.texture_slot.textures')}
+
+ {translate('dialog.texture_slot.faces', String(faceCount))} + +
+
    (rows = e.detail.items)} + onfinalize={(e: any) => setRows(e.detail.items)} + > + {#each rows as row, i (row.id)} +
  • + drag_indicator + + + {row.texture?.name ?? translate('dialog.texture_slot.missing')} + + {#if i === 0} + + star + {translate('dialog.texture_slot.default')} + + {/if} + + +
  • + {:else} +
    {translate('dialog.texture_slot.no_textures')}
    + {/each} +
+
{translate('dialog.texture_slot.hint')}
+
+ + diff --git a/src/dialogs/textureSlotConfig/textureSlotConfig.ts b/src/dialogs/textureSlotConfig/textureSlotConfig.ts new file mode 100644 index 00000000..700394fa --- /dev/null +++ b/src/dialogs/textureSlotConfig/textureSlotConfig.ts @@ -0,0 +1,29 @@ +import { observable } from 'svelte-observable-store' +import { SvelteDialog } from 'svelte-patching-tools/blockbench' +import { PACKAGE } from '../../constants' +import { getSlotPreviewTexture, previewSlotTexture, updateSlotImage } from '../../textureSlots' +import { localize as translate } from '../../util/lang' +import TextureSlotConfigSvelteComponent from './textureSlotConfig.svelte' + +export function openTextureSlotDialog(slot: Texture) { + const name = observable(slot.name) + const textures = observable([...slot.slot_textures]) + const preview = observable(getSlotPreviewTexture(slot)?.uuid) + + new SvelteDialog({ + id: `${PACKAGE.name}:textureSlotConfig`, + title: translate('dialog.texture_slot.title'), + width: 520, + component: TextureSlotConfigSvelteComponent, + props: { slot, name, textures, preview }, + disableKeybinds: true, + onConfirm() { + Undo.initEdit({ textures: [slot] }) + slot.name = name.get().trim() || slot.name + slot.slot_textures = textures.get() + Undo.finishEdit('Edit texture slot') + previewSlotTexture(slot, preview.get()) + updateSlotImage(slot) + }, + }).show() +} diff --git a/src/dialogs/variantConfig/variantConfig.svelte b/src/dialogs/variantConfig/variantConfig.svelte index a53aaec3..71f32ca2 100644 --- a/src/dialogs/variantConfig/variantConfig.svelte +++ b/src/dialogs/variantConfig/variantConfig.svelte @@ -1,36 +1,43 @@ @@ -132,78 +94,13 @@ /> {#if !variant.isDefault} -
-
- {translate('dialog.variant_config.texture_map.title')} -
-
- -
createTextureMapping()} - > - add -
-
- {#key textureMapUpdated} -
    - {#each [...textureMap.map.entries()] as entry} -
    -
  • -
    -
    - -
    - -
    - - east - -
    -
    - -
    - -
    - - - deleteTextureMapping(entry[0])}>delete -
  • - {:else} -
    - {translate('dialog.variant_config.texture_map.no_mappings')} -
    - {/each} -
- {/key} -
- {@html translate('dialog.variant_config.texture_map.description')} -
+ {/if} @@ -251,69 +148,4 @@ font-size: 14px; user-select: all; } - .no-mappings { - color: var(--color-subtle_text); - font-style: italic; - text-align: center; - } - .img-container { - display: flex; - align-items: flex-start; - width: 128px; - height: 128px; - pointer-events: none; - background: repeating-conic-gradient(var(--color-dark) 0% 25%, transparent 0% 50%) 50% / - 16px 16px; - } - img { - width: 128px; - pointer-events: none; - } - .texture-mapping-item { - display: flex; - align-items: center; - justify-content: space-between; - } - .texture-mapping-item-dropdown-container { - position: relative; - flex-grow: 1; - height: 164px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - } - .texture-mapping-item-dropdown { - display: flex; - flex-direction: column; - align-items: center; - max-width: 128px; - } - .texture-map-container { - display: flex; - flex-direction: column; - border: 1px solid var(--color-border); - background-color: var(--color-back); - padding: 4px; - overflow-y: auto; - max-height: 600px; - overflow-y: auto; - max-height: 16rem; - min-height: 12rem; - } - .spacer { - flex-grow: 1; - } - .toolbar { - display: flex; - flex-direction: row; - align-items: center; - } - .texture-map-description { - font-size: 0.9em; - color: var(--color-subtle_text); - margin-top: 4px; - margin-bottom: 16px; - max-width: 80%; - } diff --git a/src/dialogs/variantConfig/variantConfig.ts b/src/dialogs/variantConfig/variantConfig.ts index 21eec45f..48677657 100644 --- a/src/dialogs/variantConfig/variantConfig.ts +++ b/src/dialogs/variantConfig/variantConfig.ts @@ -10,9 +10,9 @@ export function openVariantConfigDialog(variant: Variant) { const displayName = observable(variant.displayName) const name = observable(variant.name) const uuid = observable(variant.uuid) - const textureMap = variant.textureMap.copy() + const slotTextures = new Map(variant.slotTextures) const generateNameFromDisplayName = observable(variant.generateNameFromDisplayName) - const excludedNodes = observable(variant.excludedNodes) + const excludedNodes = observable([...variant.excludedNodes.keys()]) const onApplyFunction = observable(variant.onApplyFunction ?? '') new SvelteDialog({ @@ -25,7 +25,7 @@ export function openVariantConfigDialog(variant: Variant) { displayName, name, uuid, - textureMap, + slotTextures, generateNameFromDisplayName, excludedNodes, onApplyFunction, @@ -35,9 +35,9 @@ export function openVariantConfigDialog(variant: Variant) { variant.displayName = displayName.get() variant.name = name.get() variant.uuid = uuid.get() - variant.textureMap = textureMap + variant.slotTextures = slotTextures variant.generateNameFromDisplayName = generateNameFromDisplayName.get() - variant.excludedNodes = excludedNodes.get() + variant.excludedNodes = new Set(excludedNodes.get()) variant.onApplyFunction = onApplyFunction.get().trim() EVENTS.UPDATE_VARIANT.publish(variant) variant.select() diff --git a/src/formats/ajmodel/index.ts b/src/formats/ajmodel/index.ts index 6c3ad907..7fa00db7 100644 --- a/src/formats/ajmodel/index.ts +++ b/src/formats/ajmodel/index.ts @@ -13,14 +13,22 @@ let waitingForAJModel = false export async function openAJModel() { if (waitingForAJModel) return waitingForAJModel = true - const result = await electron.dialog.showOpenDialog({ - properties: ['openFile'], - filters: [{ name: '.ajmodel', extensions: ['ajmodel'] }], - message: translate('action.upgrade_old_aj_model_loader.select_file'), - }) + const result = ( + await new Promise(resolve => { + Filesystem.importFile( + { + type: 'json', + extensions: ['ajmodel'], + multiple: false, + title: translate('action.upgrade_old_aj_model_loader.select_file'), + }, + v => resolve(v) + ) + }) + )[0] waitingForAJModel = false - if (result.canceled) return - convertAJModelToBlueprint(result.filePaths[0]) + if (!result) return + convertAJModelToBlueprint(result.path) } export function convertAJModelToBlueprint(path: string) { diff --git a/src/formats/blueprint/codec.ts b/src/formats/blueprint/codec.ts index 7401d470..f5916a44 100644 --- a/src/formats/blueprint/codec.ts +++ b/src/formats/blueprint/codec.ts @@ -9,6 +9,12 @@ import { import { PACKAGE, getFsModule } from '../../constants' import { localize as translate } from '../../util/lang' import { sanitizeStorageKey } from '../../util/minecraftUtil' +import { + isTextureSlot, + savePreviews, + setSlotResolution, + updateAllSlotImages, +} from '../../textureSlots' import { Variant } from '../../variants' import { upgradeAnimatedJavaBlueprint } from './dfu' import * as blueprintSettings from './settings' @@ -95,6 +101,13 @@ export const BLUEPRINT_CODEC = registerDeletableHandlerPatch({ Project.last_used_blueprint_id = model.meta?.last_used_blueprint_id ?? Project.animated_java.blueprint_id + if (model.texture_groups) { + for (const textureGroup of model.texture_groups) { + // @ts-expect-error - add() type omits the undo arg + new TextureGroup(textureGroup, textureGroup.uuid).add(false) + } + } + if (model.textures) { for (const texture of model.textures) { const newTexture = new Texture(texture, texture.uuid).add(false) @@ -234,6 +247,7 @@ export const BLUEPRINT_CODEC = registerDeletableHandlerPatch({ } } + updateAllSlotImages() Canvas.updateAll() Validator.validate() @@ -247,6 +261,7 @@ export const BLUEPRINT_CODEC = registerDeletableHandlerPatch({ // Disable variants while compiling const previouslySelectedVariant = Variant.selected + const restoreSlotPreviews = savePreviews() Variant.selectDefault() const model: IBlueprintFormatJSON = { @@ -282,8 +297,14 @@ export const BLUEPRINT_CODEC = registerDeletableHandlerPatch({ } model.elements = [] - for (const element of elements) { - model.elements.push(element.getSaveCopy?.(!!model.meta)) + // Faces save the Texture Slot they use, not the texture it shows + setSlotResolution(false) + try { + for (const element of elements) { + model.elements.push(element.getSaveCopy?.(!!model.meta)) + } + } finally { + setSlotResolution(true) } model.groups = [] @@ -294,6 +315,11 @@ export const BLUEPRINT_CODEC = registerDeletableHandlerPatch({ model.outliner = Outliner.toJSON() + model.texture_groups = [] + for (const textureGroup of TextureGroup.all) { + model.texture_groups.push(textureGroup.getSaveCopy()) + } + model.textures = [] for (const texture of Texture.all) { const save = texture.getSaveCopy() as Texture @@ -321,6 +347,13 @@ export const BLUEPRINT_CODEC = registerDeletableHandlerPatch({ save.internal = true } if (options.absolute_paths == false) delete save.path + if (isTextureSlot(texture)) { + // A slot's image only mirrors one of its textures + const slotSave: Partial = save + delete slotSave.source + delete slotSave.path + delete slotSave.relative_path + } model.textures.push(save) } @@ -376,6 +409,7 @@ export const BLUEPRINT_CODEC = registerDeletableHandlerPatch({ } previouslySelectedVariant?.select() + restoreSlotPreviews() console.log('Successfully compiled Animated Java Blueprint', model) return options.raw ? model : compileJSON(model) diff --git a/src/formats/blueprint/dfu.ts b/src/formats/blueprint/dfu.ts index 15cc458f..453fd520 100644 --- a/src/formats/blueprint/dfu.ts +++ b/src/formats/blueprint/dfu.ts @@ -17,6 +17,11 @@ import v1_0_0_pre8 from './versions/1.0.0-pre8' import v1_10_0_beta_1 from './versions/1.10.0-beta.1' import v1_10_0_beta_4 from './versions/1.10.0-beta.4' import v1_10_0_beta_7 from './versions/1.10.0-beta.7' +import v1_11_0, { + needsTextureSlotUpgrade, + needsVariantKeyframeUpgrade, + upgradeVariantKeyframes, +} from './versions/1.11.0' import v1_4_0 from './versions/1.4.0' import v1_6_3 from './versions/1.6.3' import v1_6_5 from './versions/1.6.5' @@ -32,6 +37,8 @@ export function upgradeAnimatedJavaBlueprint(model: any): IBlueprintFormatJSON { let needsUpgrade = model.meta.format_version.length === 3 needsUpgrade = needsUpgrade || VersionUtil.compare(PACKAGE.version, '>', model.meta.format_version) + // Blueprints saved by 1.11.0 dev builds can still hold an older slot or keyframe format + needsUpgrade ||= needsTextureSlotUpgrade(model) || needsVariantKeyframeUpgrade(model) if (!needsUpgrade) return model console.groupCollapsed( @@ -103,6 +110,8 @@ export function upgradeAnimatedJavaBlueprint(model: any): IBlueprintFormatJSON { case VersionUtil.compare(model.meta.format_version, '<', '1.10.0-beta.7'): model = v1_10_0_beta_7(model) } + if (needsTextureSlotUpgrade(model)) model = v1_11_0(model) + if (needsVariantKeyframeUpgrade(model)) model = upgradeVariantKeyframes(model) // Remove unknown blueprint settings const defaultSettings = getDefaultProjectSettings() diff --git a/src/formats/blueprint/index.ts b/src/formats/blueprint/index.ts index e1b2b227..d2dd1a78 100644 --- a/src/formats/blueprint/index.ts +++ b/src/formats/blueprint/index.ts @@ -98,9 +98,9 @@ export interface IBlueprintVariantJSON { */ uuid: string /** - * The texture map for the Variant + * Slot UUID -> texture UUID. Slots left out are unchanged when the Variant is applied. */ - texture_map: Record + slot_textures: Record /** * The list of bones that should be ignored when applying the Variant */ @@ -162,6 +162,7 @@ export interface IBlueprintFormatJSON { elements?: any[] groups?: any[] + texture_groups?: any[] outliner?: any[] textures?: Texture[] animations?: AnimationOptions[] @@ -350,10 +351,8 @@ export const BLUEPRINT_FORMAT = registerDeletableHandlerPatch({ fixCubeRotation(cube) } - requestAnimationFrame(() => { - Variant.selectDefault() - Canvas.updateAll() - }) + Variant.selectDefault() + Canvas.updateAll() }) }, @@ -459,13 +458,11 @@ export function updateRotationConstraints() { return } - if (!projectTargetVersionIsAtLeast('1.21.11')) { - // Rotation is limited to one axis, and between -45 and 45 degrees on versions before 1.21.11 - format.rotation_limit = !hasNonElementSelection() - } else if (!projectTargetVersionIsAtLeast('1.21.6') /* < 1.21.6 */) { - // Rotation is snapped to 22.5 degree increments on versions before 1.21.6 - format.rotation_snap = format.rotation_limit - } + // Rotation is limited to one axis, and between -45 and 45 degrees on versions before 1.21.11 + format.rotation_limit = !projectTargetVersionIsAtLeast('1.21.11') && !hasNonElementSelection() + + // Rotation is snapped to 22.5 degree increments on versions before 1.21.6 + format.rotation_snap = !projectTargetVersionIsAtLeast('1.21.6') } EVENTS.SELECT_PROJECT.subscribe(project => { diff --git a/src/formats/blueprint/settings.ts b/src/formats/blueprint/settings.ts index 4cdd5f52..fc5eab7f 100644 --- a/src/formats/blueprint/settings.ts +++ b/src/formats/blueprint/settings.ts @@ -26,6 +26,9 @@ export interface BlueprintSettings { custom_model_data_offset: number enable_advanced_resource_pack_settings: boolean resource_pack: string + // Preview Settings + /** Editor-only resource pack overlays, highest priority first. */ + preview_resource_packs: string[] // Data Pack Settings enable_advanced_data_pack_settings: boolean data_pack: string @@ -35,6 +38,8 @@ export interface BlueprintSettings { on_post_tick_function: string interpolation_duration: number teleportation_duration: number + shadow_radius: number + shadow_strength: number custom_rig_entity_tags: string auto_update_rig_orientation: boolean use_storage_for_animation: boolean @@ -55,7 +60,7 @@ export const defaultValues: BlueprintSettings = { enable_plugin_mode: false, resource_pack_export_mode: 'folder' as ExportMode, data_pack_export_mode: 'folder' as ExportMode, - target_minecraft_version: '26.1.2', + target_minecraft_version: '26.2', // Resource Pack Settings display_item: 'minecraft:white_dye', @@ -63,6 +68,9 @@ export const defaultValues: BlueprintSettings = { enable_advanced_resource_pack_settings: false, resource_pack: '', + // Preview Settings + preview_resource_packs: [], + // Data Pack Settings enable_advanced_data_pack_settings: false, data_pack: '', @@ -74,6 +82,8 @@ export const defaultValues: BlueprintSettings = { interpolation_duration: 1, teleportation_duration: 1, + shadow_radius: 0, + shadow_strength: 1, custom_rig_entity_tags: '', auto_update_rig_orientation: true, @@ -237,6 +247,66 @@ export function validateResourcePackFolder(value: string): ValueCheckResult { } } +/** + * Validates the optional preview resource pack path. An empty value is fine (the + * feature is simply off). A `.zip` path is treated as a zipped pack; anything + * else is treated as an unzipped pack folder. + */ +export function validatePreviewResourcePack(value: string): ValueCheckResult { + if (value === '') return + + let path: string + try { + path = resolvePath(value) + } catch (error: any) { + console.error(error) + return { + type: 'error', + message: localize('resource_pack.folder.error.invalid_path', error.message), + } + } + + const { existsSync, statSync } = getFsModule() + + if (!existsSync(path)) { + return { + type: 'error', + message: localize('resource_pack.folder.error.does_not_exist'), + } + } + + if (/\.zip$/i.test(path)) { + if (statSync(path).isDirectory()) { + return { + type: 'error', + message: localize('preview.error.zip_is_a_dir'), + } + } + return + } + + if (!statSync(path).isDirectory()) { + return { + type: 'error', + message: localize('resource_pack.folder.error.not_a_dir'), + } + } + + if (!existsSync(join(path, 'pack.mcmeta'))) { + return { + type: 'error', + message: localize('resource_pack.folder.error.no_pack_mcmeta'), + } + } + + if (!existsSync(join(path, 'assets'))) { + return { + type: 'warning', + message: localize('resource_pack.folder.warning.no_assets'), + } + } +} + export function validateDataPackFolder(value: string): ValueCheckResult { if (value === '') { return { @@ -326,17 +396,46 @@ export async function validateThisProjectsBlueprintSettings(): Promise< Project.animated_java.render_box[0], Project.animated_java.render_box[1] ), + // Plugin mode exports a JSON file, not a resource/data pack, so the pack + // folders are irrelevant and must not block the export. resource_pack_folder: + !Project.animated_java.enable_plugin_mode && Project.animated_java.resource_pack_export_mode === 'folder' ? validateResourcePackFolder(Project.animated_java.resource_pack) : undefined, data_pack_folder: + !Project.animated_java.enable_plugin_mode && Project.animated_java.data_pack_export_mode === 'folder' ? validateDataPackFolder(Project.animated_java.data_pack) : undefined, data_pack_zip: + !Project.animated_java.enable_plugin_mode && Project.animated_java.data_pack_export_mode === 'zip' ? validateZipPath(Project.animated_java.data_pack) : undefined, + preview_resource_packs: validatePreviewResourcePacks( + Project.animated_java.preview_resource_packs + ), + } +} + +/** Reports the first error (or, failing that, warning) among the preview pack overlays. */ +export function validatePreviewResourcePacks(values: string[]): ValueCheckResult { + let firstWarning: ValueCheckResult | undefined + for (const [index, value] of values.entries()) { + const result = validatePreviewResourcePack(value) + if (result?.type === 'error') { + return { + type: 'error', + message: localize('preview.list.error.entry', String(index + 1), result.message), + } + } + if (result?.type === 'warning') { + firstWarning ??= { + type: 'warning', + message: localize('preview.list.warning.entry', String(index + 1), result.message), + } + } } + return firstWarning } diff --git a/src/formats/blueprint/versions/1.11.0.ts b/src/formats/blueprint/versions/1.11.0.ts new file mode 100644 index 00000000..b450657e --- /dev/null +++ b/src/formats/blueprint/versions/1.11.0.ts @@ -0,0 +1,134 @@ +import type { IBlueprintFormatJSON } from '..' +import { makeUniqueName } from '../../../util/uniqueName' + +/** + * Whether the model still uses Variant texture maps, or this branch's earlier `texture_slots`. + */ +export function needsTextureSlotUpgrade(model: any): boolean { + return ( + model?.texture_slots !== undefined || + [model?.variants?.default, ...(model?.variants?.list ?? [])].some( + variant => variant?.texture_map !== undefined + ) + ) +} + +interface SlotTextureJSON { + uuid: string + name: string + is_texture_slot: true + slot_textures: string[] + internal: true +} + +/** + * Replaces Variant texture maps with Texture Slots. Each texture a Variant swapped out becomes a + * slot holding it and every texture it was swapped to, and every face using it now uses the slot. + * Each Variant sets every slot, so applying one still resets textures it didn't change. + */ +export default function upgrade(model: any): IBlueprintFormatJSON { + console.log('Processing model format 1.11.0', JSON.parse(JSON.stringify(model))) + const fixed: any = JSON.parse(JSON.stringify(model)) + + fixed.textures ??= [] + const textures: any[] = fixed.textures + const cubeFaces: any[] = (fixed.elements ?? []) + .filter((element: any) => element.type === 'cube' && element.faces) + .flatMap((element: any) => Object.values(element.faces)) + const addSlot = (name: string, slotTextures: string[]): SlotTextureJSON => { + const slot: SlotTextureJSON = { + uuid: crypto.randomUUID(), + name: makeUniqueName(name, n => textures.some(t => t.name === n)), + is_texture_slot: true, + slot_textures: slotTextures, + internal: true, + } + textures.push(slot) + return slot + } + + // Slots saved by earlier 1.11.0 dev builds, before slots became textures. + for (const old of fixed.texture_slots ?? []) { + textures.push({ + uuid: old.uuid, + name: makeUniqueName(old.name, n => textures.some(t => t.name === n)), + is_texture_slot: true, + slot_textures: old.textures ?? [], + internal: true, + }) + for (const face of cubeFaces) { + if (face.texture_slot === old.uuid) face.texture = old.uuid + } + } + delete fixed.texture_slots + for (const face of cubeFaces) delete face.texture_slot + + const variants: any[] = [fixed.variants?.default, ...(fixed.variants?.list ?? [])].filter( + Boolean + ) + const slotByTexture = new Map() + for (const variant of variants) { + for (const [from, to] of Object.entries(variant.texture_map ?? {})) { + const fromTexture = textures.find(t => t.uuid === from && !t.is_texture_slot) + if (!fromTexture) continue + let slot = slotByTexture.get(from) + if (!slot) { + slot = addSlot( + String(fromTexture.name ?? 'slot').replace(/\.png$/i, '') + '_slot', + [from] + ) + slotByTexture.set(from, slot) + } + if (!slot.slot_textures.includes(to) && textures.some(t => t.uuid === to)) { + slot.slot_textures.push(to) + } + } + } + + for (const face of cubeFaces) { + const uuid = typeof face.texture === 'number' ? textures[face.texture]?.uuid : face.texture + const slot = uuid && slotByTexture.get(uuid) + if (slot) face.texture = slot.uuid + } + + for (const variant of variants) { + const textureMap: Record = variant.texture_map ?? {} + delete variant.texture_map + if (variant.is_default) continue + variant.slot_textures ??= {} + for (const [from, slot] of slotByTexture) { + const to = textureMap[from] + variant.slot_textures[slot.uuid] = to && slot.slot_textures.includes(to) ? to : from + } + } + + return fixed +} + +function getVariantKeyframeDataPoints(model: any): any[] { + return (model?.animations ?? []) + .flatMap((animation: any) => Object.values(animation?.animators ?? {})) + .flatMap((animator: any) => animator?.keyframes ?? []) + .filter((keyframe: any) => keyframe?.channel === 'variant') + .flatMap((keyframe: any) => keyframe.data_points ?? []) +} + +/** + * Whether any variant keyframe still holds a single `variant` instead of a `variants` list. + */ +export function needsVariantKeyframeUpgrade(model: any): boolean { + return getVariantKeyframeDataPoints(model).some(dataPoint => 'variant' in dataPoint) +} + +/** + * Turns each variant keyframe's single `variant` into a `variants` list. + */ +export function upgradeVariantKeyframes(model: any): IBlueprintFormatJSON { + const fixed: any = JSON.parse(JSON.stringify(model)) + for (const dataPoint of getVariantKeyframeDataPoints(fixed)) { + if (!('variant' in dataPoint)) continue + dataPoint.variants ??= dataPoint.variant ? [dataPoint.variant] : [] + delete dataPoint.variant + } + return fixed +} diff --git a/src/global.d.ts b/src/global.d.ts index 09430aee..804eb715 100644 --- a/src/global.d.ts +++ b/src/global.d.ts @@ -41,6 +41,21 @@ declare module '*.txt' { export = value } +/** + * Auto-discovered MC-Build datapack sources, one entry per version directory + * under the resolved path. Provided by `.scripts/plugins/mcbCompressionPlugin.ts`. + * Each field is present only if that version directory contains the file. + */ +declare module 'mcb-sources:*' { + interface MCBVersionSources { + main?: string + global?: string + globalTemplates?: string + } + const sources: Record + export default sources +} + declare module '*.worker.ts' { export = Worker } @@ -63,6 +78,99 @@ declare module 'deepslate/lib/nbt' { export * from 'deepslate/nbt' } +declare module 'block-model-renderer/assets.zip' { + const url: string + export default url +} + +declare module 'block-model-renderer' { + interface AssetHandler { + read( + path: string + ): Uint8Array | string | null | undefined | Promise + list(dir: string): string[] | Promise + filter?: unknown[] + } + + /** Opaque, normalized asset bundle returned by {@link prepareAssets}. */ + type PreparedAssets = unknown[] & { readonly __prepared: unique symbol } + + /** A single model reference / inline model, as passed between the low level scene functions. */ + type ModelReference = Record + + type DisplayTransform = + | string + | { + type?: 'fallback' + display?: string + rotation?: [number, number, number] + translation?: [number, number, number] + scale?: [number, number, number] + } + + export function configure(opts: { THREE?: unknown; three?: unknown; assetsUrl?: string }): void + + export function getThree(): Promise + + export function prepareAssets( + sources: Array, + options?: { + cache?: boolean + version?: string + translucency?: { min: number; max: number } + } + ): Promise + + export function disposeCache(assets: PreparedAssets): void + + export function parseBlockstate( + assets: PreparedAssets, + id: string, + args?: { + data?: Record + seed?: number + ignoreAtlases?: boolean + version?: string + } + ): Promise + + export function parseItemDefinition( + assets: PreparedAssets, + id: string, + args?: { + data?: Record + display?: string + ignoreAtlases?: boolean + version?: string + } + ): Promise + + export function resolveModelData( + assets: PreparedAssets, + model: ModelReference | string + ): Promise + + export function loadModel( + scene: THREE.Scene | null, + assets: PreparedAssets, + model: ModelReference, + args?: { + display?: DisplayTransform + lighting?: 'item' | 'world' | 'scene' | 'off' + version?: string + animate?: boolean + cull?: Set | Record + } + ): Promise + + export function makeModelScene(): Promise<{ + scene: THREE.Scene + camera: THREE.Camera + }> + + export function isCrossModel(models: ModelReference | ModelReference[]): boolean +} + /** * Import this folder's contents recursively. * If a local index is found in a folder, it is imported and the rest of that folder is ignored. diff --git a/src/index.ts b/src/index.ts index b1fd3380..82da7b48 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,17 +21,22 @@ import datapackCompiler from './systems/datapackCompiler' import './systems/minecraft/assetManager' import './systems/minecraft/blockstateManager' import './systems/minecraft/fontManager' +import './systems/minecraft/fontRenderer' import './systems/minecraft/registryManager' import './systems/minecraft/versionManager' // Shaders import 'import_folder_recursive:./shaders' // Misc imports import { openChangelogDialog } from './dialogs/changelog/changelog' -import { openExportProgressDialog } from './dialogs/exportProgress/exportProgress' +import { + debugExportProgressDialog, + openExportProgressDialog, +} from './dialogs/exportProgress/exportProgress' import { openUnexpectedErrorDialog } from './dialogs/unexpectedError/unexpectedError' import { BLUEPRINT_FORMAT } from './formats/blueprint' import { BLUEPRINT_CODEC } from './formats/blueprint/codec' import { exportAll } from './interface/animatedJavaBarItem' +import { Interaction } from './outliner/interaction' import { TextDisplay } from './outliner/textDisplay' import { debugBlockState, VanillaBlockDisplay } from './outliner/vanillaBlockDisplay' import { VanillaItemDisplay } from './outliner/vanillaItemDisplay' @@ -42,6 +47,7 @@ import { applyEnchantmentGlintToMesh, removeEnchantmentGlintFromMesh, } from './shaders/enchantmentGlint' +import { hashAnimations, renderProjectAnimations } from './systems/animationRenderer' import { cleanupExportedFiles } from './systems/cleaner' import TELLRAW from './systems/datapackCompiler/tellraw' import { exportProject } from './systems/exporter' @@ -50,14 +56,18 @@ import * as blockModelManager from './systems/minecraft/blockModelManager' import { BLOCKSTATE_REGISTRY, getBlockState } from './systems/minecraft/blockstateManager' import { MinecraftFont } from './systems/minecraft/fontManager' import * as itemModelManager from './systems/minecraft/itemModelManager' +import * as previewResourcePack from './systems/minecraft/previewResourcePack' import './systems/minecraft/registryManager' import resourcepackCompiler from './systems/resourcepackCompiler' +import { hashRig, renderRig } from './systems/rigRenderer' import { isDataPackPath, isResourcePackPath, parseResourcePackPath, toSmallCaps, } from './util/minecraftUtil' +import * as textureSlots from './textureSlots' +import * as animationPreview from './animationPreview' import { Variant } from './variants' declare global { @@ -73,7 +83,10 @@ const AnimatedJavaApi = { datapackCompiler, resourcepackCompiler, Variant, + textureSlots, + animationPreview, openExportProgressDialog, + debugExportProgressDialog, isResourcePackPath, isDataPackPath, openUnexpectedErrorDialog, @@ -84,11 +97,18 @@ const AnimatedJavaApi = { assetManager, itemModelManager, blockModelManager, + previewResourcePack, VanillaItemDisplay, VanillaBlockDisplay, + Interaction, debugBlockState, BLOCKSTATE_REGISTRY, exportProject, + // Export-pipeline stages, exposed for the test suite. + renderRig, + hashRig, + renderProjectAnimations, + hashAnimations, openInstallPopup, exportAll, removeCubesAssociatedWithTexture(texture: Texture) { diff --git a/src/lang/de.yml b/src/lang/de.yml index c7fdf393..d9a43331 100644 --- a/src/lang/de.yml +++ b/src/lang/de.yml @@ -326,11 +326,6 @@ animated_java.dialog.variant_config.generate_name_from_display_name.description: animated_java.dialog.variant_config.variant_name: Name animated_java.dialog.variant_config.variant_name.description: Wird verwendet, um die Variante im exportierten Ressourcenpaket und Datenpaket zu identifizieren. -animated_java.dialog.variant_config.texture_map.title: Textur Zuordnung -animated_java.dialog.variant_config.texture_map.description: Eine Zuordnung mit den Texturen, die bei dieser Variante ausgetauscht werden sollen. -animated_java.dialog.variant_config.texture_map.create_new_mapping: Neue Zuordnung erstellen -animated_java.dialog.variant_config.texture_map.no_mappings: Variante hat keine ausgetauschten Texturen. - animated_java.dialog.variant_config.bone_lists.description: Eine Liste von Nodes, die von der Variante ein- oder ausgeschlossen werden sollen. Nur die Nodes in der eingeschlossenen Liste werden von der Variante geรคndert, die Nodes in der ausgeschlossenen Liste werden ignoriert. animated_java.dialog.variant_config.excluded_nodes.title: Ausgeschlossene Nodes animated_java.dialog.variant_config.excluded_nodes.description: Eine Liste von Nodes, die von der Variante ausgeschlossen werden sollen. Diese Nodes werden von der Variante ignoriert. diff --git a/src/lang/en.yml b/src/lang/en.yml index a38b5f87..4f306d71 100644 --- a/src/lang/en.yml +++ b/src/lang/en.yml @@ -66,6 +66,8 @@ animated_java: duplicate: Duplicate Variant open_config: Open Variant Config delete: Delete Variant + texture_slots: + create: Create Texture Slot upgrade_old_aj_model_loader: name: Update .ajmodel select_file: Select .ajmodel File @@ -107,14 +109,54 @@ animated_java: title: Animated Java Changelog item_properties: title: Item Model Properties - tint_constants: Tint Constants - description: |- - [Markdown] - Constant tints apply fixed color values to an item's tint layers, so the model always uses the same tint colors in-game. + description: Tints color this bone's faces by tint index. Expand a tint to see what it does. + target: Target + column: + type: Type + value: Value add_tint: Add Tint - empty_state: No tint constants configured. Add a tint to start. - tint_label: Tint Index %s - remove_tint: Remove + empty_state: No tints configured. The bone uses a white Dye tint by default. + expand_tint: Show details + collapse_tint: Hide details + remove_tint: Remove tint + color: Color + default_color: Default Color + index: Index + temperature: Temperature + downfall: Downfall + alpha_tooltip: Alpha only works on Dye and Firework tints, through a vanilla bug (MC-278626). It may stop working in a future Minecraft version. + alpha_note: Alpha only works on Dye and Firework tints, through a vanilla bug (MC-278626). With cutout textures, faces below ~10% alpha disappear and the rest render opaque. + unsupported_type: '%s is not supported in Minecraft %s. Change the type or remove this tint before exporting.' + tint_types: + constant: Constant + dye: Dye + firework: Firework + potion: Potion + map_color: Map Color + team: Team + grass: Grass + custom_model_data: Custom Model Data + tint_type_descriptions: + constant: Always applies the same color. + dye: Uses the item's dyed color component. + firework: Uses the colors of the item's firework explosion component. + potion: Uses the color of the item's potion contents. + map_color: Uses the item's map color component. + team: Uses the team color of the entity displaying the item. + grass: Samples the grass colormap at a temperature and downfall. + custom_model_data: Uses a color from the item's custom model data component. + field_descriptions: + color: The color applied to this tint index. + temperature: Grass colormap temperature, from 0 to 1. + downfall: Grass colormap downfall, from 0 to 1. + index: Which entry of the custom model data component's colors list to use. + default_color: + dye: Used when the item has no dyed color component. + firework: Used when the item has no firework explosion component. + potion: Used when the item has no potion contents, or they have no effects and no custom color. + map_color: Used when the item has no map color component. + team: Used when there is no entity, or it isn't on a team with a color. + custom_model_data: Used when the item's custom model data has no color at this index. unexpected_error: title: An Unexpected Error Occurred! close_button: Close @@ -151,6 +193,7 @@ animated_java: rig.title: Rig event_functions.title: Event Functions plugin.title: Plugin + preview.title: Preview misc.title: Misc project_settings: @@ -191,17 +234,14 @@ animated_java: `animated_java:global` is a reserved ID and cannot be used. invalid_characters: Blueprint ID can only contain lowercase letters, numbers, and underscores. show_render_box: - title: Show Render Box - description: When enabled, the render box will be visible in the editor. + title: Preview Render Box + description: Show a box in the preview that represents the rig's render box. auto_render_box: - title: Auto-Size Render Box - description: |- - When enabled, the render box will be automatically calculated based on the model's geometry. + title: Auto Render Box + description: Automatically adjust the rig's render box to fit the model. render_box: title: Render Box Size - description: |- - [Markdown] - The [width and height](https://minecraft.wiki/w/Display#Entity_data) of the rig's display entities. + description: The size of the rig's render box. This is ignored if Auto Render Box is enabled. view_range: title: View Range description: |- @@ -211,12 +251,27 @@ animated_java: title: Plugin Mode description: |- When enabled, the project will be exported as a JSON file designed for use with plugins. + target_environment: + title: Target Environment + description: What system you'll be using to animate your Blueprint in-game. + options: + datapack: Datapack + plugin: Plugin + blueprint_name: + title: Blueprint Name + description: The name of your Blueprint. Used for the exported file name and in-game display name. resource_pack_export_mode: - title: Resource Pack Export Mode + title: Resource Pack Export Format options: - folder: Folder - zip: Zip - none: None + folder: + title: Folder + description: Export the Resource Pack as a folder and automatically merge with existing files. + zip: + title: Zip + description: Export the Resource Pack as a `.zip` file. + none: + title: None + description: Don't export a Resource Pack. data_pack_export_mode: title: Data Pack Export Format options: @@ -283,12 +338,42 @@ animated_java: warning: no_assets: Selected folder does not contain an assets folder. folder: + title: Resource Pack Folder + description: The folder to export the Resource Pack to. error: empty: Resource Pack folder is required. invalid_path: 'Failed to resolve path: %s' does_not_exist: Selected path does not exist. not_a_dir: Selected path is not a directory. no_pack_mcmeta: Selected folder does not contain a pack.mcmeta file. + zip: + title: Resource Pack Zip + description: The location to export the Resource Pack zip file to. + preview: + list: + title: Preview Resource Packs + hint: |- + [Markdown] + Load custom Resource Packs to preview custom fonts, models, and textures directly in the editor. + + This only affects the editor preview - it is never exported, and does not replace your Blueprint's own Resource Pack. + + Each entry is a Resource Pack folder (containing a `pack.mcmeta` file) or a `.zip` archive. Packs higher in the list override packs below them. + add: Add Pack + empty: No preview Resource Packs. + placeholder: Path to a Resource Pack folder or .zip + browse_folder: Select a folder + browse_zip: Select a .zip file + move_up: Move up + move_down: Move down + remove: Remove + error: + entry: 'Pack %s: %s' + warning: + entry: 'Pack %s: %s' + error: + zip_is_a_dir: Path ends with `.zip` but is a folder. + reload: Reload Preview data_pack_settings: title: Data Pack data_pack: @@ -368,6 +453,21 @@ animated_java: [Markdown] The default [teleport duration](https://minecraft.wiki/w/Display#Entity_data) of the rig. + shadow_radius: + title: Shadow Radius + description: |- + [Markdown] + The [shadow radius](https://minecraft.wiki/w/Display#Entity_data) of the rig's root entity, in blocks. + + `0` disables the shadow. + shadow_strength: + title: Shadow Strength + description: |- + [Markdown] + The [shadow strength](https://minecraft.wiki/w/Display#Entity_data) of the rig's root entity. + + Only has an effect when Shadow Radius is greater than `0`. + use_entity_stacking: title: Use Entity Stacking description: |- @@ -718,6 +818,21 @@ animated_java: custom_name_visible: title: Custom Name Visible description: Whether or not the custom name should always be visible. + texture_slot: + title: Texture Slot + name: Name + name.description: Used to name the slot's functions and models in the exported Resource Pack and Data Pack. + textures: Textures + faces: '%s faces' + hint: Drag to reorder. The first texture is the default. + add_texture: Add Texture + all_textures_added: Every texture is already in this slot. + no_textures: No textures yet. Add one to use this slot. + default: Default + preview: Show in the editor + remove: Remove from slot + missing: Missing texture + old_version_notice: On this Minecraft version, Texture Slots only change when a Variant is applied. Switching a single slot with a command needs Minecraft %s or newer. variant_config: title: Variant Config variant_display_name: Display Name @@ -726,11 +841,10 @@ animated_java: generate_name_from_display_name.description: Whether or not to generate the Name automatically from the Display Name. variant_name: Name variant_name.description: Used to identify the Variant in the exported Resource Pack and Data Pack. - texture_map: - title: Texture Map - description: A map of which textures to swap out when applying this Variant. - create_new_mapping: Create New Mapping - no_mappings: Variant has no mapped textures. + slot_textures: + title: Texture Slots + description: The texture each Texture Slot switches to when this Variant is applied. Slots not listed here are left unchanged. + no_slots: This Variant doesn't change any Texture Slots. bone_lists: description: |- Specify which nodes the Variant should affect. @@ -799,6 +913,14 @@ animated_java: description: A list of nodes to include in the animation. Only these nodes will be modified by the animation. swap_columns_button: tooltip: Swap Lists + preview_variants: + title: Preview Variants + description: The Variants shown when previewing this animation starts, applied in order. Set these to match the rig's expected in-game state when the animation plays. Only affects the editor. + empty: The default Variant. + preview_texture_slots: + title: Preview Texture Slots + description: The textures Texture Slots show when previewing this animation starts, after the Preview Variants. Only affects the editor. + empty: Texture Slots show what the Preview Variants set. export_progress: title: Exporting... blueprint_loading: @@ -815,12 +937,17 @@ animated_java: variant_visible: Variant Selected variant_not_visible: Variant Not Selected cannot_delete_default_variant: Cannot delete the default variant! - cannot_edit_default_variant: Cannot edit the default variant! keyframe: keyframe_title: Keyframe (%s) + remove: Remove variant: - title: Variant - description: The Variant to apply to the keyframe. + title: Variants + description: The Variants to apply, in order. Later Variants override earlier ones on the nodes they change. + empty: This keyframe doesn't apply any Variants. + texture_slot: + title: Texture Slots + description: The texture each Texture Slot switches to, on every node with faces in that slot. Applied after Variant keyframes on the same frame. Slots not listed here are left unchanged. + empty: This keyframe doesn't change any Texture Slots. function: title: Function description: |- @@ -904,19 +1031,45 @@ animated_java: title: Displayed Item description: The item to display. vanilla_block_display: - title: Displayed Block + title: Block description: The block to display. Supports block states! + blockstates: Blockstates + + textures: + linked_icon: |- + Linked texture + Loaded from a resource pack and referenced by its resource location. Not exported with the Blueprint. + internal_icon: |- + Internal texture + Stored in the Blueprint file and written to the Blueprint's texture folder on export. + slot_icon: |- + Texture Slot + Faces using it can switch between its textures. Double-click to edit. + slot_description: Texture Slot ยท %s textures animation: excluded_nodes: Excluded Nodes invert_excluded_nodes: Invert Excluded Nodes + slot_textures_editor: + add_slot: Add Texture Slot + all_slots_added: Every Texture Slot is already listed. + + variant_stack_editor: + add_variant: Add Variant + all_variants_added: Every Variant is already listed. + move_up: Move Up + move_down: Move Down + missing_variant: Missing Variant + effect_animator: timeline: variant: Variant + texture_slot: Texture Slots function: Function keyframe_data_point: - variant: Variant + variant: Variants + texture_slots: Texture Slots function: Function execute_condition: Execute Condition repeat: Repeat @@ -994,6 +1147,14 @@ animated_java: If you want to rotate a cube on multiple axes, put it in a bone and rotate the bone instead. All of the invalid cubes are outlined in red in the editor. Please fix them before exporting. + texture_slot_keyframes_old_version: + message: |- + The animation "%s" has Texture Slot keyframes, which aren't supported in Minecraft %s. + Remove them, or target Minecraft %s or newer. + unsupported_tint_source: + message: |- + The bone "%s" uses a %s tint, which is not supported in Minecraft %s. + Change or remove it in the bone's Item Model Properties before exporting. rig_has_textures_but_no_custom_models: message: |- You have textures applied to your model, but have no custom models (Cubes) to use them! @@ -1003,7 +1164,13 @@ animated_java: You have custom models (Cubes) in your model, but have no textures applied to them! Please apply textures to your Cubes, or remove the Cubes before exporting. + menu: + texture_slot: + preview: Preview + properties: Texture Slot Properties + toast: + texture_slots_old_version: On Minecraft %s, Texture Slots only change when a Variant is applied. Swapping a single slot with the texture_slots functions needs Minecraft %s or newer. invalid_rotations: |- Invalid Cube Rotations! diff --git a/src/lang/ko.yml b/src/lang/ko.yml index 09cc2dc2..b3117ed0 100644 --- a/src/lang/ko.yml +++ b/src/lang/ko.yml @@ -668,11 +668,6 @@ animated_java: generate_name_from_display_name.description: ๋ผ๋ฒจ์—์„œ ์ด๋ฆ„์„ ์ž๋™ ์ƒ์„ฑํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. variant_name: ์ด๋ฆ„ variant_name.description: ๋‚ด๋ณด๋‚ธ ๋ฆฌ์†Œ์Šค ํŒฉ๊ณผ ๋ฐ์ดํ„ฐ ํŒฉ์—์„œ ๋ฐฐ๋ฆฌ์–ธํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. - texture_map: - title: ํ…์Šค์ฒ˜ ๋งต - description: ์ด ๋ฐฐ๋ฆฌ์–ธํŠธ๋ฅผ ์ ์šฉํ•  ๋•Œ ๊ต์ฒดํ•  ํ…์Šค์ฒ˜๋“ค์˜ ๋งต์ž…๋‹ˆ๋‹ค. - create_new_mapping: ์ƒˆ ๋งคํ•‘ ์ƒ์„ฑ - no_mappings: ๋ฐฐ๋ฆฌ์–ธํŠธ์— ๋งคํ•‘๋œ ํ…์Šค์ฒ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. bone_lists: description: |- ๋ฐฐ๋ฆฌ์–ธํŠธ๊ฐ€ ์˜ํ–ฅ์„ ์ค„ ๋…ธ๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. @@ -746,7 +741,6 @@ animated_java: variant_visible: ๋ฐฐ๋ฆฌ์–ธํŠธ ์„ ํƒ๋จ variant_not_visible: ๋ฐฐ๋ฆฌ์–ธํŠธ ์„ ํƒ๋˜์ง€ ์•Š์Œ cannot_delete_default_variant: ๊ธฐ๋ณธ ๋ฐฐ๋ฆฌ์–ธํŠธ๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! - cannot_edit_default_variant: ๊ธฐ๋ณธ ๋ฐฐ๋ฆฌ์–ธํŠธ๋Š” ํŽธ์ง‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค! keyframe: keyframe_title: ํ‚คํ”„๋ ˆ์ž„ (%s) variant: diff --git a/src/lang/nl.yml b/src/lang/nl.yml index b96a311b..14400525 100644 --- a/src/lang/nl.yml +++ b/src/lang/nl.yml @@ -320,11 +320,6 @@ animated_java.dialog.variant_config.generate_name_from_display_name.description: animated_java.dialog.variant_config.variant_name: Naam animated_java.dialog.variant_config.variant_name.description: Wordt gebruikt om de variant in de geรซxporteerde Resource Pack en Data Pack te identificeren. -animated_java.dialog.variant_config.texture_map.title: Textuur Map -animated_java.dialog.variant_config.texture_map.description: Een map van welke texturen moeten worden verwisseld bij het toepassen van deze variant. -animated_java.dialog.variant_config.texture_map.create_new_mapping: Nieuwe Mapping Maken -animated_java.dialog.variant_config.texture_map.no_mappings: Variant heeft geen in kaart gebrachte texturen. - animated_java.dialog.variant_config.bone_lists.description: Een lijst met nodes die wel of niet worden meegenomen in de Variant. Alleen nodes in de geรฏncludeerde lijst worden gewijzigd door de Variant, en nodes in de uitgesloten lijst worden genegeerd. animated_java.dialog.variant_config.excluded_nodes.title: Uitgelosten Nodes animated_java.dialog.variant_config.excluded_nodes.description: Een lijst met nodes die uitgesloten moeten worden van de Variant. Deze nodes worden niet gewijzigd door de Variant. diff --git a/src/lang/ru.yml b/src/lang/ru.yml index cf514a7f..e0726fa9 100644 --- a/src/lang/ru.yml +++ b/src/lang/ru.yml @@ -486,11 +486,6 @@ animated_java.dialog.variant_config.generate_name_from_display_name.description: animated_java.dialog.variant_config.variant_name: ะ˜ะผั animated_java.dialog.variant_config.variant_name.description: ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะฒ ะดะฐั‚ะฐะฟะฐะบะต ะธ ั€ะตััƒั€ัะฟะฐะบะต. -animated_java.dialog.variant_config.texture_map.title: ะขะตะบัั‚ัƒั€ะฝะฐั ะบะฐั€ั‚ะฐ -animated_java.dialog.variant_config.texture_map.description: ะšะฐั€ั‚ะฐ ั‚ะตะบัั‚ัƒั€, ะบะพั‚ะพั€ั‹ะต ะฑัƒะดัƒั‚ ะทะฐะผะตะฝะตะฝั‹ ะฟั€ะธ ะฟั€ะธะผะตะฝะตะฝะธะธ ัั‚ะพะณะพ ะฒะฐั€ะธะฐะฝั‚ะฐ. -animated_java.dialog.variant_config.texture_map.create_new_mapping: ะกะพะทะดะฐั‚ัŒ ะฝะพะฒะพะต ัะพะฟะพัั‚ะฐะฒะปะตะฝะธะต -animated_java.dialog.variant_config.texture_map.no_mappings: ะฃ ะฒะฐั€ะธะฐะฝั‚ะฐ ะฝะตั‚ ะทะฐะผะตะฝัะตะผั‹ั… ั‚ะตะบัั‚ัƒั€. - animated_java.dialog.variant_config.bone_lists.description: |- ะฃะบะฐะถะธั‚ะต ะฝะพะดั‹, ะบะพั‚ะพั€ั‹ะต ะดะพะปะถะฝั‹ ะฑั‹ั‚ัŒ ะธะทะผะตะฝะตะฝั‹ ะฟั€ะธ ะฟั€ะธะผะตะฝะตะฝะธะธ ะฒะฐั€ะธะฐะฝั‚ะฐ. @@ -562,7 +557,6 @@ animated_java.panel.variants.tool.delete_selected_variant: ะฃะดะฐะปะธั‚ัŒ ะฒั‹ะฑ animated_java.panel.variants.tool.variant_visible: ะ’ะฐั€ะธะฐะฝั‚ ะฒั‹ะฑั€ะฐะฝ animated_java.panel.variants.tool.variant_not_visible: ะ’ะฐั€ะธะฐะฝั‚ ะฝะต ะฒั‹ะฑั€ะฐะฝ animated_java.panel.variants.tool.cannot_delete_default_variant: ะฃะดะฐะปะธั‚ัŒ ะฒะฐั€ะธะฐะฝั‚ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะฝะตะปัŒะทั! -animated_java.panel.variants.tool.cannot_edit_default_variant: ะ˜ะทะผะตะฝะธั‚ัŒ ะฒะฐั€ะธะฐะฝั‚ ะฟะพ ัƒะผะพะปั‡ะฐะฝะธัŽ ะฝะตะปัŒะทั! animated_java.action.variants.create: ะกะพะทะดะฐั‚ัŒ ะฒะฐั€ะธะฐะฝั‚ animated_java.action.variants.duplicate: ะ”ัƒะฑะปะธั€ะพะฒะฐั‚ัŒ ะฒะฐั€ะธะฐะฝั‚ diff --git a/src/lang/uk.yml b/src/lang/uk.yml index 2e07bb79..1aab5d79 100644 --- a/src/lang/uk.yml +++ b/src/lang/uk.yml @@ -485,11 +485,6 @@ animated_java.dialog.variant_config.generate_name_from_display_name.description: animated_java.dialog.variant_config.variant_name: ะะฐะทะฒะฐ animated_java.dialog.variant_config.variant_name.description: ะ’ะธะบะพั€ะธัั‚ะพะฒัƒั”ั‚ัŒัั ะฒ ะดะฐั‚ะฐะฟะฐะบัƒ ั‚ะฐ ั€ะตััƒั€ัะฟะฐะบัƒ. -animated_java.dialog.variant_config.texture_map.title: ะขะตะบัั‚ัƒั€ะฝะฐ ะบะฐั€ั‚ะฐ -animated_java.dialog.variant_config.texture_map.description: ะšะฐั€ั‚ะฐ ั‚ะตะบัั‚ัƒั€, ัะบั– ะฑัƒะดัƒั‚ัŒ ะทะฐะผั–ะฝะตะฝั– ะฟั€ะธ ะทะฐัั‚ะพััƒะฒะฐะฝะฝั– ั†ัŒะพะณะพ ะฒะฐั€ั–ะฐะฝั‚ัƒ. -animated_java.dialog.variant_config.texture_map.create_new_mapping: ะกั‚ะฒะพั€ะธั‚ะธ ะฝะพะฒะต ะทั–ัั‚ะฐะฒะปะตะฝะฝั -animated_java.dialog.variant_config.texture_map.no_mappings: ะฃ ั†ัŒะพะณะพ ะฒะฐั€ั–ะฐะฝั‚ัƒ ะฝะตะผะฐั” ะทะฐะผั–ะฝะฝะธั… ั‚ะตะบัั‚ัƒั€. - animated_java.dialog.variant_config.bone_lists.description: |- ะ’ะบะฐะถั–ั‚ัŒ ะฝะพะดะธ, ัะบั– ะผะฐัŽั‚ัŒ ะฑัƒั‚ะธ ะทะผั–ะฝะตะฝั– ะฟั€ะธ ะทะฐัั‚ะพััƒะฒะฐะฝะฝั– ั†ัŒะพะณะพ ะฒะฐั€ั–ะฐะฝั‚ัƒ. @@ -561,7 +556,6 @@ animated_java.panel.variants.tool.delete_selected_variant: ะ’ะธะดะฐะปะธั‚ะธ ะฒะธ animated_java.panel.variants.tool.variant_visible: ะ’ะฐั€ั–ะฐะฝั‚ ะพะฑั€ะฐะฝะพ animated_java.panel.variants.tool.variant_not_visible: ะ’ะฐั€ั–ะฐะฝั‚ ะฝะต ะพะฑั€ะฐะฝะพ animated_java.panel.variants.tool.cannot_delete_default_variant: ะะต ะผะพะถะฝะฐ ะฒะธะดะฐะปะธั‚ะธ ะฒะฐั€ั–ะฐะฝั‚ ะทะฐ ะทะฐะผะพะฒั‡ัƒะฒะฐะฝะฝัะผ! -animated_java.panel.variants.tool.cannot_edit_default_variant: ะะต ะฒะดะฐะปะพัั ะทะผั–ะฝะธั‚ะธ ะฒะฐั€ั–ะฐะฝั‚ ะทะฐ ะทะฐะผะพะฒั‡ัƒะฒะฐะฝะฝัะผ! animated_java.action.variants.create: ะกั‚ะฒะพั€ะธั‚ะธ ะฒะฐั€ั–ะฐะฝั‚ animated_java.action.variants.duplicate: ะ”ัƒะฑะปัŽะฒะฐั‚ะธ ะฒะฐั€ั–ะฐะฝั‚ diff --git a/src/lang/zh_cn.yml b/src/lang/zh_cn.yml index 18f849cd..51deaf4f 100644 --- a/src/lang/zh_cn.yml +++ b/src/lang/zh_cn.yml @@ -808,11 +808,6 @@ animated_java: generate_name_from_display_name.description: ๆ˜ฏๅฆๆ นๆฎๆ˜พ็คบๅ็งฐ่‡ชๅŠจ็”Ÿๆˆๅ็งฐใ€‚ variant_name: ๅ็งฐ variant_name.description: ็”จไบŽๅœจๅฏผๅ‡บ็š„่ต„ๆบๅŒ…ๅ’Œๆ•ฐๆฎๅŒ…ไธญ่ฏ†ๅˆซๅ˜ไฝ“ใ€‚ - texture_map: - title: ็บน็†ๆ˜ ๅฐ„ - description: ๅบ”็”จ่ฏฅๅ˜ไฝ“ๆ—ถๆ‰€ไฝฟ็”จ็š„่ดดๅ›พใ€‚ - create_new_mapping: ๅˆ›ๅปบๆ–ฐ็š„ๆ˜ ๅฐ„ - no_mappings: ๅ˜ไฝ“ไธๅญ˜ๅœจๆ˜ ๅฐ„็š„็บน็†ใ€‚ bone_lists: description: ๅŒ…ๅซๆˆ–ๆŽ’้™คๅœจๅ˜ไฝ“็š„่Š‚็‚นๅˆ—่กจใ€‚ๅŒ…ๅซ็š„่Š‚็‚นๅฐ†ไผš่ขซๅ˜ไฝ“ไฟฎๆ”น๏ผŒๆŽ’้™ค็š„่Š‚็‚นๅˆ™ไผš่ขซ่Š‚็‚นๅฟฝ็•ฅใ€‚ excluded_nodes: @@ -871,7 +866,6 @@ animated_java: variant_visible: ๅทฒ้€‰ๆ‹ฉๅ˜ไฝ“ variant_not_visible: ๆœช้€‰ๆ‹ฉๅ˜ไฝ“ cannot_delete_default_variant: ไธๅฏๅˆ ้™ค้ป˜่ฎคๅ˜ไฝ“๏ผ - cannot_edit_default_variant: ไธ่ƒฝ็ผ–่พ‘้ป˜่ฎคๅ˜ไฝ“๏ผ keyframe: keyframe_title: ๅ…ณ้”ฎๅธง (%s) variant: diff --git a/src/mods/animation.ts b/src/mods/animation.ts index e5b644e4..1172244d 100644 --- a/src/mods/animation.ts +++ b/src/mods/animation.ts @@ -8,14 +8,22 @@ declare global { // eslint-disable-next-line @typescript-eslint/naming-convention interface _Animation { excluded_nodes: CollectionItem[] + /** Variant UUIDs applied, in order, before previewing the animation. Editor only. */ + preview_variants: string[] + /** Slot UUID -> texture UUID set before previewing the animation. Editor only. */ + preview_texture_slots: Record } interface AnimationUndoCopy { excluded_nodes: string[] + preview_variants: string[] + preview_texture_slots: Record } interface AnimationOptions { excluded_nodes: string[] + preview_variants: string[] + preview_texture_slots: Record } } @@ -102,11 +110,33 @@ registerPatch({ } ) - return { excludedNodesProperty } + const previewVariantsProperty = new Property( + Blockbench.Animation, + 'array', + 'preview_variants', + { + condition: () => activeProjectIsBlueprintFormat(), + default: [], + } + ) + + const previewTextureSlotsProperty = new Property( + Blockbench.Animation, + 'object', + 'preview_texture_slots', + { + condition: () => activeProjectIsBlueprintFormat(), + default: {}, + } + ) + + return { excludedNodesProperty, previewVariantsProperty, previewTextureSlotsProperty } }, - revert: ({ excludedNodesProperty }) => { + revert: ({ excludedNodesProperty, previewVariantsProperty, previewTextureSlotsProperty }) => { excludedNodesProperty.delete() + previewVariantsProperty.delete() + previewTextureSlotsProperty.delete() }, }) diff --git a/src/mods/animationPreviewMod.ts b/src/mods/animationPreviewMod.ts new file mode 100644 index 00000000..643b6de1 --- /dev/null +++ b/src/mods/animationPreviewMod.ts @@ -0,0 +1,22 @@ +import { registerProjectPatch } from 'blockbench-patch-manager' +import { resetAnimationPreview, updateAnimationPreview } from '../animationPreview' +import { BLUEPRINT_FORMAT_ID } from '../formats/blueprint' + +// Keeps the Variants and texture slots shown in step with the selected animation in Animate mode. +registerProjectPatch({ + id: 'animated_java:animation-preview', + + condition: ({ project }) => project.format.id === BLUEPRINT_FORMAT_ID, + + apply() { + const update = () => updateAnimationPreview() + const events: Array = ['display_animation_frame', 'select_mode'] + for (const event of events) Blockbench.on(event, update) + return { events, update } + }, + + revert({ events, update }) { + for (const event of events) Blockbench.removeListener(event, update) + resetAnimationPreview() + }, +}) diff --git a/src/mods/cube.ts b/src/mods/cube.ts index 839c9fe2..8da6ae45 100644 --- a/src/mods/cube.ts +++ b/src/mods/cube.ts @@ -14,7 +14,7 @@ import { } from '../shaders/enchantmentGlint' import { isCubeValid } from '../systems/util' import { localize as translate } from '../util/lang' -import { Variant } from '../variants' +import { getPreviewVariant } from '../animationPreview' declare global { // @ts-expect-error - Broken BB types @@ -26,16 +26,43 @@ declare global { const ERROR_OUTLINE_MATERIAL = Canvas.outlineMaterial.clone() ERROR_OUTLINE_MATERIAL.color.set('#ff0000') -export function updateAllCubeOutlines() { - for (const cube of Cube.all) { - Cube.preview_controller.updateTransform(cube) +export const updateAllCubeOutlines = () => { + if (activeProjectIsBlueprintFormat()) { + for (const cube of Cube.all) { + const validity = isCubeValid(cube) + + switch (validity) { + case 'valid': { + updateCubeValidity(cube, true) + break + } + case '1.21.6+': { + if (projectTargetVersionIsAtLeast('1.21.6')) { + updateCubeValidity(cube, true) + break + } + // Fallthrough to invalid if the target version is below 1.21.6 + } + case 'invalid': { + updateCubeValidity(cube, false) + showToastNotification() + break + } + } + } } } function updateCubeValidity(cube: Cube, isValid: boolean) { if (cube.isRotationValid === isValid) return - cube.mesh.outline.material = isValid ? Canvas.outlineMaterial : ERROR_OUTLINE_MATERIAL cube.isRotationValid = isValid + if (isValid && cube.mesh.outline.material === ERROR_OUTLINE_MATERIAL) { + cube.mesh.outline.material = Canvas.outlineMaterial + if (!cube.selected) cube.mesh.outline.visible = false + } else if (!isValid && cube.mesh.outline.material !== ERROR_OUTLINE_MATERIAL) { + cube.mesh.outline.material = ERROR_OUTLINE_MATERIAL + cube.mesh.outline.visible = true + } } let toastNotification: Deletable | null = null @@ -69,32 +96,9 @@ registerPatch({ id: `animated_java:cube-outline-mod`, apply: () => { - const originalUpdateTransform = Cube.preview_controller.updateTransform - Cube.preview_controller.updateTransform = function (cube: Cube) { - if (activeProjectIsBlueprintFormat()) { - const validity = isCubeValid(cube) - - switch (validity) { - case 'valid': { - updateCubeValidity(cube, true) - break - } - case '1.21.6+': { - if (projectTargetVersionIsAtLeast('1.21.6')) { - updateCubeValidity(cube, true) - break - } - // Fallthrough to invalid if the target version is below 1.21.6 - } - case 'invalid': { - updateCubeValidity(cube, false) - showToastNotification() - break - } - } - } - originalUpdateTransform.call(this, cube) - } + Blockbench.on('finish_edit', updateAllCubeOutlines) + Blockbench.on('undo', updateAllCubeOutlines) + Blockbench.on('redo', updateAllCubeOutlines) const originalInit = Cube.prototype.init Cube.prototype.init = function (this: Cube) { @@ -114,11 +118,13 @@ registerPatch({ return cube } - return { originalUpdateTransform, originalInit } + return { originalInit } }, - revert: ({ originalUpdateTransform, originalInit }) => { - Cube.preview_controller.updateTransform = originalUpdateTransform + revert: ({ originalInit }) => { + Blockbench.removeListener('finish_edit', updateAllCubeOutlines) + Blockbench.removeListener('undo', updateAllCubeOutlines) + Blockbench.removeListener('redo', updateAllCubeOutlines) Cube.prototype.init = originalInit }, }) @@ -138,16 +144,17 @@ registerPropertyOverridePatch({ const parent = instance.parent let config: IBlueprintDisplayEntityConfigJSON if (parent instanceof Group) { - if (!Variant.selected || Variant.selected.isDefault) { + const variant = getPreviewVariant(parent) + if (!variant || variant.isDefault) { config = parent.configs.default } else { - config = parent.configs.variants[Variant.selected.uuid] + config = parent.configs.variants[variant.uuid] } - removeEnchantmentGlintFromMesh(instance.mesh) - if (config?.enchanted) { applyEnchantmentGlintToMesh(instance.mesh) + } else { + removeEnchantmentGlintFromMesh(instance.mesh) } } } diff --git a/src/mods/customKeyframes.ts b/src/mods/customKeyframes.ts index d59bffc1..81cfbfd0 100644 --- a/src/mods/customKeyframes.ts +++ b/src/mods/customKeyframes.ts @@ -7,7 +7,10 @@ declare global { // @ts-expect-error - Broken BB types // eslint-disable-next-line @typescript-eslint/naming-convention interface _Keyframe { - variant?: Variant + /** Variants to apply, in order. */ + variants?: Variant[] + /** Slot UUID -> texture UUID. Slots left out are unchanged. */ + texture_slots?: Record function?: string execute_condition?: string repeat?: boolean @@ -21,10 +24,13 @@ export enum LOCATOR_CHANNELS { export enum EFFECT_ANIMATOR_CHANNELS { VARIANT = 'variant', + TEXTURE_SLOT = 'texture_slot', FUNCTION = 'function', } export enum KEYFRAME_DATA_POINTS { + VARIANTS = 'variants', + TEXTURE_SLOTS = 'texture_slots', EXECUTE_CONDITION = 'execute_condition', REPEAT = 'repeat', REPEAT_FREQUENCY = 'repeat_frequency', @@ -35,27 +41,48 @@ export function isCustomKeyframeChannel(channel: string) { } registerPropertyOverridePatch({ - id: `animated_java:keyframe/data-point/variant`, + id: `animated_java:keyframe/data-point/variants`, target: Blockbench.Keyframe.prototype, - key: EFFECT_ANIMATOR_CHANNELS.VARIANT, + key: KEYFRAME_DATA_POINTS.VARIANTS, condition: () => activeProjectIsBlueprintFormat(), get(this: _Keyframe) { - const uuid = this.data_points.at(0)?.[EFFECT_ANIMATOR_CHANNELS.VARIANT] as - | string - | undefined - if (uuid) return Variant.getByUUID(uuid) - console.error('Keyframe variant', uuid, 'not found!') + const uuids = (this.data_points.at(0)?.[KEYFRAME_DATA_POINTS.VARIANTS] ?? []) as string[] + return uuids.map(uuid => Variant.getByUUID(uuid)).filter((v): v is Variant => !!v) }, - set(this: _Keyframe, value: Variant | undefined) { + set(this: _Keyframe, value: Variant[]) { const dataPoint = this.data_points.at(0) if (dataPoint) { - dataPoint[EFFECT_ANIMATOR_CHANNELS.VARIANT] = value?.uuid + dataPoint[KEYFRAME_DATA_POINTS.VARIANTS] = value.map(variant => variant.uuid) return value } - return undefined + return undefined! + }, +}) + +registerPropertyOverridePatch({ + id: `animated_java:keyframe/data-point/texture-slots`, + target: Blockbench.Keyframe.prototype, + key: KEYFRAME_DATA_POINTS.TEXTURE_SLOTS, + + condition: () => activeProjectIsBlueprintFormat(), + + get(this: _Keyframe) { + return (this.data_points.at(0)?.[KEYFRAME_DATA_POINTS.TEXTURE_SLOTS] ?? {}) as Record< + string, + string + > + }, + + set(this: _Keyframe, value: Record) { + const dataPoint = this.data_points.at(0) + if (dataPoint) { + dataPoint[KEYFRAME_DATA_POINTS.TEXTURE_SLOTS] = { ...value } + return value + } + return undefined! }, }) @@ -157,6 +184,11 @@ registerProjectPatch({ mutable: true, max_data_points: 1, }) + EffectAnimator.addChannel(EFFECT_ANIMATOR_CHANNELS.TEXTURE_SLOT, { + name: translate('effect_animator.timeline.texture_slot'), + mutable: true, + max_data_points: 1, + }) EffectAnimator.addChannel(EFFECT_ANIMATOR_CHANNELS.FUNCTION, { name: translate('effect_animator.timeline.function'), mutable: true, @@ -165,12 +197,20 @@ registerProjectPatch({ // Add custom keyframe properties to the KeyframeDataPoint class const properties = [ - new Property(KeyframeDataPoint, 'string', EFFECT_ANIMATOR_CHANNELS.VARIANT, { + new Property(KeyframeDataPoint, 'array', KEYFRAME_DATA_POINTS.VARIANTS, { label: translate('effect_animator.keyframe_data_point.variant'), condition: datapoint => datapoint.keyframe.channel === EFFECT_ANIMATOR_CHANNELS.VARIANT, exposed: false, - default: () => Variant.getDefault().uuid, + default: () => [Variant.getDefault().uuid], + }), + + new Property(KeyframeDataPoint, 'object', KEYFRAME_DATA_POINTS.TEXTURE_SLOTS, { + label: translate('effect_animator.keyframe_data_point.texture_slots'), + condition: datapoint => + datapoint.keyframe.channel === EFFECT_ANIMATOR_CHANNELS.TEXTURE_SLOT, + exposed: false, + default: {}, }), new Property(KeyframeDataPoint, 'string', EFFECT_ANIMATOR_CHANNELS.FUNCTION, { @@ -211,41 +251,13 @@ registerProjectPatch({ delete EffectAnimator.prototype.channels[channel] } - // Modify the displayFrame method to handle custom keyframes + // Only keep Blockbench's sound keyframe handling. Variant and texture slot keyframes are + // previewed by `updateAnimationPreview`. const defaultEffectDisplayFrame = EffectAnimator.prototype.displayFrame EffectAnimator.prototype.displayFrame = function (this: EffectAnimator, inLoop: boolean) { this.muted.particle = true this.muted.timeline = true - // Default Blockbench Sound keyframe handling defaultEffectDisplayFrame.call(this, inLoop) - - if (!(Project && activeProjectIsBlueprintFormat())) return - if (!this.muted[EFFECT_ANIMATOR_CHANNELS.VARIANT]) { - let after, before, result: _Keyframe | undefined - - for (const kf of this[EFFECT_ANIMATOR_CHANNELS.VARIANT] as _Keyframe[]) { - if (kf.time < this.animation.time) { - if (!before || kf.time > before.time) { - before = kf - } - } else { - if (!after || kf.time < after.time) { - after = kf - } - } - } - - if (after && after.time === this.animation.time) { - result = after - } else if (before) { - result = before - } else if (after) { - result = this[EFFECT_ANIMATOR_CHANNELS.VARIANT].at(-1) - } - - result?.variant?.select() - } - this.last_displayed_time = this.animation.time } diff --git a/src/mods/displayFramePatch.ts b/src/mods/displayFramePatch.ts index b6b89c0e..6699309f 100644 --- a/src/mods/displayFramePatch.ts +++ b/src/mods/displayFramePatch.ts @@ -5,7 +5,7 @@ registerPropertyOverridePatch({ target: BoneAnimator.prototype, key: 'displayFrame', - get: original => { + get: _original => { return function (this: BoneAnimator, multiplier?: number) { if (!this.doRender()) return this.getGroup() diff --git a/src/mods/textureLinkIcon.ts b/src/mods/textureLinkIcon.ts new file mode 100644 index 00000000..5da19a2e --- /dev/null +++ b/src/mods/textureLinkIcon.ts @@ -0,0 +1,119 @@ +import { registerProjectPatch, registerPropertyOverridePatch } from 'blockbench-patch-manager' +import { activeProjectIsBlueprintFormat, BLUEPRINT_FORMAT_ID } from '../formats/blueprint' +import { localize } from '../util/lang' +import { isTextureSlot } from '../textureSlots' +import { isResourcePackPath } from '../util/minecraftUtil' + +/** A texture that Animated Java does not write to a file of its own on export. */ +function isManagedByBlueprint(texture: Texture): boolean { + return !!texture.internal || (!!texture.path && isResourcePackPath(texture.path)) +} + +export function updateTextureIcon(texture: Texture) { + const saveIcon = document.querySelector( + `li[texid="${texture.uuid}"] .texture_save_icon` + ) + if (!saveIcon) return + + if (isTextureSlot(texture)) { + saveIcon.textContent = 'style' + saveIcon.setAttribute('title', localize('panel.textures.slot_icon')) + saveIcon.classList.remove('clickable') + const description = saveIcon + .closest('li.texture') + ?.querySelector('.texture_res') + if (description) { + description.textContent = localize( + 'panel.textures.slot_description', + String(texture.slot_textures.length) + ) + } + } else if (texture.path && isResourcePackPath(texture.path)) { + // Referenced from a resource pack by resource location. + saveIcon.textContent = 'link' + saveIcon.setAttribute('title', localize('panel.textures.linked_icon')) + saveIcon.classList.remove('clickable') + } else if (texture.internal) { + // Embedded in the Blueprint - there is nothing to save to disk. + saveIcon.textContent = 'box' + saveIcon.setAttribute('title', localize('panel.textures.internal_icon')) + saveIcon.classList.remove('clickable') + } else { + // A file on disk - restore Blockbench's own save state. + saveIcon.textContent = texture.saved ? 'check_circle' : 'save' + saveIcon.setAttribute('title', '') + saveIcon.classList.toggle('clickable', !texture.saved) + } +} + +// The status icon is informational, but its element still carries Blockbench's +// `@click="texture.save()"` handler. Rather than block pointer events (which also +// kills the tooltip), make `save()` a no-op for textures the Blueprint manages. +registerPropertyOverridePatch({ + id: `animated_java:texture/skip-save-for-managed-textures`, + target: Texture.prototype, + key: 'save', + condition: () => activeProjectIsBlueprintFormat(), + get: original => { + return function (this: Texture, as?: any) { + if (!as && isManagedByBlueprint(this)) return this + return original.call(this, as) + } + }, +}) + +// `fromPath` is where a "Save As" (or a relink) turns an internal texture into a +// file-backed one. No event is fired for it, so refresh the icon here, and mark +// the Blueprint dirty since the texture's stored path just changed. +registerPropertyOverridePatch({ + id: `animated_java:texture/refresh-icon-on-from-path`, + target: Texture.prototype, + key: 'fromPath', + condition: () => activeProjectIsBlueprintFormat(), + get: original => { + return function (this: Texture, path: string, externalDataLoader?: any) { + const wasInternal = !!this.internal + const result = original.call(this, path, externalDataLoader) + requestAnimationFrame(() => updateTextureIcon(this)) + if (wasInternal && !this.internal && Project) Project.saved = false + return result + } + }, +}) + +registerProjectPatch({ + id: `animated_java:texture-link-icon`, + + condition({ project }) { + return project.format.id === BLUEPRINT_FORMAT_ID + }, + + apply() { + const refreshAll = () => { + for (const texture of Texture.all) updateTextureIcon(texture) + } + requestAnimationFrame(refreshAll) + + const onTextureChange = ({ texture }: BlockbenchEventMap['change_texture_path']) => + updateTextureIcon(texture) + // `change_texture_path` only fires on "Reopen"; catch every other path + // change (relink, properties dialog, undo/redo) via the edit it commits. + const onFinishedEdit = (data: BlockbenchEventMap['finished_edit']) => { + if ('remote' in data || data.aspects.textures) requestAnimationFrame(refreshAll) + } + + Blockbench.on('change_texture_path', onTextureChange) + Blockbench.on('add_texture', onTextureChange) + Blockbench.on('select_texture', onTextureChange) + Blockbench.on('finished_edit', onFinishedEdit) + + return { onTextureChange, onFinishedEdit } + }, + + revert({ onTextureChange, onFinishedEdit }) { + Blockbench.removeListener('change_texture_path', onTextureChange) + Blockbench.removeListener('add_texture', onTextureChange) + Blockbench.removeListener('select_texture', onTextureChange) + Blockbench.removeListener('finished_edit', onFinishedEdit) + }, +}) diff --git a/src/mods/textureNameSanitizer.ts b/src/mods/textureNameSanitizer.ts new file mode 100644 index 00000000..104d94a6 --- /dev/null +++ b/src/mods/textureNameSanitizer.ts @@ -0,0 +1,59 @@ +import { registerProjectPatch } from 'blockbench-patch-manager' +import { getFsModule } from '../constants' +import { activeProjectIsBlueprintFormat, BLUEPRINT_FORMAT_ID } from '../formats/blueprint' +import { isResourcePackPath } from '../util/minecraftUtil' + +/** + * Force internal texture names to Minecraft-safe characters and keep them unique. + * + * Textures linked from a valid resource pack are referenced by resource location + * and never written beside the blueprint's own textures, so their names are left + * alone and are allowed to collide with an internal texture's name. + */ +function sanitizeTextureNames() { + if (!activeProjectIsBlueprintFormat()) return + + const { existsSync } = getFsModule() + const isLinked = (texture: Texture) => + !!texture.path && isResourcePackPath(texture.path) && existsSync(texture.path) + + const taken = new Set() + for (const texture of Texture.all) { + if (isLinked(texture)) continue + + const ext = /\.[a-z0-9]+$/i.exec(texture.name)?.[0].toLowerCase() ?? '' + let stem = texture.name.slice(0, texture.name.length - ext.length) + stem = stem.toLowerCase().replace(/[^a-z0-9._-]/g, '_') || 'texture' + + let name = stem + ext + for (let i = 2; taken.has(name); i++) name = `${stem}_${i}${ext}` + taken.add(name) + + if (texture.name !== name) texture.name = name + } +} + +registerProjectPatch({ + id: `animated_java:texture-name-sanitizer`, + + condition: ({ project }) => project.format.id === BLUEPRINT_FORMAT_ID, + + apply() { + requestAnimationFrame(() => sanitizeTextureNames()) + + const onAddTexture = () => sanitizeTextureNames() + const onFinishEdit = ({ aspects }: BlockbenchEventMap['finish_edit']) => { + if (aspects.textures) sanitizeTextureNames() + } + + Blockbench.on('add_texture', onAddTexture) + Blockbench.on('finish_edit', onFinishEdit) + + return { onAddTexture, onFinishEdit } + }, + + revert({ onAddTexture, onFinishEdit }) { + Blockbench.removeListener('add_texture', onAddTexture) + Blockbench.removeListener('finish_edit', onFinishEdit) + }, +}) diff --git a/src/mods/textureSlotMod.ts b/src/mods/textureSlotMod.ts new file mode 100644 index 00000000..1dd47beb --- /dev/null +++ b/src/mods/textureSlotMod.ts @@ -0,0 +1,215 @@ +import { + registerDeletableHandlerPatch, + registerPatch, + registerProjectPatch, + registerPropertyOverridePatch, +} from 'blockbench-patch-manager' +import { openTextureSlotDialog } from '../dialogs/textureSlotConfig/textureSlotConfig' +import { activeProjectIsBlueprintFormat, BLUEPRINT_FORMAT_ID } from '../formats/blueprint' +import { + createTextureSlot, + getSlotDefaultTexture, + getSlotPreviewTexture, + getSlotTextures, + isTextureSlot, + previewSlotTexture, + updateAllSlotImages, +} from '../textureSlots' +import { localize as translate } from '../util/lang' + +registerPatch({ + id: 'animated_java:texture-slot-properties', + + apply: () => { + const properties = [ + new Property(Texture, 'boolean', 'is_texture_slot'), + new Property(Texture, 'array', 'slot_textures'), + ] + return { properties } + }, + + revert: ({ properties }) => { + for (const property of properties) property.delete() + }, +}) + +export const CREATE_TEXTURE_SLOT_ACTION = registerDeletableHandlerPatch({ + id: 'animated_java:action/create-texture-slot', + create() { + return new Blockbench.Action('animated_java:action/create-texture-slot', { + name: translate('action.texture_slots.create'), + icon: 'style', + category: 'textures', + condition: () => activeProjectIsBlueprintFormat(), + click() { + const selected = Texture.all.filter(t => t.selected || t.multi_selected) + const slot = createTextureSlot(selected) + slot.select() + openTextureSlotDialog(slot) + }, + }) + }, +}) + +registerPatch({ + id: 'animated_java:texture-slot-toolbar', + dependencies: ['animated_java:action/create-texture-slot'], + + apply: () => { + const action = CREATE_TEXTURE_SLOT_ACTION.get()! + const toolbar = (Toolbars as Record).texturelist + toolbar.add(action, 3) + return { action, toolbar } + }, + + revert: ({ action, toolbar }) => { + toolbar.remove(action) + }, +}) + +/** Blockbench's texture menu entries that still make sense for a slot: applying it to faces. */ +const APPLY_ITEM_NAMES = ['menu.texture.face', 'menu.texture.blank', 'menu.texture.elements'] + +// Slots get their own context menu. Most texture actions (resizing, filters, saving, animation) +// would only affect the slot's mirrored preview image. +registerPropertyOverridePatch({ + id: 'animated_java:texture/slot-context-menu', + target: Texture.prototype as Texture & { showContextMenu(event: MouseEvent): unknown }, + key: 'showContextMenu', + condition: () => activeProjectIsBlueprintFormat(), + get: original => { + const checked = 'radio_button_checked' + const unchecked = 'radio_button_unchecked' + const applyItems = Texture.prototype.menu!.structure.filter( + (item: any) => typeof item === 'object' && APPLY_ITEM_NAMES.includes(item.name) + ) + const slotMenu = new Menu([ + new MenuSeparator('apply'), + ...applyItems, + new MenuSeparator('texture_slot'), + { + name: translate('menu.texture_slot.preview'), + icon: 'visibility', + children: (slot: Texture) => + getSlotTextures(slot).map(texture => ({ + name: texture.name, + icon: texture === getSlotPreviewTexture(slot) ? checked : unchecked, + click: () => previewSlotTexture(slot, texture.uuid), + })), + }, + { + name: translate('menu.texture_slot.properties'), + icon: 'tune', + click: (slot: Texture) => openTextureSlotDialog(slot), + }, + new MenuSeparator('manage'), + 'duplicate', + 'delete', + ]) + + return function (this: Texture, event: MouseEvent) { + if (!isTextureSlot(this)) return original.call(this, event) + if (this !== Texture.selected) this.select() + Prop.active_panel = 'textures' + slotMenu.open(event, this) + } + }, +}) + +// Double-clicking a slot opens its own dialog instead of the texture properties. +registerPropertyOverridePatch({ + id: 'animated_java:texture/slot-properties-dialog', + target: Texture.prototype as Texture & { propertiesDialog(...args: any[]): unknown }, + key: 'propertiesDialog', + condition: () => activeProjectIsBlueprintFormat(), + get: original => { + return function (this: Texture, ...args: any[]) { + if (isTextureSlot(this)) return openTextureSlotDialog(this) + return original.apply(this, args) + } + }, +}) + +// Painting a slot, from the Textures panel or the UV editor, paints the texture it shows. +registerPropertyOverridePatch({ + id: 'animated_java:painter/texture-slot-target', + target: Painter as typeof Painter & { getTextureToEdit(texture: Texture): Texture }, + key: 'getTextureToEdit', + condition: () => activeProjectIsBlueprintFormat(), + get: original => { + return function (this: typeof Painter, texture: Texture) { + if (isTextureSlot(texture)) texture = getSlotPreviewTexture(texture) ?? texture + return original.call(this, texture) + } + }, +}) + +// Deleting a slot moves its faces to the slot's default texture, in the same undo step. +registerPatch({ + id: 'animated_java:texture-slot-delete', + + apply: () => { + const handler = SharedActions.add('delete', { + subject: 'texture', + priority: 1, + condition: () => + activeProjectIsBlueprintFormat() && + Prop.active_panel === 'textures' && + Texture.all.some(t => (t.selected || t.multi_selected) && isTextureSlot(t)), + run() { + const textures = Texture.all.filter(t => t.selected || t.multi_selected) + const slots = textures.filter(isTextureSlot) + const uuids = new Set(slots.map(slot => slot.uuid)) + const cubes = Cube.all.filter(cube => + Object.values(cube.faces).some(face => uuids.has(face.texture as string)) + ) + + Undo.initEdit({ textures, elements: cubes, uv_only: true }) + for (const slot of slots) { + const fallback = getSlotDefaultTexture(slot)?.uuid ?? false + for (const cube of cubes) { + for (const face of Object.values(cube.faces)) { + if (face.texture === slot.uuid) face.texture = fallback + } + } + } + for (const texture of textures) texture.remove(true) + Canvas.updateAllFaces() + TextureAnimator.updateButton() + UVEditor.vue.updateTexture() + BARS.updateConditions() + Undo.finishEdit('Remove texture', { textures: [], elements: cubes, uv_only: true }) + }, + }) + return { handler } + }, + + revert: ({ handler }) => { + handler.delete() + }, +}) + +// Keeps each slot's icon in step with the texture it shows. +registerProjectPatch({ + id: 'animated_java:texture-slot-images', + + condition: ({ project }) => project.format.id === BLUEPRINT_FORMAT_ID, + + apply() { + requestAnimationFrame(updateAllSlotImages) + const refresh = () => requestAnimationFrame(updateAllSlotImages) + const events: Array = [ + 'finish_edit', + 'undo', + 'redo', + 'add_texture', + 'change_texture_path', + ] + for (const event of events) Blockbench.on(event, refresh) + return { events, refresh } + }, + + revert({ events, refresh }) { + for (const event of events) Blockbench.removeListener(event, refresh) + }, +}) diff --git a/src/mods/variantPreviewCubeFaceMod.ts b/src/mods/variantPreviewCubeFaceMod.ts index 925dab13..9814305c 100644 --- a/src/mods/variantPreviewCubeFaceMod.ts +++ b/src/mods/variantPreviewCubeFaceMod.ts @@ -1,13 +1,7 @@ import { registerPatch } from 'blockbench-patch-manager' +import { getPreviewSlotTexture } from '../animationPreview' import { activeProjectIsBlueprintFormat } from '../formats/blueprint' -import { Variant } from '../variants' - -declare global { - // @ts-expect-error - Broken BB types - interface CubeFace { - lastVariant: Variant | undefined - } -} +import { getTextureSlot, shouldResolveSlots } from '../textureSlots' registerPatch({ id: `animated_java:variant-preview-cube-face`, @@ -15,28 +9,20 @@ registerPatch({ apply: () => { const original = CubeFace.prototype.getTexture + // A face using a Texture Slot shows (and paints) the texture the slot currently shows. CubeFace.prototype.getTexture = function (this: CubeFace) { - if (activeProjectIsBlueprintFormat() && this.texture) { - const variant = Variant.selected - if ( - variant && - this.cube.parent instanceof Group && - !variant.excludedNodes.find( - v => v.value === (this.cube.parent as Group).uuid - ) && - variant.textureMap.has(this.texture) - ) { - this.lastVariant = variant - return variant.textureMap.getMappedTexture(this.texture) - } else if ( - Mode.selected.id === Modes.options.animate.id && - this.lastVariant && - !variant?.isDefault - ) { - return this.lastVariant.textureMap.getMappedTexture(this.texture) + if ( + activeProjectIsBlueprintFormat() && + typeof this.texture === 'string' && + shouldResolveSlots() + ) { + const slot = getTextureSlot(this.texture) + if (slot) { + const bone = this.cube.parent instanceof Group ? this.cube.parent : undefined + const texture = getPreviewSlotTexture(slot, bone) + if (texture) return texture } } - this.lastVariant = undefined return original.call(this) } diff --git a/src/outliner/interaction.ts b/src/outliner/interaction.ts index a525a521..19fd8f1e 100644 --- a/src/outliner/interaction.ts +++ b/src/outliner/interaction.ts @@ -329,7 +329,7 @@ class InteractionAnimator extends BoneAnimator { return !!this.element?.mesh } - displayRotation(arr: ArrayVector3 | ArrayVector4, multiplier = 1) { + displayRotation(_arr: ArrayVector3 | ArrayVector4, _multiplier = 1) { const bone = this.getElement().mesh if (bone.parent) { diff --git a/src/outliner/resizableOutlinerElement.ts b/src/outliner/resizableOutlinerElement.ts index 0a5ca7e1..8adf283e 100644 --- a/src/outliner/resizableOutlinerElement.ts +++ b/src/outliner/resizableOutlinerElement.ts @@ -8,6 +8,8 @@ export class ResizableOutlinerElement extends OutlinerElement { name: string position: ArrayVector3 rotation: ArrayVector3 + /** Local offset of the rendered geometry from {@link position}, used as the pivot point. */ + pivotOffset: ArrayVector3 scale: ArrayVector3 visibility: boolean color!: number @@ -41,6 +43,7 @@ export class ResizableOutlinerElement extends OutlinerElement { this.name ??= 'resizable_outliner_element' this.position ??= [0, 0, 0] this.rotation ??= [0, 0, 0] + this.pivotOffset ??= [0, 0, 0] this.scale ??= [1, 1, 1] this.visibility ??= true } @@ -129,6 +132,86 @@ export class ResizableOutlinerElement extends OutlinerElement { save.type = this.type return save } + + /** + * Moves the pivot to `origin` without moving the rendered geometry. + * Divides by `scale` because `pivotOffset` lives inside the scaled mesh. + */ + transferOrigin(origin: ArrayVector3) { + if (!this.mesh) return this + const q = Reusable.quat1.copy(this.mesh.quaternion).invert() + const shift = Reusable.vec1 + .set( + this.position[0] - origin[0], + this.position[1] - origin[1], + this.position[2] - origin[2] + ) + .applyQuaternion(q) + .divide(Reusable.vec2.fromArray(this.scale)) + + this.pivotOffset[0] += shift.x + this.pivotOffset[1] += shift.y + this.pivotOffset[2] += shift.z + this.position.V3_set(origin) + + this.preview_controller.updateTransform(this) + this.preview_controller.updateGeometry?.(this) + return this + } +} + +/** + * World-space center of an element's rendered geometry, rather than its pivot, + * so "Center Pivot" works. + */ +export function getPivotedGeometryWorldCenter(el: ResizableOutlinerElement): THREE.Vector3 { + return new THREE.Box3().setFromObject(el.mesh).getCenter(new THREE.Vector3()) +} + +/** + * Records a freshly loaded model's un-offset position for {@link applyPivotOffset}. + * Call right after adding the model to `el.mesh`. + */ +export function resetPivotOffsetTracking( + hitboxGeometry: THREE.BufferGeometry, + modelMesh: THREE.Object3D, + outline: THREE.Object3D +) { + modelMesh.userData.pivotBaseline = modelMesh.position.toArray() + outline.userData.pivotBaseline = outline.position.toArray() + hitboxGeometry.userData.pivotOffsetApplied = [0, 0, 0] +} + +/** + * Applies `el.pivotOffset` to a loaded model's mesh, outline and hitbox. + * Idempotent, so it's safe to call every frame. + * Does nothing until {@link resetPivotOffsetTracking} has run. + */ +export function applyPivotOffset( + el: ResizableOutlinerElement, + hitboxGeometry: THREE.BufferGeometry, + modelMesh: THREE.Object3D, + outline: THREE.Object3D +) { + const applied = hitboxGeometry.userData.pivotOffsetApplied as ArrayVector3 | undefined + const modelBaseline = modelMesh.userData.pivotBaseline as ArrayVector3 | undefined + const outlineBaseline = outline.userData.pivotBaseline as ArrayVector3 | undefined + if (!applied || !modelBaseline || !outlineBaseline) return + + const [x, y, z] = el.pivotOffset + modelMesh.position.set(modelBaseline[0] + x, modelBaseline[1] + y, modelBaseline[2] + z) + outline.position.set(outlineBaseline[0] + x, outlineBaseline[1] + y, outlineBaseline[2] + z) + + const dx = x - applied[0] + const dy = y - applied[1] + const dz = z - applied[2] + if (dx || dy || dz) { + hitboxGeometry.translate(dx, dy, dz) + hitboxGeometry.userData.pivotOffsetApplied = [x, y, z] + // `translate` doesn't clear cached bounds + hitboxGeometry.boundingBox = null + hitboxGeometry.boundingSphere = null + } } new Property(ResizableOutlinerElement, 'string', 'name', { default: 'resizable_outliner_element' }) new Property(ResizableOutlinerElement, 'vector', 'position', { default: [0, 0, 0] }) diff --git a/src/outliner/textDisplay.ts b/src/outliner/textDisplay.ts index 5a1b6e5a..6f324d7a 100644 --- a/src/outliner/textDisplay.ts +++ b/src/outliner/textDisplay.ts @@ -3,12 +3,17 @@ import { TextComponent, TextComponentParser, type TextElement } from 'book-and-q import { observable } from 'svelte-observable-store' import { PACKAGE } from '../constants' import { activeProjectIsBlueprintFormat } from '../formats/blueprint' -import { MinecraftFont } from '../systems/minecraft/fontManager' +import { generateTextDisplayMesh, type TextDisplayMesh } from '../systems/minecraft/fontRenderer' import { type IDisplayEntityConfigs } from '../systems/rigRenderer' import EVENTS from '../util/events' import { localize as translate } from '../util/lang' import { DeepClonedObjectProperty, fixClassPropertyInheritance } from '../util/property' -import { ResizableOutlinerElement } from './resizableOutlinerElement' +import { + applyPivotOffset, + getPivotedGeometryWorldCenter, + ResizableOutlinerElement, + resetPivotOffsetTracking, +} from './resizableOutlinerElement' import { sanitizeOutlinerElementName } from './util' interface TextDisplayOptions { @@ -16,6 +21,7 @@ interface TextDisplayOptions { text?: string position?: ArrayVector3 rotation?: ArrayVector3 + pivotOffset?: ArrayVector3 scale?: ArrayVector3 lineLength?: number backgroundColor?: string @@ -33,6 +39,11 @@ export class TextDisplay extends ResizableOutlinerElement { static all: TextDisplay[] = [] static invalidJsonText: TextElement = { text: 'Invalid JSON Text!', color: 'red' } + static behavior = { + ...ResizableOutlinerElement.behavior, + has_pivot: true, + } + type = TextDisplay.type icon = TextDisplay.icon needsUniqueName = true @@ -48,7 +59,11 @@ export class TextDisplay extends ResizableOutlinerElement { needsMeshUpdate = false - private __pendingMeshUpdate?: ReturnType + private __pendingMeshUpdate?: Promise + /** Cached parse of `this.text`, keyed by `text \0 minecraftVersion`, so + * option-only mesh rebuilds don't re-parse an unchanged (and possibly huge) + * component. `component` is undefined when the text failed to parse. */ + private __parsed?: { key: string; component?: TextComponent; error?: string } private __text = observable('Hello World!') private __lineWidth = TextDisplay.properties.lineWidth.default as number private __backgroundColor = TextDisplay.properties.backgroundColor.default as string @@ -73,6 +88,7 @@ export class TextDisplay extends ResizableOutlinerElement { static forceUpdateAll() { for (const textDisplay of TextDisplay.all) { + textDisplay.needsMeshUpdate = true textDisplay.preview_controller.updateAll(textDisplay) } } @@ -82,6 +98,10 @@ export class TextDisplay extends ResizableOutlinerElement { return this.name } + getWorldCenter(): THREE.Vector3 { + return getPivotedGeometryWorldCenter(this) + } + get text() { if (this.__text === undefined) return TextDisplay.properties.text.default as string return this.__text.get() @@ -194,7 +214,7 @@ export class TextDisplay extends ResizableOutlinerElement { return this } - unselect(unselectParent?: boolean) { + unselect(_unselectParent?: boolean) { if (!this.selected) return this if ( Animator.open && @@ -212,49 +232,52 @@ export class TextDisplay extends ResizableOutlinerElement { } updateTextMesh() { - let result: TextComponent | undefined - try { - const parser = new TextComponentParser({ - minecraftVersion: Project!.animated_java.target_minecraft_version, - }) - parser.enabledFeatures &= ~( - TextComponentParser.FEATURES.CLICK_EVENTS | - TextComponentParser.FEATURES.HOVER_EVENTS - ) - result = new TextComponent(parser.parse(this.text)) - this.textError.set('') - } catch (e: any) { - console.error(e) - if (e.name === 'SyntaxPointerError') { - this.textError.set(e.getOriginErrorMessage()) - } else { - this.textError.set(e.message as string) + const parseKey = this.text + '\0' + Project!.animated_java.target_minecraft_version + if (this.__parsed?.key !== parseKey) { + this.__parsed = { key: parseKey } + try { + const parser = new TextComponentParser({ + minecraftVersion: Project!.animated_java.target_minecraft_version, + }) + parser.enabledFeatures &= ~( + TextComponentParser.FEATURES.CLICK_EVENTS | + TextComponentParser.FEATURES.HOVER_EVENTS + ) + this.__parsed.component = new TextComponent(parser.parse(this.text)) + } catch (e: any) { + console.error(e) + this.__parsed.error = + e.name === 'SyntaxPointerError' + ? e.getOriginErrorMessage() + : (e.message as string) } } - result ??= new TextComponent({ text: 'Invalid JSON Text!', color: 'red' }) - void this.renderTextMesh(result).then(({ mesh, hitbox, outline }) => { + this.textError.set(this.__parsed.error ?? '') + + const jsonText = + this.__parsed.component ?? + new TextComponent({ text: 'Invalid JSON Text!', color: 'red' }) + const cacheKey = this.__parsed.component ? this.text : '\0invalid' + void this.renderTextMesh(jsonText, cacheKey).then(({ mesh, hitbox, outline }) => { this.applyTextMesh(mesh, hitbox, outline) }) } - private renderTextMesh(jsonText: TextComponent) { - const promise = MinecraftFont.getById('minecraft:default') - .then(font => { - return font.generateTextDisplayMesh({ - jsonText, - maxLineWidth: this.lineWidth, - backgroundColor: tinycolor(this.backgroundColor), - shadow: this.shadow, - alignment: this.align, - }) - }) - .then(result => { - if (this.__pendingMeshUpdate === promise) { - this.__pendingMeshUpdate = undefined - return result - } - return this.__pendingMeshUpdate - }) as ReturnType + private renderTextMesh(jsonText: TextComponent, cacheKey: string) { + const promise = generateTextDisplayMesh({ + jsonText, + cacheKey, + maxLineWidth: this.lineWidth, + backgroundColor: tinycolor(this.backgroundColor), + shadow: this.shadow, + alignment: this.align, + }).then(result => { + if (this.__pendingMeshUpdate === promise) { + this.__pendingMeshUpdate = undefined + return result + } + return this.__pendingMeshUpdate + }) as Promise this.__pendingMeshUpdate = promise return promise @@ -278,7 +301,8 @@ export class TextDisplay extends ResizableOutlinerElement { delete mesh.sprite mesh.name = this.uuid mesh.material = Canvas.transparentMaterial - mesh.geometry = hitbox + // The background mesh shares `hitbox`, and pivot offsets translate it in place + mesh.geometry = hitbox.clone() mesh.add(text) outline.name = this.uuid + '_outline' @@ -286,6 +310,7 @@ export class TextDisplay extends ResizableOutlinerElement { mesh.outline = outline mesh.add(outline) mesh.visible = this.visibility + resetPivotOffsetTracking(mesh.geometry, text, outline) // Dispatch view update without actually doing anything Canvas.updateView({ elements: [], element_aspects: {} }) @@ -344,6 +369,9 @@ export const PREVIEW_CONTROLLER: NodePreviewController = new NodePreviewControll updateTransform(el: TextDisplay) { ResizableOutlinerElement.prototype.preview_controller.updateTransform(el) + if (el.mesh.outline) { + applyPivotOffset(el, el.mesh.geometry, el.mesh.children[0], el.mesh.outline) + } }, }) @@ -420,12 +448,12 @@ class TextDisplayAnimator extends BoneAnimator { new THREE.Quaternion().fromArray(arr), 'ZYX' ) - bone.rotation.x -= addedRotation.x * multiplier - bone.rotation.y -= addedRotation.y * multiplier + bone.rotation.x += addedRotation.x * multiplier + bone.rotation.y += addedRotation.y * multiplier bone.rotation.z += addedRotation.z * multiplier } else { - bone.rotation.x -= Math.degToRad(arr[0]) * multiplier - bone.rotation.y -= Math.degToRad(arr[1]) * multiplier + bone.rotation.x += Math.degToRad(arr[0]) * multiplier + bone.rotation.y += Math.degToRad(arr[1]) * multiplier bone.rotation.z += Math.degToRad(arr[2]) * multiplier } } @@ -444,7 +472,7 @@ class TextDisplayAnimator extends BoneAnimator { bone.position.copy(bone.fix_position as THREE.Vector3) } if (arr) { - bone.position.x -= arr[0] * multiplier + bone.position.x += arr[0] * multiplier bone.position.y += arr[1] * multiplier bone.position.z += arr[2] * multiplier } diff --git a/src/outliner/vanillaBlockDisplay.ts b/src/outliner/vanillaBlockDisplay.ts index a39744d3..053518fc 100644 --- a/src/outliner/vanillaBlockDisplay.ts +++ b/src/outliner/vanillaBlockDisplay.ts @@ -9,7 +9,12 @@ import EVENTS from '../util/events' import { localize as translate } from '../util/lang' import { validateBlock } from '../util/minecraftUtil' import { DeepClonedObjectProperty, fixClassPropertyInheritance } from '../util/property' -import { ResizableOutlinerElement } from './resizableOutlinerElement' +import { + applyPivotOffset, + getPivotedGeometryWorldCenter, + ResizableOutlinerElement, + resetPivotOffsetTracking, +} from './resizableOutlinerElement' import { sanitizeOutlinerElementName } from './util' const ERROR_OUTLINE_MATERIAL = Canvas.outlineMaterial.clone() @@ -20,6 +25,7 @@ interface VanillaBlockDisplayOptions { block?: string position?: ArrayVector3 rotation?: ArrayVector3 + pivotOffset?: ArrayVector3 scale?: ArrayVector3 visibility?: boolean } @@ -31,6 +37,11 @@ export class VanillaBlockDisplay extends ResizableOutlinerElement { static selected: VanillaBlockDisplay[] = [] static all: VanillaBlockDisplay[] = [] + static behavior = { + ...ResizableOutlinerElement.behavior, + has_pivot: true, + } + type = VanillaBlockDisplay.type icon = VanillaBlockDisplay.icon needsUniqueName = true @@ -89,6 +100,10 @@ export class VanillaBlockDisplay extends ResizableOutlinerElement { return this.name } + getWorldCenter(): THREE.Vector3 { + return getPivotedGeometryWorldCenter(this) + } + getUndoCopy() { const copy = {} as VanillaBlockDisplayOptions & { uuid: string; type: string } @@ -132,7 +147,7 @@ export class VanillaBlockDisplay extends ResizableOutlinerElement { return this } - unselect(unselectParent?: boolean) { + unselect(_unselectParent?: boolean) { if (!this.selected) return this if ( Animator.open && @@ -175,6 +190,7 @@ export class VanillaBlockDisplay extends ResizableOutlinerElement { mesh.outline = blockModel.outline mesh.add(blockModel.mesh) mesh.add(blockModel.outline) + resetPivotOffsetTracking(mesh.geometry, blockModel.mesh, blockModel.outline) this.preview_controller.updateHighlight(this) this.preview_controller.updateTransform(this) @@ -248,6 +264,9 @@ export const PREVIEW_CONTROLLER: NodePreviewController = new NodePreviewControll }, updateTransform(el: VanillaBlockDisplay) { ResizableOutlinerElement.prototype.preview_controller.updateTransform(el) + if (el.mesh.outline) { + applyPivotOffset(el, el.mesh.geometry, el.mesh.children[0], el.mesh.outline) + } }, updateHighlight(el: VanillaBlockDisplay, force?: boolean | VanillaBlockDisplay) { if (!activeProjectIsBlueprintFormat() || !el?.mesh) return @@ -342,12 +361,12 @@ class VanillaBlockDisplayAnimator extends BoneAnimator { new THREE.Quaternion().fromArray(arr), 'ZYX' ) - bone.rotation.x -= addedRotation.x * multiplier - bone.rotation.y -= addedRotation.y * multiplier + bone.rotation.x += addedRotation.x * multiplier + bone.rotation.y += addedRotation.y * multiplier bone.rotation.z += addedRotation.z * multiplier } else { - bone.rotation.x -= Math.degToRad(arr[0]) * multiplier - bone.rotation.y -= Math.degToRad(arr[1]) * multiplier + bone.rotation.x += Math.degToRad(arr[0]) * multiplier + bone.rotation.y += Math.degToRad(arr[1]) * multiplier bone.rotation.z += Math.degToRad(arr[2]) * multiplier } } @@ -366,7 +385,7 @@ class VanillaBlockDisplayAnimator extends BoneAnimator { bone.position.copy(bone.fix_position as THREE.Vector3) } if (arr) { - bone.position.x -= arr[0] * multiplier + bone.position.x += arr[0] * multiplier bone.position.y += arr[1] * multiplier bone.position.z += arr[2] * multiplier } diff --git a/src/outliner/vanillaItemDisplay.ts b/src/outliner/vanillaItemDisplay.ts index 5bb4d7f5..062e0439 100644 --- a/src/outliner/vanillaItemDisplay.ts +++ b/src/outliner/vanillaItemDisplay.ts @@ -1,6 +1,7 @@ import { registerDeletableHandlerPatch, registerPatch } from 'blockbench-patch-manager' import { observable } from 'svelte-observable-store' import { PACKAGE } from '../constants' +import { getPreviewVariant } from '../animationPreview' import { activeProjectIsBlueprintFormat } from '../formats/blueprint/index' import { applyEnchantmentGlintToMesh } from '../shaders/enchantmentGlint' import { getItemModel } from '../systems/minecraft/itemModelManager' @@ -9,8 +10,12 @@ import EVENTS from '../util/events' import { localize as translate } from '../util/lang' import { validateItem } from '../util/minecraftUtil' import { DeepClonedObjectProperty, fixClassPropertyInheritance } from '../util/property' -import { Variant } from '../variants' -import { ResizableOutlinerElement } from './resizableOutlinerElement' +import { + applyPivotOffset, + getPivotedGeometryWorldCenter, + ResizableOutlinerElement, + resetPivotOffsetTracking, +} from './resizableOutlinerElement' import { sanitizeOutlinerElementName } from './util' export type ItemDisplayMode = @@ -30,6 +35,7 @@ interface VanillaItemDisplayOptions { itemDisplay?: ItemDisplayMode position?: ArrayVector3 rotation?: ArrayVector3 + pivotOffset?: ArrayVector3 scale?: ArrayVector3 visibility?: boolean } @@ -41,6 +47,11 @@ export class VanillaItemDisplay extends ResizableOutlinerElement { static selected: VanillaItemDisplay[] = [] static all: VanillaItemDisplay[] = [] + static behavior = { + ...ResizableOutlinerElement.behavior, + has_pivot: true, + } + type = VanillaItemDisplay.type icon = VanillaItemDisplay.icon needsUniqueName = true @@ -104,6 +115,10 @@ export class VanillaItemDisplay extends ResizableOutlinerElement { return this.name } + getWorldCenter(): THREE.Vector3 { + return getPivotedGeometryWorldCenter(this) + } + getUndoCopy() { const copy = {} as VanillaItemDisplayOptions & { uuid: string; type: string } @@ -147,7 +162,7 @@ export class VanillaItemDisplay extends ResizableOutlinerElement { return this } - unselect(unselectParent?: boolean) { + unselect(_unselectParent?: boolean) { if (!this.selected) return this if ( Animator.open && @@ -226,9 +241,11 @@ export const PREVIEW_CONTROLLER: NodePreviewController = new NodePreviewControll mesh.add(result.outline) mesh.outline = result.outline mesh.outline.visible = el.selected + resetPivotOffsetTracking(mesh.geometry, result.mesh, result.outline) - if (Variant.selected) { - const config = Variant.selected.getDisplayEntityConfig(el) + const variant = getPreviewVariant(el) + if (variant) { + const config = variant.getDisplayEntityConfig(el) if (config.enchanted) { for (const child of result.mesh.children) { if (!(child instanceof THREE.Mesh)) continue @@ -249,6 +266,9 @@ export const PREVIEW_CONTROLLER: NodePreviewController = new NodePreviewControll }, updateTransform(el: VanillaItemDisplay) { ResizableOutlinerElement.prototype.preview_controller.updateTransform(el) + if (el.mesh.outline) { + applyPivotOffset(el, el.mesh.geometry, el.mesh.children[0], el.mesh.outline) + } }, updateHighlight(el: VanillaItemDisplay, force?: boolean | VanillaItemDisplay) { if (!activeProjectIsBlueprintFormat() || !el?.mesh) return @@ -343,12 +363,12 @@ class VanillaItemDisplayAnimator extends BoneAnimator { new THREE.Quaternion().fromArray(arr), 'ZYX' ) - bone.rotation.x -= addedRotation.x * multiplier - bone.rotation.y -= addedRotation.y * multiplier + bone.rotation.x += addedRotation.x * multiplier + bone.rotation.y += addedRotation.y * multiplier bone.rotation.z += addedRotation.z * multiplier } else { - bone.rotation.x += Math.degToRad(-arr[0]) * multiplier - bone.rotation.y += Math.degToRad(-arr[1]) * multiplier + bone.rotation.x += Math.degToRad(arr[0]) * multiplier + bone.rotation.y += Math.degToRad(arr[1]) * multiplier bone.rotation.z += Math.degToRad(arr[2]) * multiplier } } @@ -367,7 +387,7 @@ class VanillaItemDisplayAnimator extends BoneAnimator { bone.position.copy(bone.fix_position as THREE.Vector3) } if (arr) { - bone.position.x -= arr[0] * multiplier + bone.position.x += arr[0] * multiplier bone.position.y += arr[1] * multiplier bone.position.z += arr[2] * multiplier } diff --git a/src/panels/customKeyframe/commandsKeyframe.svelte b/src/panels/customKeyframe/commandsKeyframe.svelte index 29575698..e4c1f407 100644 --- a/src/panels/customKeyframe/commandsKeyframe.svelte +++ b/src/panels/customKeyframe/commandsKeyframe.svelte @@ -1,6 +1,7 @@ -
+
-
+
-{#if keyframe?.repeat} -
+{#if repeat} +