@missing-elements/h5p-offline-player 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +273 -0
- package/dist/VERSION +1 -0
- package/dist/frame-assets/MANIFEST.json +4 -0
- package/dist/frame-assets/fonts/h5p-core-30.woff2 +0 -0
- package/dist/frame-assets/fonts/h5p-hub-publish.woff +0 -0
- package/dist/frame-assets/fonts/h5p-hub-publish.woff2 +0 -0
- package/dist/frame-assets/fonts/h5p-theme.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/LICENSE.txt +92 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-600.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-600italic.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-italic.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/OFL.txt +88 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-600.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-600italic.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-700.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-700italic.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-italic.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-regular.woff2 +0 -0
- package/dist/frame-assets/frame.bundle.js +1 -0
- package/dist/frame-assets/images/h5p.svg +16 -0
- package/dist/frame-assets/images/throbber.gif +0 -0
- package/dist/frame-assets/main.bundle.js +2 -0
- package/dist/frame-assets/styles/h5p-fonts.css +103 -0
- package/dist/frame-assets/styles/h5p.css +1643 -0
- package/dist/h5p-player.js +1780 -0
- package/dist/h5p-sw-mount.js +88 -0
- package/dist/h5p-sw.js +88 -0
- package/package.json +81 -0
- package/types/h5p-offline-player.d.ts +154 -0
- package/types/jobs/chunk-writer.d.ts +16 -0
- package/types/jobs/jobs-worker.d.ts +1 -0
- package/types/node/tsconfig.node.tsbuildinfo +1 -0
- package/types/node/vite.config.d.ts +6 -0
- package/types/node/vite.demo.config.d.ts +2 -0
- package/types/node/vite.plugins.d.ts +19 -0
- package/types/shared/chunk-store.d.ts +104 -0
- package/types/shared/constants.d.ts +67 -0
- package/types/shared/entry-names.d.ts +29 -0
- package/types/shared/eviction.d.ts +16 -0
- package/types/shared/forward-index.d.ts +85 -0
- package/types/shared/idb.d.ts +9 -0
- package/types/shared/locks.d.ts +14 -0
- package/types/shared/mime.d.ts +7 -0
- package/types/shared/mp4.d.ts +41 -0
- package/types/shared/pkg-id.d.ts +21 -0
- package/types/shared/protocol.d.ts +232 -0
- package/types/shared/range.d.ts +16 -0
- package/types/shared/source.d.ts +57 -0
- package/types/shared/stream-utils.d.ts +7 -0
- package/types/sw/frame-document.d.ts +19 -0
- package/types/sw/mount.d.ts +17 -0
- package/types/sw/package-reader.d.ts +242 -0
- package/types/sw/routes.d.ts +26 -0
- package/types/sw/stream-utils.d.ts +9 -0
- package/types/sw/sw-entry.d.ts +1 -0
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@missing-elements/h5p-offline-player",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Browser-only H5P player web component. Plays arbitrary .h5p archives from a URL or a local file, with no server-side extraction.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/missing-elements/h5p-offline-player.git"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/missing-elements/h5p-offline-player#readme",
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/missing-elements/h5p-offline-player/issues"
|
|
13
|
+
},
|
|
14
|
+
"publishConfig": {
|
|
15
|
+
"access": "public"
|
|
16
|
+
},
|
|
17
|
+
"type": "module",
|
|
18
|
+
"main": "./dist/h5p-player.js",
|
|
19
|
+
"module": "./dist/h5p-player.js",
|
|
20
|
+
"types": "./types/h5p-offline-player.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./types/h5p-offline-player.d.ts",
|
|
24
|
+
"default": "./dist/h5p-player.js"
|
|
25
|
+
},
|
|
26
|
+
"./sw": {
|
|
27
|
+
"types": "./types/sw/mount.d.ts",
|
|
28
|
+
"default": "./dist/h5p-sw-mount.js"
|
|
29
|
+
},
|
|
30
|
+
"./dist/*": "./dist/*"
|
|
31
|
+
},
|
|
32
|
+
"files": [
|
|
33
|
+
"dist",
|
|
34
|
+
"types"
|
|
35
|
+
],
|
|
36
|
+
"keywords": [
|
|
37
|
+
"h5p",
|
|
38
|
+
"h5p-player",
|
|
39
|
+
"web-component",
|
|
40
|
+
"custom-element",
|
|
41
|
+
"service-worker",
|
|
42
|
+
"offline",
|
|
43
|
+
"zip",
|
|
44
|
+
"elearning"
|
|
45
|
+
],
|
|
46
|
+
"scripts": {
|
|
47
|
+
"sync:assets": "node scripts/sync-h5p-assets.mjs",
|
|
48
|
+
"fixtures": "node scripts/build-fixtures.mjs",
|
|
49
|
+
"normalize": "node scripts/normalize-h5p.mjs",
|
|
50
|
+
"demo:content": "node scripts/build-demo-content.mjs",
|
|
51
|
+
"demo:og": "node scripts/build-og-image.mjs",
|
|
52
|
+
"prepare:dev": "npm run sync:assets && npm run fixtures",
|
|
53
|
+
"dev": "npm run prepare:dev && vite",
|
|
54
|
+
"build": "npm run sync:assets && tsc -b && vite build && node scripts/build-workers.mjs && node scripts/copy-frame-assets.mjs",
|
|
55
|
+
"build:demo": "npm run sync:assets && node scripts/build-demo.mjs",
|
|
56
|
+
"preview:demo": "vite preview --config vite.demo.config.ts",
|
|
57
|
+
"test": "npm run prepare:dev && vitest run",
|
|
58
|
+
"test:unit": "vitest run --project unit",
|
|
59
|
+
"test:browser": "npm run prepare:dev && vitest run --project browser",
|
|
60
|
+
"test:watch": "npm run prepare:dev && vitest",
|
|
61
|
+
"typecheck": "tsc -b --force && tsc -p tsconfig.test.json",
|
|
62
|
+
"prepublishOnly": "npm run typecheck && npm run test:unit && npm run build"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@zip.js/zip.js": "^2.17.0",
|
|
66
|
+
"h5p-standalone": "^3.8.2"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@types/node": "^22.13.0",
|
|
70
|
+
"@vitest/browser": "^5.0.1",
|
|
71
|
+
"@vitest/browser-playwright": "^5.0.1",
|
|
72
|
+
"esbuild": "^0.25.0",
|
|
73
|
+
"playwright": "^1.50.0",
|
|
74
|
+
"typescript": "^5.7.3",
|
|
75
|
+
"vite": "^6.0.11",
|
|
76
|
+
"vitest": "^5.0.1"
|
|
77
|
+
},
|
|
78
|
+
"engines": {
|
|
79
|
+
"node": ">=20"
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { type ErrorCode, type MissingLibraries } from './shared/protocol';
|
|
2
|
+
export type PlayerState = 'idle' | 'probing' | 'downloading' | 'indexing' | 'ready' | 'error';
|
|
3
|
+
export interface PlayerErrorDetail {
|
|
4
|
+
code: ErrorCode;
|
|
5
|
+
message: string;
|
|
6
|
+
/** Present when a package declared libraries it does not carry. See the `libraries` attribute. */
|
|
7
|
+
missingLibraries?: MissingLibraries;
|
|
8
|
+
}
|
|
9
|
+
export interface PlayerProgressDetail {
|
|
10
|
+
/** 0–1, or `null` while the total is unknown (a host that exposes no length). */
|
|
11
|
+
fraction: number | null;
|
|
12
|
+
loaded: number;
|
|
13
|
+
total: number | null;
|
|
14
|
+
phase: 'download' | 'libraries' | 'extract';
|
|
15
|
+
entry?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare class H5PPlayerElement extends HTMLElement {
|
|
18
|
+
static get observedAttributes(): string[];
|
|
19
|
+
private iframe;
|
|
20
|
+
private jobs;
|
|
21
|
+
private jobsUrl;
|
|
22
|
+
private routes;
|
|
23
|
+
private registration;
|
|
24
|
+
private currentFile;
|
|
25
|
+
private currentSource;
|
|
26
|
+
private load;
|
|
27
|
+
private connected;
|
|
28
|
+
private internalState;
|
|
29
|
+
private internalPkgId;
|
|
30
|
+
/** Large deflated entries, in archive order, waiting to be pulled before the content asks. */
|
|
31
|
+
private prefetchQueue;
|
|
32
|
+
private prefetching;
|
|
33
|
+
constructor();
|
|
34
|
+
get src(): string | null;
|
|
35
|
+
set src(value: string | null);
|
|
36
|
+
/**
|
|
37
|
+
* Whether to pull large deflated media before the content asks for it. `none` (the default)
|
|
38
|
+
* fetches an entry when the runtime requests it; `auto` starts once the content is up.
|
|
39
|
+
*
|
|
40
|
+
* Off by default because `auto` spends a learner's bandwidth on a video they may never reach —
|
|
41
|
+
* the host's call, not the element's. It is worth making for a package whose media cannot be
|
|
42
|
+
* streamed: see `PrefetchEntry`.
|
|
43
|
+
*/
|
|
44
|
+
get preload(): 'none' | 'auto';
|
|
45
|
+
set preload(value: 'none' | 'auto');
|
|
46
|
+
/** A `File` from a picker. Setting it loads, and takes precedence over `src`. */
|
|
47
|
+
get file(): File | null;
|
|
48
|
+
set file(value: File | null);
|
|
49
|
+
get state(): PlayerState;
|
|
50
|
+
get pkgId(): string | null;
|
|
51
|
+
/** The resolved Service Worker scope the routes live under. Read-only, `null` until registered. */
|
|
52
|
+
get scope(): string | null;
|
|
53
|
+
connectedCallback(): void;
|
|
54
|
+
disconnectedCallback(): void;
|
|
55
|
+
attributeChangedCallback(name: string, previous: string | null, next: string | null): void;
|
|
56
|
+
private abortLoad;
|
|
57
|
+
/**
|
|
58
|
+
* Holds a shared lock on the package for as long as it is loaded here. Eviction — in this tab
|
|
59
|
+
* or any other — never picks a package with a lock under its prefix, so a learner mid-video is
|
|
60
|
+
* safe from a quota squeeze caused by a package loading somewhere else. Shared, so two tabs on
|
|
61
|
+
* the same package both hold it. Released when the load is aborted, which a new `src`,
|
|
62
|
+
* `clear()` and disconnection all do.
|
|
63
|
+
*/
|
|
64
|
+
private holdPackage;
|
|
65
|
+
/** Empties the player without an error: what removing `src`, or setting `file` to null, means. */
|
|
66
|
+
private clear;
|
|
67
|
+
private startLoad;
|
|
68
|
+
/**
|
|
69
|
+
* Downloads a package from a host that ignores `Range`, and boots as soon as the worker's
|
|
70
|
+
* forward index says the runtime has what it needs — for a libraries-first export, long before
|
|
71
|
+
* the media has finished. Each progress report is a chance to ask; a "not yet" is not an error.
|
|
72
|
+
* The final index after the download is the real one, from the central directory: it swaps the
|
|
73
|
+
* worker onto it, and is where a package missing libraries is found out.
|
|
74
|
+
*/
|
|
75
|
+
private downloadAndIndex;
|
|
76
|
+
/**
|
|
77
|
+
* Indexes the package, and if it turns out to declare libraries it does not carry, fetches them
|
|
78
|
+
* from the configured source and indexes again.
|
|
79
|
+
*
|
|
80
|
+
* Without a `libraries` attribute this is one call that either works or reports exactly what is
|
|
81
|
+
* missing. Reaching out to a third party is never something the element decides on its own.
|
|
82
|
+
*/
|
|
83
|
+
private index;
|
|
84
|
+
/**
|
|
85
|
+
* Registers a second package as the source of the libraries this one is missing.
|
|
86
|
+
*
|
|
87
|
+
* Every failure along the way — an unreachable URL, a bundle that is not an archive, one that
|
|
88
|
+
* turns out not to have them either — is reported as one thing: these libraries are missing and
|
|
89
|
+
* this is where the attempt to supply them stopped.
|
|
90
|
+
*/
|
|
91
|
+
private supplyLibraries;
|
|
92
|
+
/**
|
|
93
|
+
* Origins the host vouches for, added to the frame's policy. For content that reaches somewhere
|
|
94
|
+
* the built-in list cannot know about — a tenant's own Panopto host, an in-house CDN. The
|
|
95
|
+
* worker drops anything that is not plainly a host.
|
|
96
|
+
*/
|
|
97
|
+
private allowOrigins;
|
|
98
|
+
private librarySource;
|
|
99
|
+
private resolveSource;
|
|
100
|
+
private recordFor;
|
|
101
|
+
private frameAssets;
|
|
102
|
+
/** Runs the pre-play download for a host that does not honour `Range`, reporting progress. */
|
|
103
|
+
private runDownload;
|
|
104
|
+
/**
|
|
105
|
+
* Finds the routes, registering our own worker unless a host has already mounted the handlers
|
|
106
|
+
* into theirs. Registration uses an explicit `h5p/` sub-scope, so a host worker living in the
|
|
107
|
+
* same directory — or at `/`, for a root-placed `h5p-sw.js` — is never displaced.
|
|
108
|
+
*/
|
|
109
|
+
private ensureWorker;
|
|
110
|
+
/** A host that enforces one worker mounts our handlers in theirs; those routes answer `_ping`. */
|
|
111
|
+
private findMountedRoutes;
|
|
112
|
+
/**
|
|
113
|
+
* Asks the worker its version over the control channel rather than over the `_ping` route. The
|
|
114
|
+
* route only answers for a client the worker controls, and the host page deliberately is not
|
|
115
|
+
* one — our scope is a sub-directory it does not sit under. `postMessage` to the registration's
|
|
116
|
+
* own worker has no such requirement.
|
|
117
|
+
*/
|
|
118
|
+
private warnOnVersionMismatch;
|
|
119
|
+
/** Sends a control message to the worker and waits for its reply on a private port. */
|
|
120
|
+
private send;
|
|
121
|
+
private ensureJobs;
|
|
122
|
+
/**
|
|
123
|
+
* Starts the next queued entry, one at a time. Serial rather than parallel: these are whole
|
|
124
|
+
* videos, and running two halves the rate of the one the learner reaches first. A demand
|
|
125
|
+
* request from the runtime is not queued behind this — it is posted straight through, and the
|
|
126
|
+
* Jobs worker's in-flight map collapses the two if they name the same entry.
|
|
127
|
+
*/
|
|
128
|
+
private advancePrefetch;
|
|
129
|
+
private postToJobs;
|
|
130
|
+
private onWindowMessage;
|
|
131
|
+
/** The worker can also reach the element directly when the page itself is controlled. */
|
|
132
|
+
private onServiceWorkerMessage;
|
|
133
|
+
private handleWorkerRequest;
|
|
134
|
+
/**
|
|
135
|
+
* The embedder half of H5P's own iframe resizing, the same exchange `h5p-resizer.js` implements
|
|
136
|
+
* for a site embedding h5p.org content.
|
|
137
|
+
*
|
|
138
|
+
* H5P drives it from the `resize` events content types raise when they actually change — a
|
|
139
|
+
* dialog opening, an interaction loading, an image arriving. Watching the frame's DOM from the
|
|
140
|
+
* outside would both miss those and fire on changes that are not resizes.
|
|
141
|
+
*/
|
|
142
|
+
private onResizerMessage;
|
|
143
|
+
/** Tells the content to lay out again when the window changes, as the reference embedder does. */
|
|
144
|
+
private onWindowResize;
|
|
145
|
+
private setState;
|
|
146
|
+
private emitProgress;
|
|
147
|
+
private fail;
|
|
148
|
+
}
|
|
149
|
+
declare global {
|
|
150
|
+
interface HTMLElementTagNameMap {
|
|
151
|
+
'h5p-player': H5PPlayerElement;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export default H5PPlayerElement;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ChunkStore } from '../shared/chunk-store';
|
|
2
|
+
export interface ChunkWriterOptions {
|
|
3
|
+
store: ChunkStore;
|
|
4
|
+
entry: string;
|
|
5
|
+
/** Final size when it is known up front (from the zip index or `Content-Length`). */
|
|
6
|
+
totalSize: number | null;
|
|
7
|
+
/** Bytes already in the store; a resumed download starts here. */
|
|
8
|
+
startOffset?: number;
|
|
9
|
+
onProgress?: (written: number) => void;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A `WritableStream` that lands bytes in the chunk store and publishes a watermark as it goes.
|
|
13
|
+
* The watermark is always a prefix — chunks are written in order — so a reader can serve
|
|
14
|
+
* everything below it without checking which chunks exist.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createChunkWriter(options: ChunkWriterOptions): WritableStream<Uint8Array>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/web-globals/abortcontroller.d.ts","../../node_modules/@types/node/web-globals/domexception.d.ts","../../node_modules/@types/node/web-globals/events.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/web-globals/fetch.d.ts","../../node_modules/@types/node/web-globals/navigator.d.ts","../../node_modules/@types/node/web-globals/storage.d.ts","../../node_modules/@types/node/web-globals/streams.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/inspector.generated.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/rollup/dist/rollup.d.ts","../../node_modules/rollup/dist/parseast.d.ts","../../node_modules/vite/types/hmrpayload.d.ts","../../node_modules/vite/types/customevent.d.ts","../../node_modules/vite/types/hot.d.ts","../../node_modules/vite/dist/node/modulerunnertransport.d-dj_me5sf.d.ts","../../node_modules/vite/dist/node/module-runner.d.ts","../../node_modules/esbuild/lib/main.d.ts","../../node_modules/source-map-js/source-map.d.ts","../../node_modules/postcss/lib/previous-map.d.ts","../../node_modules/postcss/lib/input.d.ts","../../node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/postcss/lib/declaration.d.ts","../../node_modules/postcss/lib/root.d.ts","../../node_modules/postcss/lib/warning.d.ts","../../node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/postcss/lib/processor.d.ts","../../node_modules/postcss/lib/result.d.ts","../../node_modules/postcss/lib/document.d.ts","../../node_modules/postcss/lib/rule.d.ts","../../node_modules/postcss/lib/node.d.ts","../../node_modules/postcss/lib/comment.d.ts","../../node_modules/postcss/lib/container.d.ts","../../node_modules/postcss/lib/at-rule.d.ts","../../node_modules/postcss/lib/list.d.ts","../../node_modules/postcss/lib/postcss.d.ts","../../node_modules/postcss/lib/postcss.d.mts","../../node_modules/vite/types/internal/lightningcssoptions.d.ts","../../node_modules/vite/types/internal/csspreprocessoroptions.d.ts","../../node_modules/vite/types/importglob.d.ts","../../node_modules/vite/types/metadata.d.ts","../../node_modules/vite/dist/node/index.d.ts","../../node_modules/vitest/optional-runtime-types.d.ts","../../node_modules/tinybench/dist/index.d.ts","../../node_modules/vitest/dist/chunks/config.d.cu_b-wjj.d.ts","../../node_modules/vitest/dist/chunks/rpc.d.da9utv4e.d.ts","../../node_modules/vitest/dist/chunks/environment.d.c6xyahwa.d.ts","../../node_modules/vitest/dist/chunks/worker.d.mlmnzoje.d.ts","../../node_modules/vitest/dist/chunks/browser.d.g5thl309.d.ts","../../node_modules/@types/deep-eql/index.d.ts","../../node_modules/assertion-error/index.d.ts","../../node_modules/@types/chai/index.d.ts","../../node_modules/vitest/optional-types.d.ts","../../node_modules/@vitest/mocker/dist/registry.d-xlx_foyf.d.ts","../../node_modules/@vitest/mocker/dist/index.d-d4wtotqw.d.ts","../../node_modules/@vitest/mocker/dist/index.d.ts","../../node_modules/vitest/dist/chunks/source-map.d.yqwncp4e.d.ts","../../node_modules/vitest/dist/chunks/task-utils.d.bzm4gsqd.d.ts","../../node_modules/vitest/dist/chunks/evaluatedmodules.d.bxj5omdx.d.ts","../../node_modules/expect-type/dist/utils.d.ts","../../node_modules/expect-type/dist/overloads.d.ts","../../node_modules/expect-type/dist/branding.d.ts","../../node_modules/expect-type/dist/messages.d.ts","../../node_modules/expect-type/dist/index.d.ts","../../node_modules/vitest/dist/index.d.ts","../../node_modules/vitest/dist/runtime.d.ts","../../node_modules/vitest/dist/browser.d.ts","../../node_modules/@vitest/browser/aria-role.d.ts","../../node_modules/@vitest/browser/jest-dom.d.ts","../../node_modules/@vitest/browser/matchers.d.ts","../../node_modules/@vitest/browser/dist/vendor-types.d.ts","../../node_modules/@vitest/browser/context.d.ts","../../node_modules/@vitest/browser-playwright/context.d.ts","../../node_modules/vitest/browser/context.d.ts","../../node_modules/vitest/dist/chunks/plugin.d.cn87hsxv.d.ts","../../node_modules/obug/dist/core.d.ts","../../node_modules/obug/dist/browser.d.ts","../../node_modules/vitest/dist/node.d.ts","../../node_modules/vitest/dist/config.d.ts","../../node_modules/vitest/config.d.ts","../../node_modules/@vitest/browser/dist/index.d.ts","../../node_modules/playwright-core/types/protocol.d.ts","../../node_modules/playwright-core/types/structs.d.ts","../../node_modules/playwright-core/types/types.d.ts","../../node_modules/playwright-core/index.d.ts","../../node_modules/playwright/index.d.ts","../../node_modules/@vitest/browser-playwright/dist/index.d.ts","../../vite.plugins.ts","../../vite.config.ts","../../vite.demo.config.ts"],"fileIdsList":[[63,112,129,130,204,205],[63,112,129,130],[63,109,110,112,129,130],[63,111,112,129,130],[112,129,130],[63,112,117,129,130,147],[63,112,113,118,123,129,130,132,144,155],[63,112,113,114,123,129,130,132],[58,59,60,63,112,129,130],[63,112,115,129,130,156],[63,112,116,117,124,129,130,133],[63,112,117,129,130,144,152],[63,112,118,120,123,129,130,132],[63,111,112,119,129,130],[63,112,120,121,129,130],[63,112,122,123,129,130],[63,111,112,123,129,130],[63,112,123,124,125,129,130,144,155],[63,112,123,124,125,129,130,139,144,147],[63,104,112,120,123,126,129,130,132,144,155],[63,112,123,124,126,127,129,130,132,144,152,155],[63,112,126,128,129,130,144,152,155],[61,62,63,64,65,66,67,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[63,112,123,129,130],[63,112,129,130,131,155],[63,112,120,123,129,130,132,144],[63,112,129,130,133],[63,112,129,130,134],[63,111,112,129,130,135],[63,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161],[63,112,129,130,137],[63,112,129,130,138],[63,112,123,129,130,139,140],[63,112,129,130,139,141,156,158],[63,112,124,129,130],[63,112,123,129,130,144,145,147],[63,112,129,130,146,147],[63,112,129,130,144,145],[63,112,129,130,147],[63,112,129,130,148],[63,109,112,129,130,144,149,155],[63,112,123,129,130,150,151],[63,112,129,130,150,151],[63,112,117,129,130,132,144,152],[63,112,129,130,153],[63,112,129,130,132,154],[63,112,126,129,130,138,155],[63,112,117,129,130,156],[63,112,129,130,144,157],[63,112,129,130,131,158],[63,112,129,130,159],[63,104,112,129,130],[63,104,112,123,125,129,130,135,144,147,155,157,158,160],[63,112,129,130,144,161],[63,112,129,130,226],[63,112,129,130,228,232,235,240,241],[63,112,129,130,212,219,221,222,224,225],[63,112,129,130,226,232,235,241],[63,112,129,130,222,226],[63,112,129,130,212,219,223,224,226],[63,112,129,130,208],[63,112,129,130,208,209],[63,112,129,130,214,215],[63,112,129,130,214,215,216,217],[63,112,129,130,214,216],[63,112,129,130,214],[63,112,129,130,230],[63,112,129,130,156],[63,112,129,130,238],[63,112,113,124,129,130,144,236,237],[63,112,129,130,239],[63,112,129,130,187],[63,112,129,130,185,187],[63,112,129,130,176,184,185,186,188,190],[63,112,129,130,174],[63,112,129,130,177,182,187,190],[63,112,129,130,173,190],[63,112,129,130,177,178,181,182,183,190],[63,112,129,130,177,178,179,181,182,190],[63,112,129,130,174,175,176,177,178,182,183,184,186,187,188,190],[63,112,129,130,190],[63,112,129,130,172,174,175,176,177,178,179,181,182,183,184,185,186,187,188,189],[63,112,129,130,172,190],[63,112,129,130,177,179,180,182,183,190],[63,112,129,130,181,190],[63,112,129,130,182,183,187,190],[63,112,129,130,175,185],[63,112,129,130,164,195,196],[63,112,129,130,163,164],[63,76,80,112,129,130,155],[63,76,112,129,130,144,155],[63,71,112,129,130],[63,73,76,112,129,130,152,155],[63,112,129,130,132,152],[63,112,129,130,162],[63,71,112,129,130,162],[63,73,76,112,129,130,132,155],[63,68,69,72,75,112,123,129,130,144,155],[63,76,83,112,129,130],[63,68,74,112,129,130],[63,76,97,98,112,129,130],[63,72,76,112,129,130,147,155,162],[63,97,112,129,130,162],[63,70,71,112,129,130,162],[63,76,112,129,130],[63,70,71,72,73,74,75,76,77,78,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,98,99,100,101,102,103,112,129,130],[63,76,91,112,129,130],[63,76,83,84,112,129,130],[63,74,76,84,85,112,129,130],[63,75,112,129,130],[63,68,71,76,112,129,130],[63,76,80,84,85,112,129,130],[63,80,112,129,130],[63,74,76,79,112,129,130,155],[63,68,73,76,83,112,129,130],[63,112,129,130,144],[63,71,76,97,112,129,130,160,162],[63,112,123,124,126,127,128,129,130,132,144,152,155,161,162,164,165,166,167,169,170,171,191,192,193,194,195,196],[63,112,129,130,166,167,168,169],[63,112,129,130,166],[63,112,129,130,167],[63,112,129,130,164,196],[63,112,129,130,221,227],[63,112,129,130,233],[63,112,129,130,197,198,199,211,212,219,220,224],[63,112,129,130,199,200,202],[63,112,129,130,197,198],[63,112,129,130,199],[63,112,129,130,170],[63,112,115,124,125,129,130,134,144,196,199,200,202,203,206,207,210,211,228,233,241],[63,112,129,130,170,199],[63,112,129,130,199,219,224],[63,112,129,130,170,199,200,201],[63,112,115,124,125,129,130,134,144,170,196,197,198,199,200,201,202,203,206,207,210,211,228,229,232,233,235,241],[63,112,129,130,170,197,198,199,200,201,202,203,206,210,212,213,218],[63,112,115,123,124,125,126,129,130,134,144,170,196,197,198,199,201,202,203,206,207,210,211,212,219,224,228,229,231,233,241],[63,112,129,130,197,198,199,201],[63,112,129,130,134,196,233,234,241,242],[63,112,124,129,130,134,196,233,242],[63,112,125,126,129,130,134,171,196,233]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"8cdf8847677ac7d20486e54dd3fcf09eda95812ac8ace44b4418da1bbbab6eb8","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"98cffbf06d6bab333473c70a893770dbe990783904002c4f1a960447b4b53dca","affectsGlobalScope":true,"impliedFormat":1},{"version":"3af97acf03cc97de58a3a4bc91f8f616408099bc4233f6d0852e72a8ffb91ac9","affectsGlobalScope":true,"impliedFormat":1},{"version":"808069bba06b6768b62fd22429b53362e7af342da4a236ed2d2e1c89fcca3b4a","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true,"impliedFormat":1},{"version":"f9501cc13ce624c72b61f12b3963e84fad210fbdf0ffbc4590e08460a3f04eba","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0fa06ada475b910e2106c98c68b10483dc8811d0c14a8a8dd36efb2672485b29","impliedFormat":1},{"version":"33e5e9aba62c3193d10d1d33ae1fa75c46a1171cf76fef750777377d53b0303f","impliedFormat":1},{"version":"2b06b93fd01bcd49d1a6bd1f9b65ddcae6480b9a86e9061634d6f8e354c1468f","impliedFormat":1},{"version":"6a0cd27e5dc2cfbe039e731cf879d12b0e2dded06d1b1dedad07f7712de0d7f4","affectsGlobalScope":true,"impliedFormat":1},{"version":"913be43dad2a40e500104700aa26cfb5c51a976114bedf19624de43fdae7474f","impliedFormat":1},{"version":"e60477649d6ad21542bd2dc7e3d9ff6853d0797ba9f689ba2f6653818999c264","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"4c829ab315f57c5442c6667b53769975acbf92003a66aef19bce151987675bd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"b2ade7657e2db96d18315694789eff2ddd3d8aea7215b181f8a0b303277cc579","impliedFormat":1},{"version":"78dbea00e90d2df8ea3dbef0cc379d95b8be9b71cd6bde4c28728f306811803b","impliedFormat":1},{"version":"4d631b81fa2f07a0e63a9a143d6a82c25c5f051298651a9b69176ba28930756d","impliedFormat":1},{"version":"836a356aae992ff3c28a0212e3eabcb76dd4b0cc06bcb9607aeef560661b860d","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"41670ee38943d9cbb4924e436f56fc19ee94232bc96108562de1a734af20dc2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e1e46d0a9837ee058c100501080c920fa98081ea3956af0374308ba6f22a33e","impliedFormat":1},{"version":"272ca407e0c9068bdc5152552d876e68037ceae3de62e529306403e973dec8e1","impliedFormat":1},{"version":"fa7834c715d5357e4540cee40ce96c3250ddb67a7b879a6b7fa0e86d6696f121","impliedFormat":1},{"version":"22dfb07a7ab15b66ac043829056fe70124844636ae719551812ac631ba04985b","impliedFormat":1},{"version":"a10f0e1854f3316d7ee437b79649e5a6ae3ae14ffe6322b02d4987071a95362e","impliedFormat":1},{"version":"e208f73ef6a980104304b0d2ca5f6bf1b85de6009d2c7e404028b875020fa8f2","impliedFormat":1},{"version":"d163b6bc2372b4f07260747cbc6c0a6405ab3fbcea3852305e98ac43ca59f5bc","impliedFormat":1},{"version":"e6fa9ad47c5f71ff733744a029d1dc472c618de53804eae08ffc243b936f87ff","affectsGlobalScope":true,"impliedFormat":1},{"version":"a6f137d651076822d4fe884287e68fd61785a0d3d1fdb250a5059b691fa897db","impliedFormat":1},{"version":"24826ed94a78d5c64bd857570fdbd96229ad41b5cb654c08d75a9845e3ab7dde","impliedFormat":1},{"version":"8b479a130ccb62e98f11f136d3ac80f2984fdc07616516d29881f3061f2dd472","impliedFormat":1},{"version":"928af3d90454bf656a52a48679f199f64c1435247d6189d1caf4c68f2eaf921f","affectsGlobalScope":true,"impliedFormat":1},{"version":"bceb58df66ab8fb00170df20cd813978c5ab84be1d285710c4eb005d8e9d8efb","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"77fbe5eecb6fac4b6242bbf6eebfc43e98ce5ccba8fa44e0ef6a95c945ff4d98","impliedFormat":1},{"version":"4f9d8ca0c417b67b69eeb54c7ca1bedd7b56034bb9bfd27c5d4f3bc4692daca7","impliedFormat":1},{"version":"0cb167c371eaa8c869f8a7656a7296f2e4fae43b4d8b803a680236b24794e5f9","impliedFormat":1},{"version":"0a839dba0287cc0481ad4beedd48a1c64acf1e212ae865d1315f7007ca215161","impliedFormat":1},{"version":"38dc4655376cd1a4bd6bb3763d92949233e33d38d3dd3cbea7bbf218175a38ef","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee","impliedFormat":1},{"version":"208a6a0bfb227bdf8fb964799d0a206c75cf03ccd72e63bf5495c9331354c6d6","affectsGlobalScope":true,"impliedFormat":1},{"version":"18fd40412d102c5564136f29735e5d1c3b455b8a37f920da79561f1fde068208","impliedFormat":1},{"version":"48a679952eefe4cb776d5a0e1ccba2d3eb53b57448bbb7abc1fcebcbd5440188","impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"2d14da6ecb49bf828d83948765ec2d3a579d476bbb9645e749610baa6ec880ca","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"5b7aa3c4c1a5d81b411e8cb302b45507fea9358d3569196b27eb1a27ae3a90ef","affectsGlobalScope":true,"impliedFormat":1},{"version":"5987a903da92c7462e0b35704ce7da94d7fdc4b89a984871c0e2b87a8aae9e69","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea08a0345023ade2b47fbff5a76d0d0ed8bff10bc9d22b83f40858a8e941501c","impliedFormat":1},{"version":"0aef708fb4c7a6b915e8305cbfac40cd207b032dbaabe9a01889a5fff3254681","impliedFormat":1},{"version":"ae062ce7d9510060c5d7e7952ae379224fb3f8f2dd74e88959878af2057c143b","impliedFormat":1},{"version":"ad9bdafb4e7abf14cc53ce7970486a84c87831e62891e5dfe798ddcd55e84701","affectsGlobalScope":true,"impliedFormat":1},{"version":"358765d5ea8afd285d4fd1532e78b88273f18cb3f87403a9b16fef61ac9fdcfe","impliedFormat":1},{"version":"71d3ae6a5e73ca4130762560425e00984ebaff64d5353a3333d1bb7eb86ef336","impliedFormat":1},{"version":"751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","impliedFormat":1},{"version":"21944c138a48dc23382cb6558b1d4498908faad2104ba7ff390ba8b27c06f3c0","affectsGlobalScope":true,"impliedFormat":1},{"version":"a660aa95476042d3fdcc1343cf6bb8fdf24772d31712b1db321c5a4dcc325434","impliedFormat":1},{"version":"a7ca8df4f2931bef2aa4118078584d84a0b16539598eaadf7dce9104dfaa381c","impliedFormat":1},{"version":"11443a1dcfaaa404c68d53368b5b818712b95dd19f188cab1669c39bee8b84b3","impliedFormat":1},{"version":"36977c14a7f7bfc8c0426ae4343875689949fb699f3f84ecbe5b300ebf9a2c55","impliedFormat":1},{"version":"035d0934d304483f07148427a5bd5b98ac265dae914a6b49749fe23fbd893ec7","impliedFormat":99},{"version":"e2ed5b81cbed3a511b21a18ab2539e79ac1f4bc1d1d28f8d35d8104caa3b429f","impliedFormat":99},{"version":"161c8e0690c46021506e32fda85956d785b70f309ae97011fd27374c065cac9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"52dcc257df5119fb66d864625112ce5033ac51a4c2afe376a0b299d2f7f76e4a","impliedFormat":1},{"version":"e5bab5f871ef708d52d47b3e5d0aa72a08ee7a152f33931d9a60809711a2a9a3","impliedFormat":1},{"version":"e16dc2a81595736024a206c7d5c8a39bfe2e6039208ef29981d0d95434ba8fcf","impliedFormat":1},{"version":"38cb107048cd8ba54a70014ef9a30cf57bee0d9f10a0ca4cefa974056e1ee460","impliedFormat":1},{"version":"19ee8416e6473ed6c7adb868fa796b5653cf0fa2a337658e677eaa0d134388c3","impliedFormat":1},{"version":"1328ab4e442614b28cdb3d4b414cf68325c0da0dca07287a338d0654b7a00261","impliedFormat":1},{"version":"a039dc21f045919f3cbee2ec13812cc6cc3eebc99dae4be00973230f468d19a6","impliedFormat":1},{"version":"3fbe57af01460e49dcd29df55d6931e1672bc6f1be0fb073d11410bc16f9037d","impliedFormat":1},{"version":"f760be449e8562ec5c09bb5187e8e1eabf3c113c0c58cddda53ef8c69f3e2131","impliedFormat":1},{"version":"44325ed13294fce6ab825b82947bbeed2611db7dad9d9135260192f375e5a189","impliedFormat":1},{"version":"e392e8fb5b514eafc585601c1d781485aa6dd6a320e75daf1064a4c6918a1b45","impliedFormat":1},{"version":"46e4a36e8ddbdfb4e7330e11c81c970dc8b218611df9183d39c41c5f8c653b55","impliedFormat":1},{"version":"3cc8a3d123b6b232d48d34b51b785f9da8d193f5b5817fa521fcd2f3b9315c55","impliedFormat":1},{"version":"6332f565867cf4a740a70e30f31cefba37ef7cebcf74f22eab8d744fde6d193e","impliedFormat":1},{"version":"9a195d8476f48523446ece812e5450b5b1ec8c3b6abf99efb8ee2479524f6f56","impliedFormat":1},{"version":"17f2922d41ddd032830a91371c948cd9ce903b35c95adca72271a54584f19b0b","impliedFormat":1},{"version":"3eed76ede2a1a14d7c9bb0a642041282dcc264811139d3dd275c9fe14efc9840","impliedFormat":1},{"version":"354a7f8e1287d9d6b7561bc97fdd8cbc2f7c1dd79e4cb37b942e8a5cfaff1085","impliedFormat":1},{"version":"8d369483f0c2b9ee388129cfdb6a43bc8112b377e86a41884bd06e19ce04f4c1","impliedFormat":99},{"version":"4ec16d7a4e366c06a4573d299e15fe6207fc080f41beac5da06f4af33ea9761e","impliedFormat":1},{"version":"7870becb94cbc11d2d01b77c4422589adcba4d8e59f726246d40cd0d129784d8","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f698624bbbb060ece7c0e51b7236520ebada74b747d7523c7df376453ed6fea","impliedFormat":1},{"version":"f70b8328a15ca1d10b1436b691e134a49bc30dcf3183a69bfaa7ba77e1b78ecd","impliedFormat":1},{"version":"d9030fc0c412a31e7e13d189b9ad032b5177c20217add0f24fd3fff0cf272882","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"883ab61941ae697bd5724f02abc0a4044dc5427e7fb002c95867204918c1a68c","impliedFormat":99},{"version":"2493d114a1f01f02d69b4b44265405dfd5bbf135e0f467838808c4137c71ce54","impliedFormat":99},{"version":"fc620fc5a05d1d8499e790626f83b401604634dfd9c4b11042099a63883df8fb","impliedFormat":99},{"version":"123b46e873f6ae5902094478c2c58b725b3d92e1d36b53daf85b7732d032dfa8","impliedFormat":99},{"version":"11f54bcce4d6e4271122c6b06329b37f6d297141ad6e918b5181e17572158a10","impliedFormat":99},{"version":"dd8cb59c27a49fdc4b86eb755ddaaab5de0f30a627767f506fb2607ca4b2ec22","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"8124828a11be7db984fcdab052fd4ff756b18edcfa8d71118b55388176210923","impliedFormat":99},{"version":"8d4ea2431523a42682a9f2efb2ae662aa42a39983c9d40a19257b2445f50450e","impliedFormat":99},{"version":"29738162d88967e51557276cba80552cb8d2a4c823873b7f1531244860f0d178","impliedFormat":99},{"version":"fc07122b30042636bbf689305c75a764d6e3c2eeb75cd1033c96a6a7dc9e6e3f","impliedFormat":99},{"version":"df5741ada9274db8915029054abcb751821c63433a6707bc7ce43fe540e71395","impliedFormat":99},{"version":"9500d6fd10c59daeab4a18b1d9aeaf13d790bd4a92a5f864d5f323dba395d4cc","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"dd51e53752b310bd20c9b1a87bbf12b1fe2be7fe40f505b43199496481096275","impliedFormat":1},{"version":"a87be4662442b3feeffc331ecafe6b36cafd08727e2d7f2425a5099577e7fd18","impliedFormat":1},{"version":"cd4cd9220a1ba793bc935e76d8e5481c110a90d9868ae7866a182ee71cdb6abb","impliedFormat":1},{"version":"0a7fb8619b10bc05fd933ca9ac1c8b2ab2220be7a57b57565c3ac158595494ef","impliedFormat":1},{"version":"c4a5f91feb9c5a6b2a91089d959c38391b79a961db3b9cc73b8877d57ad7dcdc","impliedFormat":1},{"version":"3589cb90a45acfb8c2336b34a9e340f036a6aecfdb71742047d37748dfa52816","impliedFormat":99},{"version":"a1202e4252e4b7440d9967ba15ecdb7efa55a1c3fe17db859a87c75919d0c138","impliedFormat":99},{"version":"52883e45e8a1c581524010872cbc2ec034e13f786a3d71e31fa63b69e0d2515b","impliedFormat":99},{"version":"7cd92bc6808967f175063fce65f8d1d60a07d752b79ed20aa2eba9a2b8ed0820","impliedFormat":99},{"version":"283fa25e0ce1be2705fa3158095f5abbef30a9f76077c52c2fc021f359b57e8b","impliedFormat":99},{"version":"0bba7c04b0b2807e1aeb9fbf9f91f4130e48582f9d89ea0da81981aa88391e5b","impliedFormat":99},{"version":"1f275d8ff7220c7b841a6b087f021832ed41a626741e91c9aa7c553d061cc0fe","impliedFormat":99},{"version":"6f4a24ba6cd57a49bf28fa2a017f706514b0f3d571e34303e8fa2b5ba3c7f147","impliedFormat":99},{"version":"2b1795d67cf9aa20167c72d795d4db6badea9cea646d9181869b5ca08c778479","impliedFormat":99},{"version":"b9ce547961f4a0f9b2ecf456aa4b0cf9ae8eaba8fc50554da3310929c620d36d","impliedFormat":99},{"version":"a93d72194894d0eb54e7c43bd41167195dcf6a17800ce18fcee1716e1905dda5","impliedFormat":99},{"version":"06f1305bd6733a179a021118382fe9371cfad44bb0a1b6b59747a541fa3174ec","impliedFormat":99},{"version":"bab0f4721909fb20befa777937dfc6896ac8a0b0a22e60785f767a04a18ad2a7","impliedFormat":99},{"version":"09b5ab06e7b242132974144474b24a0fddde568e0fb20d69215d156d78ac0d7f","impliedFormat":99},{"version":"dd849bf46257e8c9839babf31d89a55895a9e7886b684cd3fb48372641621e3b","impliedFormat":99},{"version":"aa348c4fb2f8ac77df855f07fb66281c9f6e71746fdff3b13c7932aa7642b788","impliedFormat":99},{"version":"b02462069af953c49995e20e1ada37148d2d602cbd84707ba6092c76c4002eaa","impliedFormat":99},{"version":"0410ed82a9ac63269dc1471ed249b280e2d461249a3a331e71cdb54cdf10db33","impliedFormat":1},{"version":"c9b9179b7291c8562eb0fb781219ddbdcf36149ebd7bd355e5b4a553d6b60b81","impliedFormat":1},{"version":"2806f6d7810fba0306066d500cd716a6d1128d90af2c3cf71723e3ea0a8904c4","impliedFormat":1},{"version":"7a8ec10b0834eb7183e4bfcd929838ac77583828e343211bb73676d1e47f6f01","impliedFormat":1},{"version":"b07f64ff6ec710998a62b07377fbda0ab4c313ba1f0055bfe9faa22cffedd47c","impliedFormat":1},{"version":"72ef861333c7870a29fc0e248129c4afc0741c0716a74c3da409d05e41ff1322","impliedFormat":99},{"version":"6f2d5608719b23dfbe15113ee3d33a9b2b5bc92f4354da08c4bd8353430e170b","signature":"3b31cb648894ce7907e966f48a65d3452fe8a3d050a3b24fbeb99bee6d9cd11a"},{"version":"8dd95bf74c75f7ddd0275d3e8fd726ce8dec61529a3b4128984833c2bb61e069","signature":"b0870d16d81c8dc192474d2a093152325da8b04dce2e14b3d93bc52588283bab"},{"version":"49ec610f0000115e0978e88fd14b3b7416ef47ea0bfa67d21a0522a34bc8a41c","signature":"4b96dd19fd2949d28ce80e913412b0026dc421e5bf6c31d87c7b5eb11b5753b4"}],"root":[[242,244]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"emitDeclarationOnly":true,"module":99,"outDir":"./","skipLibCheck":true,"strict":true,"target":9},"referencedMap":[[206,1],[204,2],[163,2],[109,3],[110,3],[111,4],[63,5],[112,6],[113,7],[114,8],[58,2],[61,9],[59,2],[60,2],[115,10],[116,11],[117,12],[118,13],[119,14],[120,15],[121,15],[122,16],[123,17],[124,18],[125,19],[64,2],[62,2],[126,20],[127,21],[128,22],[162,23],[129,24],[130,2],[131,25],[132,26],[133,27],[134,28],[135,29],[136,30],[137,31],[138,32],[139,33],[140,33],[141,34],[142,2],[143,35],[144,36],[146,37],[145,38],[147,39],[148,40],[149,41],[150,42],[151,43],[152,44],[153,45],[154,46],[155,47],[156,48],[157,49],[158,50],[159,51],[65,2],[66,2],[67,2],[105,52],[106,2],[107,2],[108,39],[160,53],[161,54],[227,55],[241,56],[222,2],[226,57],[235,58],[225,2],[223,59],[224,60],[209,61],[210,62],[208,2],[205,2],[171,2],[216,63],[218,64],[217,65],[215,66],[214,2],[231,67],[230,68],[239,69],[236,2],[237,69],[238,70],[240,71],[188,72],[186,73],[187,74],[175,75],[176,73],[183,76],[174,77],[179,78],[189,2],[180,79],[185,80],[191,81],[190,82],[173,83],[181,84],[182,85],[177,86],[184,72],[178,87],[165,88],[164,89],[172,2],[198,2],[56,2],[57,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[20,2],[21,2],[4,2],[22,2],[26,2],[23,2],[24,2],[25,2],[27,2],[28,2],[29,2],[5,2],[30,2],[31,2],[32,2],[33,2],[6,2],[37,2],[34,2],[35,2],[36,2],[38,2],[7,2],[39,2],[44,2],[45,2],[40,2],[41,2],[42,2],[43,2],[8,2],[49,2],[46,2],[47,2],[48,2],[50,2],[9,2],[51,2],[52,2],[53,2],[55,2],[54,2],[1,2],[83,90],[93,91],[82,90],[103,92],[74,93],[73,94],[102,95],[96,96],[101,97],[76,98],[90,99],[75,100],[99,101],[71,102],[70,95],[100,103],[72,104],[77,105],[78,2],[81,105],[68,2],[104,106],[94,107],[85,108],[86,109],[88,110],[84,111],[87,112],[97,95],[79,113],[80,114],[89,115],[69,116],[92,107],[91,105],[95,2],[98,117],[196,118],[170,119],[169,120],[167,120],[166,2],[168,121],[194,2],[193,2],[192,2],[195,122],[228,123],[234,124],[221,125],[203,126],[199,127],[201,128],[213,129],[229,130],[200,131],[211,128],[212,132],[202,133],[233,134],[219,135],[232,136],[220,137],[197,2],[207,2],[243,138],[244,139],[242,140]],"latestChangedDtsFile":"./vite.demo.config.d.ts","version":"5.9.3"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
/** A standalone classic script: no imports, no `import.meta`, runnable from a blob or a URL. */
|
|
3
|
+
export declare function bundleWorker(entry: string, minify: boolean): Promise<string>;
|
|
4
|
+
/** Supplies the Jobs worker to the element as a string, for `new Worker(blob:)`. */
|
|
5
|
+
export declare function jobsWorkerPlugin(): Plugin;
|
|
6
|
+
/**
|
|
7
|
+
* Serves the Service Worker during dev and tests. In a built package `dist/h5p-sw.js` sits next
|
|
8
|
+
* to the element and `new URL('./h5p-sw.js', import.meta.url)` finds it; in dev that same URL
|
|
9
|
+
* points at `/src/h5p-sw.js`, which is this.
|
|
10
|
+
*/
|
|
11
|
+
export declare function devServiceWorkerPlugin(): Plugin;
|
|
12
|
+
export declare function noRangeFixturesPlugin(): Plugin;
|
|
13
|
+
/**
|
|
14
|
+
* Replaces `%SITE_URL%` in the pages. Canonical links and social-card URLs have to be absolute,
|
|
15
|
+
* and the origin is only known where the site is built — Vercel's production URL, or localhost.
|
|
16
|
+
* It runs before Vite's own `%ENV%` pass, which would otherwise warn about a name it does not
|
|
17
|
+
* know.
|
|
18
|
+
*/
|
|
19
|
+
export declare function siteUrlPlugin(siteUrl: string): Plugin;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { ByteRange } from './range';
|
|
2
|
+
import type { ForwardIndexSnapshot } from './forward-index';
|
|
3
|
+
/**
|
|
4
|
+
* The chunk store: one Cache API cache per package. Small entries are stored whole; archives and
|
|
5
|
+
* extracted media are stored as fixed-size chunks, so a range request is chunk arithmetic plus a
|
|
6
|
+
* slice and nothing bigger than one chunk is ever resident.
|
|
7
|
+
*
|
|
8
|
+
* It is a cache, not a library. Nothing in v1 lets a user manage it; when a write hits the quota,
|
|
9
|
+
* the coldest package that is not currently playing is dropped and the write is retried.
|
|
10
|
+
*/
|
|
11
|
+
/** What is known about a chunked entry while and after it is written. */
|
|
12
|
+
export interface ChunkMeta {
|
|
13
|
+
/** Total size once known. `null` while a download of unknown length is in flight. */
|
|
14
|
+
size: number | null;
|
|
15
|
+
/** Bytes written so far, always a prefix of the entry: chunks are written in order. */
|
|
16
|
+
available: number;
|
|
17
|
+
complete: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* The name a forward index is announced under on the watermark channel, so a request waiting for
|
|
21
|
+
* an entry that has not arrived yet wakes when the index grows, the way one waiting for bytes
|
|
22
|
+
* wakes when the watermark moves.
|
|
23
|
+
*/
|
|
24
|
+
export declare const FORWARD_INDEX_ENTRY = "__forward_index__";
|
|
25
|
+
export declare function cacheNameFor(pkgId: string): string;
|
|
26
|
+
export declare class QuotaError extends Error {
|
|
27
|
+
constructor(message?: string);
|
|
28
|
+
}
|
|
29
|
+
/** Chunk indices covering an inclusive byte range. */
|
|
30
|
+
export declare function chunksForRange(range: ByteRange): {
|
|
31
|
+
first: number;
|
|
32
|
+
last: number;
|
|
33
|
+
};
|
|
34
|
+
/** The slice of chunk `index` that contributes to `range`, as offsets within the chunk. */
|
|
35
|
+
export declare function sliceWithinChunk(index: number, range: ByteRange): {
|
|
36
|
+
from: number;
|
|
37
|
+
to: number;
|
|
38
|
+
};
|
|
39
|
+
export declare class ChunkStore {
|
|
40
|
+
readonly pkgId: string;
|
|
41
|
+
private cachePromise;
|
|
42
|
+
constructor(pkgId: string);
|
|
43
|
+
private cache;
|
|
44
|
+
getWhole(entry: string): Promise<Response | undefined>;
|
|
45
|
+
/**
|
|
46
|
+
* Stores an entry in one piece. `body` builds the payload — usually a fresh inflate stream
|
|
47
|
+
* straight off zip.js, so the entry streams into storage instead of landing in memory first —
|
|
48
|
+
* and is called again only if a quota retry needs another.
|
|
49
|
+
*/
|
|
50
|
+
putWhole(entry: string, body: () => BodyInit, contentType: string, size?: number): Promise<void>;
|
|
51
|
+
getMeta(entry: string): Promise<ChunkMeta | undefined>;
|
|
52
|
+
setMeta(entry: string, meta: ChunkMeta): Promise<void>;
|
|
53
|
+
putChunk(entry: string, index: number, bytes: Uint8Array): Promise<void>;
|
|
54
|
+
getChunk(entry: string, index: number): Promise<Uint8Array | undefined>;
|
|
55
|
+
/**
|
|
56
|
+
* Streams an inclusive byte range out of a chunked entry. Chunks are pulled one at a time as
|
|
57
|
+
* the consumer reads, and each streams straight out of the cache — a partial one sliced as it
|
|
58
|
+
* flows — so serving a 300 MB video costs kilobytes of memory, not a chunk of it. That matters
|
|
59
|
+
* most for the small ranges a media element probes with: materialising the 8 MB chunk to hand
|
|
60
|
+
* back 64 kB of it was the old cost of every such request.
|
|
61
|
+
*
|
|
62
|
+
* `waitFor` lets the stream run ahead of the extraction: it is called with the byte the next
|
|
63
|
+
* chunk reaches and must resolve true once that much exists. Without it every byte of the
|
|
64
|
+
* range has to be in the store before the first one can be served.
|
|
65
|
+
*/
|
|
66
|
+
readRange(entry: string, range: ByteRange, waitFor?: (bytes: number) => Promise<boolean>): ReadableStream<Uint8Array>;
|
|
67
|
+
/** The stored body of one chunk, streaming, or `undefined` when it is not there. */
|
|
68
|
+
private chunkBody;
|
|
69
|
+
/** Reads an inclusive range into memory. Only used for archive reads, which are bounded. */
|
|
70
|
+
readRangeBytes(entry: string, range: ByteRange): Promise<Uint8Array>;
|
|
71
|
+
getArchiveMeta(): Promise<ChunkMeta | undefined>;
|
|
72
|
+
/**
|
|
73
|
+
* The entries of a downloading archive that are already readable, from its local headers. The
|
|
74
|
+
* Jobs worker publishes this as it downloads; the Service Worker serves from it until the whole
|
|
75
|
+
* archive — and with it the central directory, the real index — is present.
|
|
76
|
+
*/
|
|
77
|
+
getForwardIndex(): Promise<ForwardIndexSnapshot | undefined>;
|
|
78
|
+
setForwardIndex(snapshot: ForwardIndexSnapshot): Promise<void>;
|
|
79
|
+
readArchiveRange(range: ByteRange): Promise<Uint8Array>;
|
|
80
|
+
/**
|
|
81
|
+
* A cache write that survives a full disk: on a quota error the coldest *other* package is
|
|
82
|
+
* dropped and the write retried. The package being served is never a candidate, so playback
|
|
83
|
+
* cannot evict itself mid-stream.
|
|
84
|
+
*
|
|
85
|
+
* It takes a factory, not a `Response`. A body can only be consumed once, and the obvious way
|
|
86
|
+
* to keep a retry copy — `clone()` before every attempt — tees the body: for a stream straight
|
|
87
|
+
* off the inflate, the unread branch then buffers the entire entry in memory, on every write,
|
|
88
|
+
* only to be thrown away when the put succeeds. Building a fresh response only when a retry
|
|
89
|
+
* actually happens keeps the common path a single pass through.
|
|
90
|
+
*/
|
|
91
|
+
private write;
|
|
92
|
+
destroy(): Promise<void>;
|
|
93
|
+
}
|
|
94
|
+
export declare function setEvictionPolicy(lookup: (exceptPkgId: string) => Promise<string | null>): void;
|
|
95
|
+
export declare function setEvictionListener(listener: (pkgId: string) => Promise<void> | void): void;
|
|
96
|
+
export interface WatermarkNotice {
|
|
97
|
+
pkgId: string;
|
|
98
|
+
entry: string;
|
|
99
|
+
meta: ChunkMeta;
|
|
100
|
+
}
|
|
101
|
+
/** Calls `onNotice` for every watermark written to one entry, until the returned function is called. */
|
|
102
|
+
export declare function onWatermark(pkgId: string, entry: string, onNotice: (meta: ChunkMeta) => void): () => void;
|
|
103
|
+
/** Drops package caches written by an older major version. Called from the worker's `activate`. */
|
|
104
|
+
export declare function deleteStaleCaches(): Promise<string[]>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** Version of the element/worker pair. Kept in sync with package.json by scripts/sync-h5p-assets.mjs. */
|
|
2
|
+
export declare const VERSION = "0.1.0";
|
|
3
|
+
/** Major version. Cache names carry it, so a major bump discards every cached package. */
|
|
4
|
+
export declare const MAJOR_VERSION = 0;
|
|
5
|
+
/** One cache per package: `h5p-pkg-v<major>-<pkgId>`. */
|
|
6
|
+
export declare const CACHE_PREFIX = "h5p-pkg-v0-";
|
|
7
|
+
/**
|
|
8
|
+
* Chunk size for archives and extracted media: the unit of storage, and the ceiling on what one
|
|
9
|
+
* read or write holds in memory. The segment window in `source.ts` is the one deliberate exception.
|
|
10
|
+
*/
|
|
11
|
+
export declare const CHUNK_SIZE: number;
|
|
12
|
+
/**
|
|
13
|
+
* Entries at or below this size are inflated whole into the cache on first request, whatever
|
|
14
|
+
* their compression method. Above it, a deflated entry goes to the Jobs worker and a stored
|
|
15
|
+
* entry is sliced straight out of the source.
|
|
16
|
+
*/
|
|
17
|
+
export declare const INLINE_MAX_SIZE: number;
|
|
18
|
+
/**
|
|
19
|
+
* How a large span is pulled over HTTP: `SEGMENT_CONCURRENCY` ranged requests of `SEGMENT_SIZE`
|
|
20
|
+
* in flight at once, emitted in order.
|
|
21
|
+
*
|
|
22
|
+
* One request per span is already the difference between a working player and 3,500 round trips
|
|
23
|
+
* — but a single connection is often capped well below the link. Measured against one real host:
|
|
24
|
+
* 2.0 MB/s on one connection, 2.6 MB/s on four, against a 3.5 MB/s link. Four is where it
|
|
25
|
+
* stopped improving; eight was no better.
|
|
26
|
+
*
|
|
27
|
+
* The cost is memory. Segments arrive out of order and wait their turn, so up to
|
|
28
|
+
* `SEGMENT_CONCURRENCY * SEGMENT_SIZE` — 16 MB — can be held at once. That is a deliberate
|
|
29
|
+
* loosening of "nothing larger than one chunk in memory", and it is why the segment is 4 MB
|
|
30
|
+
* rather than the 8 MB used everywhere else.
|
|
31
|
+
*/
|
|
32
|
+
export declare const SEGMENT_SIZE: number;
|
|
33
|
+
export declare const SEGMENT_CONCURRENCY = 4;
|
|
34
|
+
/** Below this, one request is better: the overlap cannot pay back its own latency. */
|
|
35
|
+
export declare const SEGMENT_MIN_SPAN: number;
|
|
36
|
+
/** Reserved chunk-store entry name for the archive itself (chunked adapter). */
|
|
37
|
+
export declare const ARCHIVE_ENTRY = "__archive__";
|
|
38
|
+
/**
|
|
39
|
+
* How long the watermark may sit still before the virtual server concludes the job behind it is
|
|
40
|
+
* gone. It is not a budget for the whole extraction: inflating a few hundred megabytes over a
|
|
41
|
+
* network legitimately takes minutes, and a request for the tail of such an entry cannot be
|
|
42
|
+
* answered before it finishes.
|
|
43
|
+
*/
|
|
44
|
+
export declare const COLD_ENTRY_WAIT_MS = 15000;
|
|
45
|
+
/**
|
|
46
|
+
* How often a waiting response re-reads the watermark when no notice has arrived. Progress is
|
|
47
|
+
* announced on a `BroadcastChannel` the moment it is written, so this is the fallback that keeps
|
|
48
|
+
* stall detection honest, not what makes serving prompt.
|
|
49
|
+
*/
|
|
50
|
+
export declare const WATERMARK_POLL_MS = 500;
|
|
51
|
+
/**
|
|
52
|
+
* How long one job request suppresses the next for the same entry. A media element opens with a
|
|
53
|
+
* burst of range requests that all land within milliseconds, and this is only there to keep that
|
|
54
|
+
* burst from becoming a burst of messages — the real deduplication is the Jobs worker's own
|
|
55
|
+
* in-flight map and its Web Lock. Keeping the window short matters: a job can die with the tab
|
|
56
|
+
* that owned it, and a long window would leave the entry unserved until it expired.
|
|
57
|
+
*/
|
|
58
|
+
export declare const JOB_REQUEST_DEDUPE_MS = 2000;
|
|
59
|
+
/** IndexedDB database and store names. */
|
|
60
|
+
export declare const DB_NAME = "h5p-player";
|
|
61
|
+
export declare const DB_VERSION = 1;
|
|
62
|
+
export declare const PACKAGES_STORE = "packages";
|
|
63
|
+
/**
|
|
64
|
+
* Synthetic origin for chunk-store keys. The Cache API needs absolute http(s) URLs; these are
|
|
65
|
+
* never fetched, so an unresolvable TLD keeps them from ever reaching the network.
|
|
66
|
+
*/
|
|
67
|
+
export declare const CHUNK_KEY_ORIGIN = "https://chunks.h5p-player.invalid/";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entry-name normalisation. Archives are untrusted: an entry may try to escape the package root
|
|
3
|
+
* with `..`, an absolute path, a Windows drive letter or a backslash separator. Anything that
|
|
4
|
+
* cannot be expressed as a plain relative path under the package root is rejected outright
|
|
5
|
+
* rather than sanitised, so a hostile name can never silently become a different valid name.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Returns the canonical form of a zip entry name, or `null` if the name is unusable.
|
|
9
|
+
* Canonical means: forward slashes, no leading slash, no `.` or `..` segments, no empty
|
|
10
|
+
* segments, no trailing slash.
|
|
11
|
+
*/
|
|
12
|
+
export declare function normalizeEntryName(raw: string): string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Normalises the path taken from a virtual-server URL. The path arrives percent-encoded from the
|
|
15
|
+
* URL; it is decoded first so that `%2e%2e` is rejected like a literal `..`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeRequestPath(raw: string): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Builds the entry index from raw zip names. Directory entries are dropped, unusable names are
|
|
20
|
+
* dropped, and a name that normalises onto one already taken is dropped rather than overwriting
|
|
21
|
+
* it — first occurrence wins, so a duplicate cannot shadow a library file already indexed.
|
|
22
|
+
*/
|
|
23
|
+
export declare function indexEntryNames<T extends {
|
|
24
|
+
filename: string;
|
|
25
|
+
directory?: boolean;
|
|
26
|
+
}>(entries: T[]): {
|
|
27
|
+
index: Map<string, T>;
|
|
28
|
+
rejected: string[];
|
|
29
|
+
};
|