@design.estate/wcctools 6.2.0 → 7.0.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/changelog.md +21 -0
- package/dist_shell/bundle.js +4 -4
- package/dist_shell/bundle.js.map +1 -1
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/capture/classes.capturebrowser.d.ts +65 -0
- package/dist_ts/capture/classes.capturebrowser.js +251 -0
- package/dist_ts/capture/classes.captureservice.d.ts +39 -0
- package/dist_ts/capture/classes.captureservice.js +119 -0
- package/dist_ts/capture/classes.screencast.d.ts +47 -0
- package/dist_ts/capture/classes.screencast.js +127 -0
- package/dist_ts/capture/errors.d.ts +14 -0
- package/dist_ts/capture/errors.js +23 -0
- package/dist_ts/capture/images.d.ts +3 -0
- package/dist_ts/capture/images.js +58 -0
- package/dist_ts/capture/index.d.ts +4 -0
- package/dist_ts/capture/index.js +5 -0
- package/dist_ts/capture/interaction.d.ts +11 -0
- package/dist_ts/capture/interaction.js +138 -0
- package/dist_ts/capture/navigationguard.d.ts +44 -0
- package/dist_ts/capture/navigationguard.js +129 -0
- package/dist_ts/capture/previewpage.d.ts +29 -0
- package/dist_ts/capture/previewpage.js +96 -0
- package/dist_ts/capture/request.d.ts +69 -0
- package/dist_ts/capture/request.js +239 -0
- package/dist_ts/classes.devserver.d.ts +25 -9
- package/dist_ts/classes.devserver.js +45 -14
- package/dist_ts/classes.hostpolicy.d.ts +63 -0
- package/dist_ts/classes.hostpolicy.js +171 -0
- package/dist_ts/cli.js +25 -3
- package/dist_ts/cli.screenshot.d.ts +6 -0
- package/dist_ts/cli.screenshot.js +89 -0
- package/dist_ts/plugins.d.ts +6 -2
- package/dist_ts/plugins.js +8 -3
- package/dist_ts_interfaces/capture.d.ts +151 -0
- package/dist_ts_interfaces/capture.js +2 -0
- package/dist_ts_interfaces/index.d.ts +1 -0
- package/dist_ts_interfaces/index.js +2 -1
- package/dist_ts_interfaces/requests.d.ts +24 -0
- package/dist_ts_shell/elements/wcc-recording-panel.d.ts +9 -0
- package/dist_ts_shell/elements/wcc-recording-panel.js +12 -1
- package/dist_ts_shell/services/framesampler.service.d.ts +23 -0
- package/dist_ts_shell/services/framesampler.service.js +101 -0
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +2 -1
- package/readme.md +104 -6
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/capture/classes.capturebrowser.ts +290 -0
- package/ts/capture/classes.captureservice.ts +152 -0
- package/ts/capture/classes.screencast.ts +152 -0
- package/ts/capture/errors.ts +25 -0
- package/ts/capture/images.ts +61 -0
- package/ts/capture/index.ts +4 -0
- package/ts/capture/interaction.ts +146 -0
- package/ts/capture/navigationguard.ts +147 -0
- package/ts/capture/previewpage.ts +130 -0
- package/ts/capture/request.ts +304 -0
- package/ts/classes.devserver.ts +55 -13
- package/ts/classes.hostpolicy.ts +201 -0
- package/ts/cli.screenshot.ts +95 -0
- package/ts/cli.ts +25 -2
- package/ts/plugins.ts +9 -2
- package/ts_interfaces/capture.ts +144 -0
- package/ts_interfaces/index.ts +1 -0
- package/ts_interfaces/requests.ts +39 -0
- package/ts_shell/elements/wcc-recording-panel.ts +12 -0
- package/ts_shell/services/framesampler.service.ts +112 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
package/dist_ts/plugins.js
CHANGED
|
@@ -2,21 +2,26 @@
|
|
|
2
2
|
import * as childProcess from 'node:child_process';
|
|
3
3
|
import * as fs from 'node:fs/promises';
|
|
4
4
|
import * as fsSync from 'node:fs';
|
|
5
|
+
import * as os from 'node:os';
|
|
5
6
|
import * as path from 'node:path';
|
|
6
7
|
import * as url from 'node:url';
|
|
7
|
-
export { childProcess, fs, fsSync, path, url };
|
|
8
|
+
export { childProcess, fs, fsSync, os, path, url };
|
|
8
9
|
// @api.global scope
|
|
9
10
|
import * as typedrequest from '@api.global/typedrequest';
|
|
10
11
|
import * as typedserver from '@api.global/typedserver';
|
|
11
12
|
export { typedrequest, typedserver };
|
|
13
|
+
// @design.estate scope
|
|
14
|
+
import * as deesDomtools from '@design.estate/dees-domtools';
|
|
15
|
+
export { deesDomtools };
|
|
12
16
|
// @git.zone scope
|
|
13
17
|
import * as tswatch from '@git.zone/tswatch';
|
|
14
18
|
export { tswatch };
|
|
15
19
|
// @push.rocks scope
|
|
20
|
+
import * as smartbrowser from '@push.rocks/smartbrowser/automation';
|
|
16
21
|
import * as smartconfig from '@push.rocks/smartconfig';
|
|
17
22
|
import * as smartconsole from '@push.rocks/smartconsole';
|
|
18
23
|
import * as smartexit from '@push.rocks/smartexit';
|
|
19
|
-
export { smartconfig, smartconsole, smartexit };
|
|
24
|
+
export { smartbrowser, smartconfig, smartconsole, smartexit };
|
|
20
25
|
// third party scope
|
|
21
26
|
import typescript from 'typescript';
|
|
22
27
|
export { typescript };
|
|
@@ -24,4 +29,4 @@ export { typescript };
|
|
|
24
29
|
import * as interfaces from '../dist_ts_interfaces/index.js';
|
|
25
30
|
import * as shared from '../dist_ts_shared/index.js';
|
|
26
31
|
export { interfaces, shared };
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxZQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEtBQUssTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEtBQUssSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEtBQUssR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUVoQyxPQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVuRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBRXZELE9BQU8sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFFckMsdUJBQXVCO0FBQ3ZCLE9BQU8sS0FBSyxZQUFZLE1BQU0sOEJBQThCLENBQUM7QUFFN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBRXhCLGtCQUFrQjtBQUNsQixPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUVuQixvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLENBQUM7QUFFOUQsb0JBQW9CO0FBQ3BCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUVwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFFdEIsZ0JBQWdCO0FBQ2hCLE9BQU8sS0FBSyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxLQUFLLE1BQU0sTUFBTSx1QkFBdUIsQ0FBQztBQUVoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDIn0=
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { IWccSelection, TWccTheme } from './bridge.js';
|
|
2
|
+
/**
|
|
3
|
+
* Captures of the catalog's demos: screenshots and interaction frames the `wcctools dev` server
|
|
4
|
+
* takes in a headless browser, and frames the shell samples from a recording.
|
|
5
|
+
*/
|
|
6
|
+
/** The named capture widths: the dees-domtools breakpoints. */
|
|
7
|
+
export type TWccCaptureViewportPreset = 'phone' | 'phablet' | 'tablet' | 'desktop';
|
|
8
|
+
/** A named capture width, or a width in CSS pixels. */
|
|
9
|
+
export type TWccCaptureViewport = TWccCaptureViewportPreset | number;
|
|
10
|
+
/**
|
|
11
|
+
* What a capture shows:
|
|
12
|
+
* - `element`: the rendered instance of the selected element (the first one its demo renders),
|
|
13
|
+
* - `viewport`: the visible preview at the capture's width and height,
|
|
14
|
+
* - `fullpage`: the whole preview document.
|
|
15
|
+
*/
|
|
16
|
+
export type TWccCaptureFraming = 'element' | 'viewport' | 'fullpage';
|
|
17
|
+
export type TWccImageMimeType = 'image/png' | 'image/jpeg';
|
|
18
|
+
/** An encoded image. */
|
|
19
|
+
export interface IWccImage {
|
|
20
|
+
mimeType: TWccImageMimeType;
|
|
21
|
+
/** Width in device pixels. */
|
|
22
|
+
width: number;
|
|
23
|
+
/** Height in device pixels. */
|
|
24
|
+
height: number;
|
|
25
|
+
dataBase64: string;
|
|
26
|
+
}
|
|
27
|
+
/** A frame of a recording or of an observed interaction. */
|
|
28
|
+
export interface IWccTimedFrame extends IWccImage {
|
|
29
|
+
/** Milliseconds since the start of the recording or observation. */
|
|
30
|
+
timestampMs: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The catalog entry a capture renders. `itemName` is an entry's name or its element's tag;
|
|
34
|
+
* without `sectionName` it must name exactly one entry across all sections.
|
|
35
|
+
*/
|
|
36
|
+
export interface IWccCaptureSubject {
|
|
37
|
+
sectionName?: string;
|
|
38
|
+
itemName: string;
|
|
39
|
+
/** 0-based demo index; default 0. */
|
|
40
|
+
demoIndex?: number;
|
|
41
|
+
}
|
|
42
|
+
/** How the headless preview is set up for a capture. */
|
|
43
|
+
export interface IWccCaptureView {
|
|
44
|
+
/** Default `desktop`. */
|
|
45
|
+
viewport?: TWccCaptureViewport;
|
|
46
|
+
/** Height of the preview window in CSS pixels; default 800. */
|
|
47
|
+
height?: number;
|
|
48
|
+
/** Default `dark`. */
|
|
49
|
+
theme?: TWccTheme;
|
|
50
|
+
/** Device pixel ratio, 1 or 2; default 1. */
|
|
51
|
+
scale?: 1 | 2;
|
|
52
|
+
}
|
|
53
|
+
export interface IWccScreenshotRequest extends IWccCaptureView {
|
|
54
|
+
subject: IWccCaptureSubject;
|
|
55
|
+
/** Default `element` for element demos and `fullpage` for pages. */
|
|
56
|
+
framing?: TWccCaptureFraming;
|
|
57
|
+
/** Default `png`. */
|
|
58
|
+
format?: 'png' | 'jpeg';
|
|
59
|
+
/** JPEG quality from 1 to 100; default 80. */
|
|
60
|
+
quality?: number;
|
|
61
|
+
}
|
|
62
|
+
export interface IWccScreenshotResult {
|
|
63
|
+
/** The demo the subject resolved to. */
|
|
64
|
+
selection: IWccSelection;
|
|
65
|
+
framing: TWccCaptureFraming;
|
|
66
|
+
image: IWccImage;
|
|
67
|
+
/** True when a full-page capture was cut at the maximum height. */
|
|
68
|
+
truncated: boolean;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* One step of a scripted interaction. A selector is a CSS selector matched in the preview
|
|
72
|
+
* document and in every open shadow root below it; the first match in document order is used,
|
|
73
|
+
* once it is visible and enabled.
|
|
74
|
+
*/
|
|
75
|
+
export type TWccInteractionStep = {
|
|
76
|
+
action: 'click';
|
|
77
|
+
selector: string;
|
|
78
|
+
} | {
|
|
79
|
+
action: 'hover';
|
|
80
|
+
selector: string;
|
|
81
|
+
}
|
|
82
|
+
/** Replaces the value of an input, textarea, select or contenteditable element. */
|
|
83
|
+
| {
|
|
84
|
+
action: 'fill';
|
|
85
|
+
selector: string;
|
|
86
|
+
text: string;
|
|
87
|
+
}
|
|
88
|
+
/** Presses a key (`Enter`, `Tab`, `a`, …), on the matched element when a selector is given. */
|
|
89
|
+
| {
|
|
90
|
+
action: 'press';
|
|
91
|
+
key: string;
|
|
92
|
+
selector?: string;
|
|
93
|
+
}
|
|
94
|
+
/** Waits until a match is visible, or until none is (`hidden`). */
|
|
95
|
+
| {
|
|
96
|
+
action: 'waitFor';
|
|
97
|
+
selector: string;
|
|
98
|
+
state?: 'visible' | 'hidden';
|
|
99
|
+
}
|
|
100
|
+
/** Observes for a fixed time, for example an animation. */
|
|
101
|
+
| {
|
|
102
|
+
action: 'wait';
|
|
103
|
+
ms: number;
|
|
104
|
+
};
|
|
105
|
+
export interface IWccInteractionRequest extends IWccCaptureView {
|
|
106
|
+
subject: IWccCaptureSubject;
|
|
107
|
+
steps: TWccInteractionStep[];
|
|
108
|
+
/** How long to keep observing after the last step, in milliseconds; default 500. */
|
|
109
|
+
observeMs?: number;
|
|
110
|
+
/** The most frames to return, spread over the observation; default 12. */
|
|
111
|
+
maxFrames?: number;
|
|
112
|
+
/** JPEG quality of the frames from 1 to 100; default 70. */
|
|
113
|
+
frameQuality?: number;
|
|
114
|
+
/** Also take a screenshot once the steps ran, framed as a screenshot request would be. */
|
|
115
|
+
finalScreenshot?: {
|
|
116
|
+
framing?: TWccCaptureFraming;
|
|
117
|
+
format?: 'png' | 'jpeg';
|
|
118
|
+
quality?: number;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export interface IWccInteractionStepResult {
|
|
122
|
+
index: number;
|
|
123
|
+
ok: boolean;
|
|
124
|
+
/** Why the step failed; the steps after a failed one do not run. */
|
|
125
|
+
error?: string;
|
|
126
|
+
/** Milliseconds since the start of the observation. */
|
|
127
|
+
startMs: number;
|
|
128
|
+
endMs: number;
|
|
129
|
+
}
|
|
130
|
+
export interface IWccInteractionResult {
|
|
131
|
+
selection: IWccSelection;
|
|
132
|
+
/** Viewport frames in time order, timestamped from the start of the observation. */
|
|
133
|
+
frames: IWccTimedFrame[];
|
|
134
|
+
steps: IWccInteractionStepResult[];
|
|
135
|
+
/** True when every step ran. */
|
|
136
|
+
completed: boolean;
|
|
137
|
+
finalImage?: IWccImage;
|
|
138
|
+
}
|
|
139
|
+
/** How frames are sampled from a recording. */
|
|
140
|
+
export interface IWccFrameSamplingOptions {
|
|
141
|
+
/** Number of frames, spread evenly over the range; default 8, at most 32. */
|
|
142
|
+
count?: number;
|
|
143
|
+
/** Start of the range in seconds; default the start of the recording. */
|
|
144
|
+
startS?: number;
|
|
145
|
+
/** End of the range in seconds; default the end of the recording. */
|
|
146
|
+
endS?: number;
|
|
147
|
+
/** Frames wider than this are scaled down; default 960. */
|
|
148
|
+
maxWidth?: number;
|
|
149
|
+
/** JPEG quality from 0 to 1; default 0.8. */
|
|
150
|
+
quality?: number;
|
|
151
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from './catalog.js';
|
|
2
2
|
export * from './bridge.js';
|
|
3
|
+
export * from './capture.js';
|
|
3
4
|
export * from './requests.js';
|
|
4
5
|
export * from './standard.js';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19pbnRlcmZhY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsZUFBZSxDQUFDIn0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
import type { IWccInteractionRequest, IWccInteractionResult, IWccScreenshotRequest, IWccScreenshotResult } from './capture.js';
|
|
2
3
|
/**
|
|
3
4
|
* Typed requests the shell sends to the `wcctools dev` server on `/wcctools/typedrequest`.
|
|
4
5
|
*/
|
|
@@ -48,3 +49,26 @@ export interface IReq_GetBundleStatus extends plugins.typedrequestInterfaces.imp
|
|
|
48
49
|
};
|
|
49
50
|
response: IWccBundleStatusSnapshot;
|
|
50
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Screenshots one demo in the dev server's headless browser. A capture waits while a catalog
|
|
54
|
+
* bundle builds, and is refused with a typed error when a bundle failed, when the subject does not
|
|
55
|
+
* resolve to a rendered demo, when the browser is busy with other captures, when the demo
|
|
56
|
+
* navigates away from the preview, or on its deadline of 30 seconds.
|
|
57
|
+
*/
|
|
58
|
+
export interface IReq_CaptureScreenshot extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CaptureScreenshot> {
|
|
59
|
+
method: 'captureScreenshot';
|
|
60
|
+
request: IWccScreenshotRequest;
|
|
61
|
+
response: IWccScreenshotResult;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Renders one demo in the dev server's headless browser, runs the scripted steps on it and
|
|
65
|
+
* returns the frames it observed meanwhile. A failed step ends the script and is reported in the
|
|
66
|
+
* result, as is a step that started a navigation away from the preview, which the browser blocked;
|
|
67
|
+
* refusals are those of `captureScreenshot`. Its deadline is 135 seconds, and `TypedRequest.fire()`
|
|
68
|
+
* gives up after 60 by default: fire it with a `timeoutMs` above the deadline.
|
|
69
|
+
*/
|
|
70
|
+
export interface IReq_CaptureInteraction extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CaptureInteraction> {
|
|
71
|
+
method: 'captureInteraction';
|
|
72
|
+
request: IWccInteractionRequest;
|
|
73
|
+
response: IWccInteractionResult;
|
|
74
|
+
}
|
|
@@ -27,6 +27,15 @@ export declare class WccRecordingPanel extends DeesElement {
|
|
|
27
27
|
private handleMicrophoneChange;
|
|
28
28
|
private startRecording;
|
|
29
29
|
stopRecording(): void;
|
|
30
|
+
/**
|
|
31
|
+
* The finished recording shown for preview, with its trim range in seconds, or null while there
|
|
32
|
+
* is none. `sampleVideoFrames` (services/framesampler.service.ts) samples frames from it.
|
|
33
|
+
*/
|
|
34
|
+
getRecording(): {
|
|
35
|
+
blob: Blob;
|
|
36
|
+
trimStartS: number;
|
|
37
|
+
trimEndS: number;
|
|
38
|
+
} | null;
|
|
30
39
|
private handleRecordingComplete;
|
|
31
40
|
private discardRecording;
|
|
32
41
|
private downloadRecording;
|
|
@@ -913,6 +913,17 @@ let WccRecordingPanel = (() => {
|
|
|
913
913
|
stopRecording() {
|
|
914
914
|
this.recorderService.stopRecording();
|
|
915
915
|
}
|
|
916
|
+
/**
|
|
917
|
+
* The finished recording shown for preview, with its trim range in seconds, or null while there
|
|
918
|
+
* is none. `sampleVideoFrames` (services/framesampler.service.ts) samples frames from it.
|
|
919
|
+
*/
|
|
920
|
+
getRecording() {
|
|
921
|
+
const blob = this.recorderService.recordedBlob;
|
|
922
|
+
if (!blob || this.panelState !== 'preview') {
|
|
923
|
+
return null;
|
|
924
|
+
}
|
|
925
|
+
return { blob, trimStartS: this.trimStart, trimEndS: this.trimEnd };
|
|
926
|
+
}
|
|
916
927
|
handleRecordingComplete(blob) {
|
|
917
928
|
if (this.previewVideoUrl) {
|
|
918
929
|
URL.revokeObjectURL(this.previewVideoUrl);
|
|
@@ -1096,4 +1107,4 @@ let WccRecordingPanel = (() => {
|
|
|
1096
1107
|
return WccRecordingPanel = _classThis;
|
|
1097
1108
|
})();
|
|
1098
1109
|
export { WccRecordingPanel };
|
|
1099
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjLXJlY29yZGluZy1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3NoZWxsL2VsZW1lbnRzL3djYy1yZWNvcmRpbmctcGFuZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMxSCxPQUFPLEVBQUUsZUFBZSxFQUFzQixNQUFNLGlDQUFpQyxDQUFDO0lBR3pFLGlCQUFpQjs0QkFEN0IsYUFBYSxDQUFDLHFCQUFxQixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUNBQW5CLFNBQVEsV0FBVzs7Ozt5Q0FFL0MsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO3NDQUk5QixLQUFLLEVBQUU7eUNBSVAsS0FBSyxFQUFFO3dDQUdQLEtBQUssRUFBRTt3Q0FHUCxLQUFLLEVBQUU7Z0RBR1AsS0FBSyxFQUFFO2dEQUdQLEtBQUssRUFBRTtzQ0FHUCxLQUFLLEVBQUU7NkNBSVAsS0FBSyxFQUFFOzJDQUlQLEtBQUssRUFBRTtxQ0FHUCxLQUFLLEVBQUU7bUNBR1AsS0FBSyxFQUFFO3lDQUdQLEtBQUssRUFBRTswQ0FHUCxLQUFLLEVBQUU7dUNBR1AsS0FBSyxFQUFFO1lBN0NSLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBNEI7WUFJbEQsbUxBQVMsVUFBVSw2QkFBVixVQUFVLCtGQUFrRDtZQUlyRSw0TEFBUyxhQUFhLDZCQUFiLGFBQWEscUdBQXFDO1lBRzNELHlMQUFTLFlBQVksNkJBQVosWUFBWSxtR0FBd0I7WUFHN0MseUxBQVMsWUFBWSw2QkFBWixZQUFZLG1HQUFrQjtZQUd2QyxpTkFBUyxvQkFBb0IsNkJBQXBCLG9CQUFvQixtSEFBYztZQUczQyxpTkFBUyxvQkFBb0IsNkJBQXBCLG9CQUFvQixtSEFBeUI7WUFHdEQsbUxBQVMsVUFBVSw2QkFBVixVQUFVLCtGQUFhO1lBSWhDLHdNQUFTLGlCQUFpQiw2QkFBakIsaUJBQWlCLDZHQUFhO1lBSXZDLGtNQUFTLGVBQWUsNkJBQWYsZUFBZSx5R0FBYztZQUd0QyxnTEFBUyxTQUFTLDZCQUFULFNBQVMsNkZBQWE7WUFHL0IsMEtBQVMsT0FBTyw2QkFBUCxPQUFPLHlGQUFhO1lBRzdCLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBYTtZQUduQywrTEFBUyxjQUFjLDZCQUFkLGNBQWMsdUdBQWdDO1lBR3ZELHNMQUFTLFdBQVcsNkJBQVgsV0FBVyxpR0FBa0I7WUFqRHhDLDZLQXcrQkM7Ozs7UUFyK0JDLHVGQUE2QyxJQUFJLEVBQUM7UUFGbEQsaUZBQWlGO1FBRWpGLElBQVMsYUFBYSxtREFBNEI7UUFBbEQsSUFBUyxhQUFhLHlEQUE0QjtRQUlsRCw2SUFBMkQsU0FBUyxHQUFDO1FBRnJFLGNBQWM7UUFFZCxJQUFTLFVBQVUsZ0RBQWtEO1FBQXJFLElBQVMsVUFBVSxzREFBa0Q7UUFJckUsZ0pBQWdELFVBQVUsR0FBQztRQUYzRCxvQkFBb0I7UUFFcEIsSUFBUyxhQUFhLG1EQUFxQztRQUEzRCxJQUFTLGFBQWEseURBQXFDO1FBRzNELGlKQUF1QyxLQUFLLEdBQUM7UUFBN0MsSUFBUyxZQUFZLGtEQUF3QjtRQUE3QyxJQUFTLFlBQVksd0RBQXdCO1FBRzdDLGdKQUFpQyxLQUFLLEdBQUM7UUFBdkMsSUFBUyxZQUFZLGtEQUFrQjtRQUF2QyxJQUFTLFlBQVksd0RBQWtCO1FBR3ZDLGdLQUF3QyxFQUFFLEdBQUM7UUFBM0MsSUFBUyxvQkFBb0IsMERBQWM7UUFBM0MsSUFBUyxvQkFBb0IsZ0VBQWM7UUFHM0Msd0tBQW1ELEVBQUUsR0FBQztRQUF0RCxJQUFTLG9CQUFvQiwwREFBeUI7UUFBdEQsSUFBUyxvQkFBb0IsZ0VBQXlCO1FBR3RELG9KQUE4QixDQUFDLEdBQUM7UUFBaEMsSUFBUyxVQUFVLGdEQUFhO1FBQWhDLElBQVMsVUFBVSxzREFBYTtRQUloQyx3SkFBcUMsQ0FBQyxHQUFDO1FBRnZDLGtCQUFrQjtRQUVsQixJQUFTLGlCQUFpQix1REFBYTtRQUF2QyxJQUFTLGlCQUFpQiw2REFBYTtRQUl2QywySkFBbUMsRUFBRSxHQUFDO1FBRnRDLHFCQUFxQjtRQUVyQixJQUFTLGVBQWUscURBQWM7UUFBdEMsSUFBUyxlQUFlLDJEQUFjO1FBR3RDLDZJQUE2QixDQUFDLEdBQUM7UUFBL0IsSUFBUyxTQUFTLCtDQUFhO1FBQS9CLElBQVMsU0FBUyxxREFBYTtRQUcvQixtSUFBMkIsQ0FBQyxHQUFDO1FBQTdCLElBQVMsT0FBTyw2Q0FBYTtRQUE3QixJQUFTLE9BQU8sbURBQWE7UUFHN0IsNklBQWlDLENBQUMsR0FBQztRQUFuQyxJQUFTLGFBQWEsbURBQWE7UUFBbkMsSUFBUyxhQUFhLHlEQUFhO1FBR25DLHFKQUFrRCxJQUFJLEdBQUM7UUFBdkQsSUFBUyxjQUFjLG9EQUFnQztRQUF2RCxJQUFTLGNBQWMsMERBQWdDO1FBR3ZELGdKQUFnQyxLQUFLLEdBQUM7UUFBdEMsSUFBUyxXQUFXLGlEQUFrQjtRQUF0QyxJQUFTLFdBQVcsdURBQWtCO1FBRXRDLG1CQUFtQjtRQUNYLGVBQWUsMkRBQWtCO1FBRXpDO1lBQ0UsS0FBSyxFQUFFLENBQUM7WUFDUixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUFDO2dCQUN6QyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO29CQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDO29CQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFO3dCQUNwRCxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUU7d0JBQ3BCLE9BQU8sRUFBRSxJQUFJO3dCQUNiLFFBQVEsRUFBRSxJQUFJO3FCQUNmLENBQUMsQ0FBQyxDQUFDO2dCQUNOLENBQUM7Z0JBQ0QsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDNUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO2dCQUNELGtCQUFrQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixDQUFDO2dCQUNELGFBQWEsRUFBRSxHQUFHLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFTSxNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ3JCLEdBQUcsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQThkRjtTQUNGLENBQUM7UUFFSyxNQUFNO1lBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNsQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ25DLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ25DLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQSxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUVPLGtCQUFrQjtZQUN4QixPQUFPLElBQUksQ0FBQTs7OzsyREFJNEMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTs7Ozs7Ozs0Q0FPakMsSUFBSSxDQUFDLGFBQWEsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTt5QkFDdEUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVOzs7Ozs0Q0FLbEIsSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTt5QkFDcEUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFROzs7Ozs7Ozs7Ozs0Q0FXaEIsSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTt5QkFDaEUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLOzs7Ozs0Q0FLWixJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO3lCQUNqRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU07Ozs7Ozs7Ozs7Ozs7MkJBYTlCLElBQUksQ0FBQyxZQUFZOzBCQUNsQixDQUFDLENBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFFLENBQUMsQ0FBQyxNQUEyQixDQUFDLE9BQU8sQ0FBQzs7Ozs7Y0FLeEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBOzs7eUJBR2IsSUFBSSxDQUFDLG9CQUFvQjswQkFDeEIsQ0FBQyxDQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBRSxDQUFDLENBQUMsTUFBNEIsQ0FBQyxLQUFLLENBQUM7OztrQkFHeEYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQTtrQ0FDekIsR0FBRyxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLGNBQWMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO2lCQUN0RixDQUFDOzs7Z0JBR0YsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7Ozs7a0VBSWtCLElBQUksQ0FBQyxVQUFVOzs7ZUFHbEUsQ0FBQyxDQUFDLENBQUMsSUFBSTthQUNULENBQUMsQ0FBQyxDQUFDLElBQUk7Ozt1REFHbUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTs7Ozs7O0tBTTdFLENBQUM7UUFDSixDQUFDO1FBRU8sa0JBQWtCO1lBQ3hCLE9BQU8sSUFBSSxDQUFBO2tEQUNtQyxDQUFDLENBQVEsRUFBRSxFQUFFO2dCQUN2RCxJQUFLLENBQUMsQ0FBQyxNQUFzQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUFDO29CQUMxRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUM7Ozs7eURBSWtELEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTs7Ozs7O3NCQU1oRSxJQUFJLENBQUMsZUFBZTs7a0NBRVIsQ0FBQyxDQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsTUFBMEIsQ0FBQzs7Ozs7Ozs7O29CQVNoRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzlELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWE7Z0JBQ3ZELENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHO2dCQUN6RSxDQUFDLENBQUMsRUFBRTs7Ozs7OzZCQU1LLENBQUMsQ0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDOzZCQUM5QyxDQUFDLENBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQzsyQkFDL0MsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFOzhCQUMvQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUU7Ozs7O2lDQUsvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7O2lDQUl2RyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzsrQkFDN0MsQ0FBQyxDQUFhLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQzs7OztpQ0FJeEUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7K0JBQzNDLENBQUMsQ0FBYSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7Ozs7O3dCQUsvRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUMvQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7O3lEQUlaLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Ozt5REFHdEIsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFOzs7Ozs7OzsyREFRaEMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFOzs7MEJBRzlELElBQUksQ0FBQyxXQUFXO3VCQUNuQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7O2dCQUVyQyxJQUFJLENBQUMsV0FBVztnQkFDaEIsQ0FBQyxDQUFDLElBQUksQ0FBQSx1Q0FBdUMsSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3BILENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTs7Ozs7S0FLdkUsQ0FBQztRQUNKLENBQUM7UUFFRCwwREFBMEQ7UUFFbEQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQWdCO1lBQzlDLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO1lBQzVCLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osSUFBSSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdFLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7b0JBQ2xFLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDN0UsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsZUFBZSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7UUFDSCxDQUFDO1FBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLFFBQWdCO1lBQ25ELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxRQUFRLENBQUM7WUFDckMsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDNUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFFRCw4REFBOEQ7UUFFdEQsS0FBSyxDQUFDLGNBQWM7WUFDMUIsSUFBSSxDQUFDO2dCQUNILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUV4RyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDO29CQUN4QyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWE7b0JBQ3hCLGFBQWEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLFNBQVM7b0JBQ3hFLGVBQWU7aUJBQ2hCLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsRUFBRTtvQkFDcEQsT0FBTyxFQUFFLElBQUk7b0JBQ2IsUUFBUSxFQUFFLElBQUk7aUJBQ2YsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUVNLGFBQWE7WUFDbEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QyxDQUFDO1FBRU8sdUJBQXVCLENBQUMsSUFBVTtZQUN4QyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksV0FBVyxDQUFDLGdCQUFnQixFQUFFO2dCQUNuRCxPQUFPLEVBQUUsSUFBSTtnQkFDYixRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztRQUVPLGdCQUFnQjtZQUN0QixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBQzVCLENBQUM7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQztRQUVPLEtBQUssQ0FBQyxpQkFBaUI7WUFDN0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7WUFDdkQsSUFBSSxDQUFDLFlBQVk7Z0JBQUUsT0FBTztZQUUxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUV4QixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxjQUFvQixDQUFDO2dCQUV6QixtREFBbUQ7Z0JBQ25ELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLENBQUM7Z0JBRWxGLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLENBQXFCLENBQUM7b0JBQ25GLElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ1YsY0FBYyxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3RHLENBQUM7eUJBQU0sQ0FBQzt3QkFDTixjQUFjLEdBQUcsWUFBWSxDQUFDO29CQUNoQyxDQUFDO2dCQUNILENBQUM7cUJBQU0sQ0FBQztvQkFDTixjQUFjLEdBQUcsWUFBWSxDQUFDO2dCQUNoQyxDQUFDO2dCQUVELDRDQUE0QztnQkFDNUMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUNoQyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0UsQ0FBQztnQkFFRCxtQkFBbUI7Z0JBQ25CLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQ3pELE1BQU0sUUFBUSxHQUFHLHNCQUFzQixTQUFTLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBRTFELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUNiLENBQUMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO2dCQUN0QixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNWLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUV6QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUMzQixDQUFDO1FBQ0gsQ0FBQztRQUVELHlEQUF5RDtRQUVqRCxpQkFBaUIsQ0FBQyxLQUF1QjtZQUMvQywrREFBK0Q7WUFDL0QsOENBQThDO1lBQzlDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7WUFDM0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7WUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUM7UUFDMUIsQ0FBQztRQUVPLGNBQWMsQ0FBQyxPQUFlO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkYsQ0FBQztRQUVPLHNCQUFzQixDQUFDLElBQVk7WUFDekMsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxNQUFNLENBQUM7WUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDN0MsK0VBQStFO1lBQy9FLG1DQUFtQztZQUNuQyxtREFBbUQ7WUFDbkQsT0FBTyxlQUFlLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUM5RixDQUFDO1FBRU8sNkJBQTZCLENBQUMsSUFBWTtZQUNoRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQztnQkFBRSxPQUFPLE1BQU0sQ0FBQztZQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUM3QyxNQUFNLG1CQUFtQixHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDM0MscURBQXFEO1lBQ3JELDJEQUEyRDtZQUMzRCxxRUFBcUU7WUFDckUsT0FBTyxlQUFlLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDaEgsQ0FBQztRQUVPLG1CQUFtQixDQUFDLENBQWE7WUFDdkMsSUFBSSxJQUFJLENBQUMsY0FBYztnQkFBRSxPQUFPO1lBRWhDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxhQUE0QixDQUFDO1lBQ2hELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sSUFBSSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBRTdDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixDQUFxQixDQUFDO1lBQ25GLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFFTyxrQkFBa0IsQ0FBQyxDQUFhO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztnQkFBRSxPQUFPO1lBRWpDLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxhQUE0QixDQUFDO1lBQ2hELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzlDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFFLE1BQU0sSUFBSSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBRTdDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztZQUV0QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0MsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBcUIsQ0FBQztZQUNuRixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDdEYsQ0FBQztRQUNILENBQUM7UUFFTyxxQkFBcUI7WUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDN0IsQ0FBQztRQUVPLFNBQVM7WUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFFbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLENBQXFCLENBQUM7WUFDbkYsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixLQUFLLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztZQUN4QixDQUFDO1FBQ0gsQ0FBQztRQUVPLHFCQUFxQjtZQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBcUIsQ0FBQztZQUNuRixJQUFJLENBQUMsS0FBSztnQkFBRSxPQUFPO1lBRW5CLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNuQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFYixNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3JCLElBQUksS0FBSyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZCxLQUFLLENBQUMsbUJBQW1CLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsc0RBQXNEO1FBRTlDLEtBQUs7WUFDWCxJQUFJLENBQUMsZUFBZSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDM0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFDLE9BQU8sRUFBRSxJQUFJO2dCQUNiLFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO1FBRUQsS0FBSyxDQUFDLG9CQUFvQjtZQUN4QixNQUFNLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDSCxDQUFDOztZQXYrQlUsdURBQWlCOzs7OztTQUFqQixpQkFBaUIifQ==
|
|
1110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2NjLXJlY29yZGluZy1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3NoZWxsL2VsZW1lbnRzL3djYy1yZWNvcmRpbmctcGFuZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMxSCxPQUFPLEVBQUUsZUFBZSxFQUFzQixNQUFNLGlDQUFpQyxDQUFDO0lBR3pFLGlCQUFpQjs0QkFEN0IsYUFBYSxDQUFDLHFCQUFxQixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUNBQW5CLFNBQVEsV0FBVzs7Ozt5Q0FFL0MsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO3NDQUk5QixLQUFLLEVBQUU7eUNBSVAsS0FBSyxFQUFFO3dDQUdQLEtBQUssRUFBRTt3Q0FHUCxLQUFLLEVBQUU7Z0RBR1AsS0FBSyxFQUFFO2dEQUdQLEtBQUssRUFBRTtzQ0FHUCxLQUFLLEVBQUU7NkNBSVAsS0FBSyxFQUFFOzJDQUlQLEtBQUssRUFBRTtxQ0FHUCxLQUFLLEVBQUU7bUNBR1AsS0FBSyxFQUFFO3lDQUdQLEtBQUssRUFBRTswQ0FHUCxLQUFLLEVBQUU7dUNBR1AsS0FBSyxFQUFFO1lBN0NSLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBNEI7WUFJbEQsbUxBQVMsVUFBVSw2QkFBVixVQUFVLCtGQUFrRDtZQUlyRSw0TEFBUyxhQUFhLDZCQUFiLGFBQWEscUdBQXFDO1lBRzNELHlMQUFTLFlBQVksNkJBQVosWUFBWSxtR0FBd0I7WUFHN0MseUxBQVMsWUFBWSw2QkFBWixZQUFZLG1HQUFrQjtZQUd2QyxpTkFBUyxv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
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type * as plugins from '../plugins.js';
|
|
2
|
+
type IWccTimedFrame = plugins.interfaces.IWccTimedFrame;
|
|
3
|
+
type IWccFrameSamplingOptions = plugins.interfaces.IWccFrameSamplingOptions;
|
|
4
|
+
/** The limits of a frame sampling. */
|
|
5
|
+
export declare const frameSamplingLimits: {
|
|
6
|
+
readonly defaultCount: 8;
|
|
7
|
+
readonly maxCount: 32;
|
|
8
|
+
readonly defaultMaxWidth: 960;
|
|
9
|
+
readonly minMaxWidth: 64;
|
|
10
|
+
readonly maxMaxWidth: 3840;
|
|
11
|
+
readonly defaultQuality: 0.8;
|
|
12
|
+
};
|
|
13
|
+
/** Thrown when a recording cannot be sampled as asked. */
|
|
14
|
+
export declare class FrameSamplingError extends Error {
|
|
15
|
+
constructor(messageArg: string);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Samples timestamped JPEG frames from a recording (a WebM or MP4 blob, as the recorder produces):
|
|
19
|
+
* `count` frames at the middles of as many equal parts of the range, each the frame on screen at
|
|
20
|
+
* that time, scaled down to `maxWidth`. Frames that repeat one already sampled are left out.
|
|
21
|
+
*/
|
|
22
|
+
export declare const sampleVideoFrames: (recordingArg: Blob, optionsArg?: IWccFrameSamplingOptions) => Promise<IWccTimedFrame[]>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/** The limits of a frame sampling. */
|
|
2
|
+
export const frameSamplingLimits = {
|
|
3
|
+
defaultCount: 8,
|
|
4
|
+
maxCount: 32,
|
|
5
|
+
defaultMaxWidth: 960,
|
|
6
|
+
minMaxWidth: 64,
|
|
7
|
+
maxMaxWidth: 3840,
|
|
8
|
+
defaultQuality: 0.8,
|
|
9
|
+
};
|
|
10
|
+
/** Thrown when a recording cannot be sampled as asked. */
|
|
11
|
+
export class FrameSamplingError extends Error {
|
|
12
|
+
constructor(messageArg) {
|
|
13
|
+
super(messageArg);
|
|
14
|
+
this.name = 'FrameSamplingError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const encodeBase64 = async (blobArg) => {
|
|
18
|
+
const bytes = new Uint8Array(await blobArg.arrayBuffer());
|
|
19
|
+
let binary = '';
|
|
20
|
+
// In chunks: String.fromCharCode takes a bounded number of arguments
|
|
21
|
+
for (let offset = 0; offset < bytes.length; offset += 0x8000) {
|
|
22
|
+
binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));
|
|
23
|
+
}
|
|
24
|
+
return btoa(binary);
|
|
25
|
+
};
|
|
26
|
+
const encodeJpeg = (canvasArg, qualityArg) => {
|
|
27
|
+
if (canvasArg instanceof OffscreenCanvas) {
|
|
28
|
+
return canvasArg.convertToBlob({ type: 'image/jpeg', quality: qualityArg });
|
|
29
|
+
}
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
canvasArg.toBlob((blobArg) => {
|
|
32
|
+
if (blobArg) {
|
|
33
|
+
resolve(blobArg);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
reject(new FrameSamplingError('wcctools: a recording frame could not be encoded as JPEG.'));
|
|
37
|
+
}
|
|
38
|
+
}, 'image/jpeg', qualityArg);
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Samples timestamped JPEG frames from a recording (a WebM or MP4 blob, as the recorder produces):
|
|
43
|
+
* `count` frames at the middles of as many equal parts of the range, each the frame on screen at
|
|
44
|
+
* that time, scaled down to `maxWidth`. Frames that repeat one already sampled are left out.
|
|
45
|
+
*/
|
|
46
|
+
export const sampleVideoFrames = async (recordingArg, optionsArg = {}) => {
|
|
47
|
+
const count = optionsArg.count ?? frameSamplingLimits.defaultCount;
|
|
48
|
+
if (!Number.isInteger(count) || count < 1 || count > frameSamplingLimits.maxCount) {
|
|
49
|
+
throw new FrameSamplingError(`wcctools: the frame count must be a whole number from 1 to ${frameSamplingLimits.maxCount}.`);
|
|
50
|
+
}
|
|
51
|
+
const maxWidth = optionsArg.maxWidth ?? frameSamplingLimits.defaultMaxWidth;
|
|
52
|
+
if (!Number.isInteger(maxWidth) || maxWidth < frameSamplingLimits.minMaxWidth || maxWidth > frameSamplingLimits.maxMaxWidth) {
|
|
53
|
+
throw new FrameSamplingError(`wcctools: maxWidth must be a whole number from ${frameSamplingLimits.minMaxWidth} to ${frameSamplingLimits.maxMaxWidth}.`);
|
|
54
|
+
}
|
|
55
|
+
const quality = optionsArg.quality ?? frameSamplingLimits.defaultQuality;
|
|
56
|
+
if (!(quality > 0 && quality <= 1)) {
|
|
57
|
+
throw new FrameSamplingError('wcctools: the quality must be above 0 and at most 1.');
|
|
58
|
+
}
|
|
59
|
+
const { Input, BlobSource, CanvasSink, ALL_FORMATS } = await import('mediabunny');
|
|
60
|
+
const input = new Input({ source: new BlobSource(recordingArg), formats: ALL_FORMATS });
|
|
61
|
+
try {
|
|
62
|
+
const track = await input.getPrimaryVideoTrack();
|
|
63
|
+
if (!track) {
|
|
64
|
+
throw new FrameSamplingError('wcctools: the recording has no video track.');
|
|
65
|
+
}
|
|
66
|
+
if (!(await track.canDecode())) {
|
|
67
|
+
throw new FrameSamplingError(`wcctools: this browser cannot decode the recording's ${track.codec ?? 'unknown'} video.`);
|
|
68
|
+
}
|
|
69
|
+
const firstTimestamp = await track.getFirstTimestamp();
|
|
70
|
+
const duration = await track.computeDuration();
|
|
71
|
+
const startS = Math.max(optionsArg.startS ?? firstTimestamp, firstTimestamp);
|
|
72
|
+
const endS = Math.min(optionsArg.endS ?? duration, duration);
|
|
73
|
+
if (!(endS > startS)) {
|
|
74
|
+
throw new FrameSamplingError(`wcctools: the range ${startS}–${endS} s holds no frames of the ${duration} s recording.`);
|
|
75
|
+
}
|
|
76
|
+
const sink = new CanvasSink(track, track.displayWidth > maxWidth ? { width: maxWidth } : {});
|
|
77
|
+
const step = (endS - startS) / count;
|
|
78
|
+
const timestamps = Array.from({ length: count }, (_, indexArg) => startS + step * (indexArg + 0.5));
|
|
79
|
+
const frames = [];
|
|
80
|
+
let previousTimestamp = null;
|
|
81
|
+
for await (const wrapped of sink.canvasesAtTimestamps(timestamps)) {
|
|
82
|
+
if (!wrapped || wrapped.timestamp === previousTimestamp) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
previousTimestamp = wrapped.timestamp;
|
|
86
|
+
const jpeg = await encodeJpeg(wrapped.canvas, quality);
|
|
87
|
+
frames.push({
|
|
88
|
+
mimeType: 'image/jpeg',
|
|
89
|
+
width: wrapped.canvas.width,
|
|
90
|
+
height: wrapped.canvas.height,
|
|
91
|
+
dataBase64: await encodeBase64(jpeg),
|
|
92
|
+
timestampMs: Math.round(wrapped.timestamp * 1000),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return frames;
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
input.dispose();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWVzYW1wbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90c19zaGVsbC9zZXJ2aWNlcy9mcmFtZXNhbXBsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxzQ0FBc0M7QUFDdEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsWUFBWSxFQUFFLENBQUM7SUFDZixRQUFRLEVBQUUsRUFBRTtJQUNaLGVBQWUsRUFBRSxHQUFHO0lBQ3BCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsY0FBYyxFQUFFLEdBQUc7Q0FDWCxDQUFDO0FBRVgsMERBQTBEO0FBQzFELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxLQUFLO0lBQzNDLFlBQVksVUFBa0I7UUFDNUIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBRUQsTUFBTSxZQUFZLEdBQUcsS0FBSyxFQUFFLE9BQWEsRUFBbUIsRUFBRTtJQUM1RCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzFELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixxRUFBcUU7SUFDckUsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzdELE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUVGLE1BQU0s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
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@design.estate/wcctools',
|
|
6
|
-
version: '
|
|
6
|
+
version: '7.0.0',
|
|
7
7
|
description: 'A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUseUJBQXlCO0lBQy9CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxtSkFBbUo7Q0FDakssQ0FBQSJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@design.estate/wcctools",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A set of web component tools for creating element catalogues, enabling the structured development and documentation of custom elements and pages.",
|
|
6
6
|
"bin": {
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"@design.estate/dees-domtools": "^5.0.0",
|
|
21
21
|
"@design.estate/dees-element": "^4.0.0",
|
|
22
22
|
"@git.zone/tswatch": "^7.0.0",
|
|
23
|
+
"@push.rocks/smartbrowser": "^5.1.0",
|
|
23
24
|
"@push.rocks/smartconfig": "^6.3.0",
|
|
24
25
|
"@push.rocks/smartconsole": "^2.1.0",
|
|
25
26
|
"@push.rocks/smartexit": "^2.2.0",
|