speechrecorderng 3.10.13 → 3.11.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/README.md +1 -1
- package/fesm2022/speechrecorderng.mjs +204 -201
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/responsive_component.d.ts +1 -1
- package/package.json +13 -15
- package/esm2022/lib/action/action.mjs +0 -73
- package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
- package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
- package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2022/lib/audio/audio_display.mjs +0 -118
- package/esm2022/lib/audio/audio_player.mjs +0 -238
- package/esm2022/lib/audio/capture/capture.mjs +0 -855
- package/esm2022/lib/audio/context.mjs +0 -79
- package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
- package/esm2022/lib/audio/format.mjs +0 -20
- package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
- package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
- package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2022/lib/audio/io/stream.mjs +0 -59
- package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2022/lib/audio/persistor.mjs +0 -81
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
- package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
- package/esm2022/lib/audio/playback/player.mjs +0 -402
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
- package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
- package/esm2022/lib/audio/ui/common.mjs +0 -19
- package/esm2022/lib/audio/ui/container.mjs +0 -414
- package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2022/lib/db/inddb.mjs +0 -120
- package/esm2022/lib/dsp/utils.mjs +0 -48
- package/esm2022/lib/environment/environment.defaults.mjs +0 -9
- package/esm2022/lib/io/BinaryReader.mjs +0 -93
- package/esm2022/lib/io/BinaryWriter.mjs +0 -80
- package/esm2022/lib/io/stream.mjs +0 -259
- package/esm2022/lib/math/2d/geometry.mjs +0 -28
- package/esm2022/lib/math/complex.mjs +0 -58
- package/esm2022/lib/math/dft.mjs +0 -196
- package/esm2022/lib/media/utils.mjs +0 -14
- package/esm2022/lib/net/uploader.mjs +0 -367
- package/esm2022/lib/recorder_component.mjs +0 -65
- package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
- package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2022/lib/speechrecorder/recording.mjs +0 -124
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
- package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
- package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
- package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
- package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
- package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
- package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
- package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2022/lib/speechrecorderng.component.mjs +0 -392
- package/esm2022/lib/speechrecorderng.module.mjs +0 -97
- package/esm2022/lib/spr.config.mjs +0 -27
- package/esm2022/lib/spr.module.version.mjs +0 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
- package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
- package/esm2022/lib/ui/message_dialog.mjs +0 -51
- package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2022/lib/ui/responsive_component.mjs +0 -24
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
- package/esm2022/lib/utils/ua-parser.mjs +0 -190
- package/esm2022/lib/utils/utils.mjs +0 -132
- package/esm2022/lib/utils/wake_lock.mjs +0 -114
- package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
- package/esm2022/public-api.mjs +0 -35
- package/esm2022/speechrecorderng.mjs +0 -5
|
@@ -1,238 +0,0 @@
|
|
|
1
|
-
import { Component, ViewChild, Input, } from '@angular/core';
|
|
2
|
-
import { AudioClip } from './persistor';
|
|
3
|
-
import { AudioPlayer, EventType } from './playback/player';
|
|
4
|
-
import { Action } from "../action/action";
|
|
5
|
-
import { AudioDisplayScrollPane } from "./ui/audio_display_scroll_pane";
|
|
6
|
-
import { AudioContextProvider } from "./context";
|
|
7
|
-
import { AudioBufferSource, AudioDataHolder } from "./audio_data_holder";
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/router";
|
|
10
|
-
import * as i2 from "./ui/audio_display_scroll_pane";
|
|
11
|
-
import * as i3 from "./ui/audio_display_control";
|
|
12
|
-
export class AudioDisplayPlayer {
|
|
13
|
-
constructor(route, ref, eRef) {
|
|
14
|
-
this.route = route;
|
|
15
|
-
this.ref = ref;
|
|
16
|
-
this.eRef = eRef;
|
|
17
|
-
this._audioUrl = null;
|
|
18
|
-
this._audioClip = null;
|
|
19
|
-
this.currentLoader = null;
|
|
20
|
-
this.parentE = this.eRef.nativeElement;
|
|
21
|
-
this.playStartAction = new Action("Start");
|
|
22
|
-
this.playSelectionAction = new Action("Play selected");
|
|
23
|
-
this.playStopAction = new Action("Stop");
|
|
24
|
-
this.status = "Player created.";
|
|
25
|
-
}
|
|
26
|
-
ngOnInit() {
|
|
27
|
-
this.zoomSelectedAction = this.audioDisplayScrollPane.zoomSelectedAction;
|
|
28
|
-
this.zoomFitToPanelAction = this.audioDisplayScrollPane.zoomFitToPanelAction;
|
|
29
|
-
this.zoomOutAction = this.audioDisplayScrollPane.zoomOutAction;
|
|
30
|
-
this.zoomInAction = this.audioDisplayScrollPane.zoomInAction;
|
|
31
|
-
this.ap = new AudioPlayer(this);
|
|
32
|
-
}
|
|
33
|
-
ngAfterViewInit() {
|
|
34
|
-
if (this.ap) {
|
|
35
|
-
this.playStartAction.onAction = () => {
|
|
36
|
-
console.debug("Start action, player: " + this.ap);
|
|
37
|
-
this.ap?.start();
|
|
38
|
-
};
|
|
39
|
-
this.playSelectionAction.onAction = () => this.ap?.startSelected();
|
|
40
|
-
this.playStopAction.onAction = () => this.ap?.stop();
|
|
41
|
-
}
|
|
42
|
-
this.layout();
|
|
43
|
-
let heightListener = new MutationObserver((mrs, mo) => {
|
|
44
|
-
mrs.forEach((mr) => {
|
|
45
|
-
if ('attributes' === mr.type && ('class' === mr.attributeName || 'style' === mr.attributeName)) {
|
|
46
|
-
this.layout();
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
heightListener.observe(this.parentE, { attributes: true, childList: true, characterData: true });
|
|
51
|
-
this.route.queryParams.subscribe((params) => {
|
|
52
|
-
if (params['url']) {
|
|
53
|
-
this.audioUrl = params['url'];
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
layout() {
|
|
58
|
-
this.audioDisplayScrollPane.layout();
|
|
59
|
-
}
|
|
60
|
-
get audioUrl() {
|
|
61
|
-
return this._audioUrl;
|
|
62
|
-
}
|
|
63
|
-
set audioUrl(value) {
|
|
64
|
-
if (this.ap) {
|
|
65
|
-
this.ap.stop();
|
|
66
|
-
}
|
|
67
|
-
this._audioUrl = value;
|
|
68
|
-
this.load();
|
|
69
|
-
}
|
|
70
|
-
started() {
|
|
71
|
-
//console.debug("Play started");
|
|
72
|
-
this.status = 'Playing...';
|
|
73
|
-
}
|
|
74
|
-
load() {
|
|
75
|
-
if (this.currentLoader) {
|
|
76
|
-
this.currentLoader.abort();
|
|
77
|
-
this.currentLoader = null;
|
|
78
|
-
}
|
|
79
|
-
if (this._audioUrl) {
|
|
80
|
-
//this.statusMsg.innerHTML = 'Connecting...';
|
|
81
|
-
this.currentLoader = new XMLHttpRequest();
|
|
82
|
-
this.currentLoader.open("GET", this._audioUrl, true);
|
|
83
|
-
this.currentLoader.responseType = "arraybuffer";
|
|
84
|
-
this.currentLoader.onload = (e) => {
|
|
85
|
-
if (this.currentLoader) {
|
|
86
|
-
var data = this.currentLoader.response; // not responseText
|
|
87
|
-
//console.debug("Received data ", data.byteLength);
|
|
88
|
-
this.currentLoader = null;
|
|
89
|
-
this.loaded(data);
|
|
90
|
-
}
|
|
91
|
-
};
|
|
92
|
-
this.currentLoader.onerror = (e) => {
|
|
93
|
-
console.error("Error downloading ...");
|
|
94
|
-
this.currentLoader = null;
|
|
95
|
-
};
|
|
96
|
-
this.currentLoader.send();
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
loaded(data) {
|
|
100
|
-
//console.debug("Loaded");
|
|
101
|
-
this.status = 'Audio file loaded.';
|
|
102
|
-
//console.debug("Received data ", data.byteLength);
|
|
103
|
-
AudioContextProvider.decodeAudioData(data).then(audioBuffer => {
|
|
104
|
-
//console.debug("Audio Buffer Samplerate: ", audioBuffer.sampleRate)
|
|
105
|
-
let as = new AudioBufferSource(audioBuffer);
|
|
106
|
-
let adh = new AudioDataHolder(as);
|
|
107
|
-
this.audioClip = new AudioClip(adh);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
set audioData(audioData) {
|
|
111
|
-
this.audioDisplayScrollPane.audioData = audioData;
|
|
112
|
-
if (audioData) {
|
|
113
|
-
let clip = new AudioClip(audioData);
|
|
114
|
-
if (this.ap) {
|
|
115
|
-
this.ap.audioClip = clip;
|
|
116
|
-
this.playStartAction.disabled = false;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
this.playStartAction.disabled = true;
|
|
121
|
-
if (this.ap) {
|
|
122
|
-
this.ap.audioClip = null;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
this.playSelectionAction.disabled = true;
|
|
126
|
-
}
|
|
127
|
-
startSelectionDisabled() {
|
|
128
|
-
return !(this._audioClip && this.ap != null && !this.playStartAction.disabled && this._audioClip.selection);
|
|
129
|
-
}
|
|
130
|
-
set audioClip(audioClip) {
|
|
131
|
-
this._audioClip = audioClip;
|
|
132
|
-
let audioData = null;
|
|
133
|
-
if (audioClip) {
|
|
134
|
-
audioData = audioClip.audioDataHolder;
|
|
135
|
-
if (this._audioClip) {
|
|
136
|
-
this._audioClip.addSelectionObserver((ac) => {
|
|
137
|
-
this.playSelectionAction.disabled = this.startSelectionDisabled();
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (audioData) {
|
|
142
|
-
//console.debug("Play start action (by AudioDisplayPlayer::set audioClip) disabled: "+(!this.ap));
|
|
143
|
-
this.playStartAction.disabled = (!this.ap);
|
|
144
|
-
this.playSelectionAction.disabled = this.startSelectionDisabled();
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
this.playStartAction.disabled = true;
|
|
148
|
-
this.playSelectionAction.disabled = true;
|
|
149
|
-
}
|
|
150
|
-
this.audioDisplayScrollPane.audioClip = audioClip;
|
|
151
|
-
if (this.ap) {
|
|
152
|
-
this.ap.audioClip = audioClip;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
get audioClip() {
|
|
156
|
-
return this._audioClip;
|
|
157
|
-
}
|
|
158
|
-
updatePlayPosition() {
|
|
159
|
-
if (this.ap && this.ap.playPositionFrames) {
|
|
160
|
-
this.audioDisplayScrollPane.playFramePosition = this.ap.playPositionFrames;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
audioPlayerUpdate(e) {
|
|
164
|
-
if (EventType.STARTED === e.type) {
|
|
165
|
-
this.status = 'Playback...';
|
|
166
|
-
this.updateTimerId = window.setInterval(() => this.updatePlayPosition(), 50);
|
|
167
|
-
this.playStartAction.disabled = true;
|
|
168
|
-
this.playSelectionAction.disabled = true;
|
|
169
|
-
this.playStopAction.disabled = false;
|
|
170
|
-
}
|
|
171
|
-
else if (EventType.ENDED === e.type) {
|
|
172
|
-
this.status = 'Ready.';
|
|
173
|
-
window.clearInterval(this.updateTimerId);
|
|
174
|
-
this.playStartAction.disabled = false;
|
|
175
|
-
this.playSelectionAction.disabled = this.startSelectionDisabled();
|
|
176
|
-
this.playStopAction.disabled = true;
|
|
177
|
-
}
|
|
178
|
-
else if (EventType.ERROR === e.type) {
|
|
179
|
-
this.status = 'Error.';
|
|
180
|
-
window.clearInterval(this.updateTimerId);
|
|
181
|
-
this.playStartAction.disabled = false;
|
|
182
|
-
this.playSelectionAction.disabled = this.startSelectionDisabled();
|
|
183
|
-
this.playStopAction.disabled = true;
|
|
184
|
-
}
|
|
185
|
-
this.ref.detectChanges();
|
|
186
|
-
}
|
|
187
|
-
error() {
|
|
188
|
-
this.status = 'ERROR';
|
|
189
|
-
}
|
|
190
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayPlayer, deps: [{ token: i1.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
191
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: AudioDisplayPlayer, selector: "app-audiodisplayplayer", inputs: { playStartAction: "playStartAction", playStopAction: "playStopAction", playSelectionAction: "playSelectionAction", autoPlayOnSelectToggleAction: "autoPlayOnSelectToggleAction", audioData: "audioData", audioClip: "audioClip" }, viewQueries: [{ propertyName: "audioDisplayScrollPane", first: true, predicate: AudioDisplayScrollPane, descendants: true, static: true }], ngImport: i0, template: `
|
|
192
|
-
|
|
193
|
-
<audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
|
|
194
|
-
|
|
195
|
-
<audio-display-control [audioClip]="audioClip"
|
|
196
|
-
[playStartAction]="playStartAction"
|
|
197
|
-
[playSelectionAction]="playSelectionAction"
|
|
198
|
-
[playStopAction]="playStopAction"
|
|
199
|
-
[autoPlayOnSelectToggleAction]="ap?.autoPlayOnSelectToggleAction"
|
|
200
|
-
[zoomInAction]="zoomInAction"
|
|
201
|
-
[zoomOutAction]="zoomOutAction"
|
|
202
|
-
[zoomSelectedAction]="zoomSelectedAction"
|
|
203
|
-
[zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control><p>{{status}}
|
|
204
|
-
`, isInline: true, styles: [":host{display:flex;flex-direction:column;position:absolute;bottom:0;height:100%;width:100%;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#000000bf}\n"], dependencies: [{ kind: "component", type: i2.AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { kind: "component", type: i3.AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }] }); }
|
|
205
|
-
}
|
|
206
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayPlayer, decorators: [{
|
|
207
|
-
type: Component,
|
|
208
|
-
args: [{ selector: 'app-audiodisplayplayer', template: `
|
|
209
|
-
|
|
210
|
-
<audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
|
|
211
|
-
|
|
212
|
-
<audio-display-control [audioClip]="audioClip"
|
|
213
|
-
[playStartAction]="playStartAction"
|
|
214
|
-
[playSelectionAction]="playSelectionAction"
|
|
215
|
-
[playStopAction]="playStopAction"
|
|
216
|
-
[autoPlayOnSelectToggleAction]="ap?.autoPlayOnSelectToggleAction"
|
|
217
|
-
[zoomInAction]="zoomInAction"
|
|
218
|
-
[zoomOutAction]="zoomOutAction"
|
|
219
|
-
[zoomSelectedAction]="zoomSelectedAction"
|
|
220
|
-
[zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control><p>{{status}}
|
|
221
|
-
`, styles: [":host{display:flex;flex-direction:column;position:absolute;bottom:0;height:100%;width:100%;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#000000bf}\n"] }]
|
|
222
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { playStartAction: [{
|
|
223
|
-
type: Input
|
|
224
|
-
}], playStopAction: [{
|
|
225
|
-
type: Input
|
|
226
|
-
}], playSelectionAction: [{
|
|
227
|
-
type: Input
|
|
228
|
-
}], autoPlayOnSelectToggleAction: [{
|
|
229
|
-
type: Input
|
|
230
|
-
}], audioDisplayScrollPane: [{
|
|
231
|
-
type: ViewChild,
|
|
232
|
-
args: [AudioDisplayScrollPane, { static: true }]
|
|
233
|
-
}], audioData: [{
|
|
234
|
-
type: Input
|
|
235
|
-
}], audioClip: [{
|
|
236
|
-
type: Input
|
|
237
|
-
}] } });
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fcGxheWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2F1ZGlvX3BsYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFFTSxLQUFLLEdBQ3ZCLE1BQU0sZUFBZSxDQUFBO0FBRXRCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDckMsT0FBTyxFQUFDLFdBQVcsRUFBeUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUE7QUFFL0YsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7Ozs7O0FBb0N2RSxNQUFNLE9BQU8sa0JBQWtCO0lBK0I3QixZQUFzQixLQUFxQixFQUFZLEdBQXNCLEVBQVcsSUFBZTtRQUFqRixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUFZLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVcsU0FBSSxHQUFKLElBQUksQ0FBVztRQTlCL0YsY0FBUyxHQUFjLElBQUksQ0FBQztRQWtCNUIsZUFBVSxHQUFnQixJQUFJLENBQUM7UUFJdkMsa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBU3hDLElBQUksQ0FBQyxPQUFPLEdBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsbUJBQW1CLEdBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLENB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O1lBQy9ELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN0QyxDQUFDO2FBQUssSUFBSSxTQUFTLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN2QixNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsR0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQTtZQUMvRCxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdEMsQ0FBQztRQUdELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7SUFFM0IsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQztJQUN4QixDQUFDOytHQWpPVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixrV0E0QmxCLHNCQUFzQiw4REExRHZCOzs7Ozs7Ozs7Ozs7O0dBYVQ7OzRGQWlCVSxrQkFBa0I7a0JBbEM5QixTQUFTOytCQUVFLHdCQUF3QixZQUV4Qjs7Ozs7Ozs7Ozs7OztHQWFUOzRJQXVCRCxlQUFlO3NCQURkLEtBQUs7Z0JBR04sY0FBYztzQkFEYixLQUFLO2dCQUdOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFHTiw0QkFBNEI7c0JBRDNCLEtBQUs7Z0JBa0JFLHNCQUFzQjtzQkFEN0IsU0FBUzt1QkFBQyxzQkFBc0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBOEcvQyxTQUFTO3NCQURaLEtBQUs7Z0JBdUJGLFNBQVM7c0JBRFosS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIEFmdGVyVmlld0luaXQsIElucHV0LCBPbkluaXQsIEVsZW1lbnRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuXHJcbmltcG9ydCB7QXVkaW9DbGlwfSBmcm9tICcuL3BlcnNpc3RvcidcclxuaW1wb3J0IHtBdWRpb1BsYXllciwgQXVkaW9QbGF5ZXJMaXN0ZW5lciwgQXVkaW9QbGF5ZXJFdmVudCwgRXZlbnRUeXBlfSBmcm9tICcuL3BsYXliYWNrL3BsYXllcidcclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vYWN0aW9uL2FjdGlvblwiO1xyXG5pbXBvcnQge0F1ZGlvRGlzcGxheVNjcm9sbFBhbmV9IGZyb20gXCIuL3VpL2F1ZGlvX2Rpc3BsYXlfc2Nyb2xsX3BhbmVcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRleHRQcm92aWRlcn0gZnJvbSBcIi4vY29udGV4dFwiO1xyXG5pbXBvcnQge0F1ZGlvQnVmZmVyU291cmNlLCBBdWRpb0RhdGFIb2xkZXJ9IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtYXVkaW9kaXNwbGF5cGxheWVyJyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8YXVkaW8tZGlzcGxheS1zY3JvbGwtcGFuZSAjYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZT48L2F1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmU+XHJcblxyXG4gICAgPGF1ZGlvLWRpc3BsYXktY29udHJvbCBbYXVkaW9DbGlwXT1cImF1ZGlvQ2xpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJwbGF5U3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cInBsYXlTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJwbGF5U3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25dPVwiYXA/LmF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6b29tSW5BY3Rpb25dPVwiem9vbUluQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbU91dEFjdGlvbl09XCJ6b29tT3V0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbVNlbGVjdGVkQWN0aW9uXT1cInpvb21TZWxlY3RlZEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pvb21GaXRUb1BhbmVsQWN0aW9uXT1cInpvb21GaXRUb1BhbmVsQWN0aW9uXCI+PC9hdWRpby1kaXNwbGF5LWNvbnRyb2w+PHA+e3tzdGF0dXN9fVxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICAgIGA6aG9zdCB7XHJcbiAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICAgICAgIGJvdHRvbTogMHB4O1xyXG4gICAgICAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICAgICAgICAgcGFkZGluZzogMjBweDtcclxuICAgICAgICAgICAgIHotaW5kZXg6IDU7XHJcbiAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjc1KVxyXG4gICAgICAgICAgIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvRGlzcGxheVBsYXllciBpbXBsZW1lbnRzIEF1ZGlvUGxheWVyTGlzdGVuZXIsIE9uSW5pdCxBZnRlclZpZXdJbml0IHtcclxuICBwcml2YXRlIF9hdWRpb1VybDogc3RyaW5nfG51bGw9bnVsbDtcclxuXHJcbiAgcGFyZW50RTogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcGxheVN0YXJ0QWN0aW9uOiBBY3Rpb248dm9pZD47XHJcbiAgQElucHV0KClcclxuICBwbGF5U3RvcEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIEBJbnB1dCgpXHJcbiAgcGxheVNlbGVjdGlvbkFjdGlvbjpBY3Rpb248dm9pZD5cclxuICBASW5wdXQoKVxyXG4gIGF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb24hOkFjdGlvbjxib29sZWFuPjtcclxuXHJcbiAgem9vbUZpdFRvUGFuZWxBY3Rpb24hOkFjdGlvbjx2b2lkPjtcclxuICB6b29tU2VsZWN0ZWRBY3Rpb24hOkFjdGlvbjx2b2lkPjtcclxuICB6b29tSW5BY3Rpb24hOkFjdGlvbjx2b2lkPjtcclxuICB6b29tT3V0QWN0aW9uITpBY3Rpb248dm9pZD47XHJcblxyXG4gIHByaXZhdGUgX2F1ZGlvQ2xpcDpBdWRpb0NsaXB8bnVsbD1udWxsO1xyXG4gIGFwOiBBdWRpb1BsYXllcnx1bmRlZmluZWQ7XHJcbiAgc3RhdHVzOiBzdHJpbmc7XHJcblxyXG4gIGN1cnJlbnRMb2FkZXI6IFhNTEh0dHBSZXF1ZXN0IHwgbnVsbD1udWxsO1xyXG5cclxuICBhdWRpbzogYW55O1xyXG4gIHVwZGF0ZVRpbWVySWQ6IGFueTtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHByaXZhdGUgYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZSE6IEF1ZGlvRGlzcGxheVNjcm9sbFBhbmU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByb3RlY3RlZCByZWY6IENoYW5nZURldGVjdG9yUmVmLHByb3RlY3RlZCBlUmVmOkVsZW1lbnRSZWYpIHtcclxuICAgIHRoaXMucGFyZW50RT10aGlzLmVSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uID0gbmV3IEFjdGlvbihcIlN0YXJ0XCIpO1xyXG4gICAgdGhpcy5wbGF5U2VsZWN0aW9uQWN0aW9uPW5ldyBBY3Rpb24oXCJQbGF5IHNlbGVjdGVkXCIpO1xyXG4gICAgdGhpcy5wbGF5U3RvcEFjdGlvbiA9IG5ldyBBY3Rpb24oXCJTdG9wXCIpO1xyXG4gICAgdGhpcy5zdGF0dXM9XCJQbGF5ZXIgY3JlYXRlZC5cIjtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCl7XHJcbiAgICB0aGlzLnpvb21TZWxlY3RlZEFjdGlvbj10aGlzLmF1ZGlvRGlzcGxheVNjcm9sbFBhbmUuem9vbVNlbGVjdGVkQWN0aW9uXHJcbiAgICB0aGlzLnpvb21GaXRUb1BhbmVsQWN0aW9uPXRoaXMuYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZS56b29tRml0VG9QYW5lbEFjdGlvbjtcclxuICAgIHRoaXMuem9vbU91dEFjdGlvbj10aGlzLmF1ZGlvRGlzcGxheVNjcm9sbFBhbmUuem9vbU91dEFjdGlvbjtcclxuICAgIHRoaXMuem9vbUluQWN0aW9uPXRoaXMuYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZS56b29tSW5BY3Rpb247XHJcbiAgICB0aGlzLmFwID0gbmV3IEF1ZGlvUGxheWVyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICBpZiAodGhpcy5hcCkge1xyXG4gICAgICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJTdGFydCBhY3Rpb24sIHBsYXllcjogXCIrdGhpcy5hcClcclxuICAgICAgICAgICAgdGhpcy5hcD8uc3RhcnQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucGxheVNlbGVjdGlvbkFjdGlvbi5vbkFjdGlvbiA9ICgpID0+IHRoaXMuYXA/LnN0YXJ0U2VsZWN0ZWQoKTtcclxuICAgICAgICAgIHRoaXMucGxheVN0b3BBY3Rpb24ub25BY3Rpb24gPSAoKSA9PiB0aGlzLmFwPy5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5sYXlvdXQoKTtcclxuICAgICAgbGV0IGhlaWdodExpc3RlbmVyPW5ldyBNdXRhdGlvbk9ic2VydmVyKChtcnM6QXJyYXk8TXV0YXRpb25SZWNvcmQ+LG1vOk11dGF0aW9uT2JzZXJ2ZXIpPT57XHJcbiAgICAgICAgICBtcnMuZm9yRWFjaCgobXI6TXV0YXRpb25SZWNvcmQpPT57XHJcbiAgICAgICAgICAgICAgaWYoJ2F0dHJpYnV0ZXMnPT09bXIudHlwZSAmJiAoJ2NsYXNzJz09PW1yLmF0dHJpYnV0ZU5hbWUgfHwgJ3N0eWxlJz09PW1yLmF0dHJpYnV0ZU5hbWUpKXtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICB9KTtcclxuICAgICAgaGVpZ2h0TGlzdGVuZXIub2JzZXJ2ZSh0aGlzLnBhcmVudEUse2F0dHJpYnV0ZXM6IHRydWUsY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XHJcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zOiBQYXJhbXMpID0+IHtcclxuICAgICAgaWYgKHBhcmFtc1sndXJsJ10pIHtcclxuICAgICAgICB0aGlzLmF1ZGlvVXJsID0gcGFyYW1zWyd1cmwnXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBsYXlvdXQoKXtcclxuICAgIHRoaXMuYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZS5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGdldCBhdWRpb1VybCgpOiBzdHJpbmd8bnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fYXVkaW9Vcmw7XHJcbiAgfVxyXG5cclxuICBzZXQgYXVkaW9VcmwodmFsdWU6IHN0cmluZ3xudWxsKSB7XHJcbiAgICBpZih0aGlzLmFwKSB7XHJcbiAgICAgIHRoaXMuYXAuc3RvcCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fYXVkaW9VcmwgPSB2YWx1ZTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXJ0ZWQoKSB7XHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJQbGF5IHN0YXJ0ZWRcIik7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdQbGF5aW5nLi4uJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5jdXJyZW50TG9hZGVyKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudExvYWRlci5hYm9ydCgpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRMb2FkZXIgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5fYXVkaW9VcmwpIHtcclxuICAgICAgLy90aGlzLnN0YXR1c01zZy5pbm5lckhUTUwgPSAnQ29ubmVjdGluZy4uLic7XHJcbiAgICAgIHRoaXMuY3VycmVudExvYWRlciA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICB0aGlzLmN1cnJlbnRMb2FkZXIub3BlbihcIkdFVFwiLCB0aGlzLl9hdWRpb1VybCwgdHJ1ZSk7XHJcbiAgICAgIHRoaXMuY3VycmVudExvYWRlci5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCI7XHJcbiAgICAgIHRoaXMuY3VycmVudExvYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRMb2FkZXIpIHtcclxuXHJcbiAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuY3VycmVudExvYWRlci5yZXNwb25zZTsgLy8gbm90IHJlc3BvbnNlVGV4dFxyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUmVjZWl2ZWQgZGF0YSBcIiwgZGF0YS5ieXRlTGVuZ3RoKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudExvYWRlciA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlZChkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jdXJyZW50TG9hZGVyLm9uZXJyb3IgPSAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkb3dubG9hZGluZyAuLi5cIik7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TG9hZGVyID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmN1cnJlbnRMb2FkZXIuc2VuZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkZWQoZGF0YTogQXJyYXlCdWZmZXIpIHtcclxuXHJcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJMb2FkZWRcIik7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdBdWRpbyBmaWxlIGxvYWRlZC4nO1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiUmVjZWl2ZWQgZGF0YSBcIiwgZGF0YS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICBBdWRpb0NvbnRleHRQcm92aWRlci5kZWNvZGVBdWRpb0RhdGEoZGF0YSkudGhlbihhdWRpb0J1ZmZlciA9PiB7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIEJ1ZmZlciBTYW1wbGVyYXRlOiBcIiwgYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZSlcclxuICAgICAgbGV0IGFzPW5ldyBBdWRpb0J1ZmZlclNvdXJjZShhdWRpb0J1ZmZlcik7XHJcbiAgICAgIGxldCBhZGg9bmV3IEF1ZGlvRGF0YUhvbGRlcihhcyk7XHJcbiAgICAgIHRoaXMuYXVkaW9DbGlwID0gbmV3IEF1ZGlvQ2xpcChhZGgpO1xyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXVkaW9EYXRhKGF1ZGlvRGF0YTogQXVkaW9EYXRhSG9sZGVyKXtcclxuICAgICAgdGhpcy5hdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLmF1ZGlvRGF0YSA9IGF1ZGlvRGF0YTtcclxuICAgICAgaWYoYXVkaW9EYXRhKSB7XHJcbiAgICAgICAgICBsZXQgY2xpcCA9IG5ldyBBdWRpb0NsaXAoYXVkaW9EYXRhKTtcclxuICAgICAgICAgIGlmICh0aGlzLmFwKXtcclxuICAgICAgICAgICAgICB0aGlzLmFwLmF1ZGlvQ2xpcCA9IGNsaXA7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IHRydWVcclxuICAgICAgICAgIGlmICh0aGlzLmFwKXtcclxuICAgICAgICAgICAgICB0aGlzLmFwLmF1ZGlvQ2xpcCA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIHRoaXMucGxheVNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10cnVlXHJcbiAgfVxyXG5cclxuICBzdGFydFNlbGVjdGlvbkRpc2FibGVkKCl7XHJcbiAgICByZXR1cm4gISh0aGlzLl9hdWRpb0NsaXAgJiYgdGhpcy5hcCE9bnVsbCAmJiAhdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgJiYgdGhpcy5fYXVkaW9DbGlwLnNlbGVjdGlvbiApXHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdWRpb0NsaXAoYXVkaW9DbGlwOiBBdWRpb0NsaXAgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9hdWRpb0NsaXA9YXVkaW9DbGlwXHJcbiAgICBsZXQgYXVkaW9EYXRhOkF1ZGlvRGF0YUhvbGRlcnwgbnVsbD1udWxsO1xyXG4gICAgaWYoYXVkaW9DbGlwKXtcclxuICAgICAgYXVkaW9EYXRhPWF1ZGlvQ2xpcC5hdWRpb0RhdGFIb2xkZXI7XHJcbiAgICAgIGlmKHRoaXMuX2F1ZGlvQ2xpcCkge1xyXG4gICAgICAgIHRoaXMuX2F1ZGlvQ2xpcC5hZGRTZWxlY3Rpb25PYnNlcnZlcigoYWMpID0+IHtcclxuICAgICAgICAgIHRoaXMucGxheVNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZCA9IHRoaXMuc3RhcnRTZWxlY3Rpb25EaXNhYmxlZCgpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYoYXVkaW9EYXRhKSB7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlBsYXkgc3RhcnQgYWN0aW9uIChieSBBdWRpb0Rpc3BsYXlQbGF5ZXI6OnNldCBhdWRpb0NsaXApIGRpc2FibGVkOiBcIisoIXRoaXMuYXApKTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSghdGhpcy5hcClcclxuICAgICAgdGhpcy5wbGF5U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRoaXMuc3RhcnRTZWxlY3Rpb25EaXNhYmxlZCgpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgIHRoaXMucGxheVNlbGVjdGlvbkFjdGlvbi5kaXNhYmxlZD10cnVlXHJcbiAgfVxyXG5cclxuICAgIHRoaXMuYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZS5hdWRpb0NsaXA9YXVkaW9DbGlwXHJcbiAgICBpZih0aGlzLmFwKSB7XHJcbiAgICAgIHRoaXMuYXAuYXVkaW9DbGlwID0gYXVkaW9DbGlwXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXVkaW9DbGlwKCk6QXVkaW9DbGlwfG51bGx7XHJcbiAgICByZXR1cm4gdGhpcy5fYXVkaW9DbGlwXHJcbiAgfVxyXG5cclxuICB1cGRhdGVQbGF5UG9zaXRpb24oKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuYXAgJiYgdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXMpIHtcclxuICAgICAgdGhpcy5hdWRpb0Rpc3BsYXlTY3JvbGxQYW5lLnBsYXlGcmFtZVBvc2l0aW9uID0gdGhpcy5hcC5wbGF5UG9zaXRpb25GcmFtZXM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhdWRpb1BsYXllclVwZGF0ZShlOiBBdWRpb1BsYXllckV2ZW50KSB7XHJcbiAgICBpZiAoRXZlbnRUeXBlLlNUQVJURUQgPT09IGUudHlwZSkge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdQbGF5YmFjay4uLic7XHJcbiAgICAgIHRoaXMudXBkYXRlVGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLnVwZGF0ZVBsYXlQb3NpdGlvbigpLCA1MCk7XHJcbiAgICAgIHRoaXMucGxheVN0YXJ0QWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5wbGF5U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRydWVcclxuICAgICAgdGhpcy5wbGF5U3RvcEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgfSBlbHNlIGlmIChFdmVudFR5cGUuRU5ERUQgPT09IGUudHlwZSkge1xyXG4gICAgICB0aGlzLnN0YXR1cyA9ICdSZWFkeS4nO1xyXG4gICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnVwZGF0ZVRpbWVySWQpO1xyXG4gICAgICB0aGlzLnBsYXlTdGFydEFjdGlvbi5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnBsYXlTZWxlY3Rpb25BY3Rpb24uZGlzYWJsZWQ9dGhpcy5zdGFydFNlbGVjdGlvbkRpc2FibGVkKClcclxuICAgICAgdGhpcy5wbGF5U3RvcEFjdGlvbi5kaXNhYmxlZCA9IHRydWU7XHJcbiAgICB9ZWxzZSBpZiAoRXZlbnRUeXBlLkVSUk9SID09PSBlLnR5cGUpIHtcclxuICAgICAgdGhpcy5zdGF0dXMgPSAnRXJyb3IuJztcclxuICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy51cGRhdGVUaW1lcklkKTtcclxuICAgICAgdGhpcy5wbGF5U3RhcnRBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5wbGF5U2VsZWN0aW9uQWN0aW9uLmRpc2FibGVkPXRoaXMuc3RhcnRTZWxlY3Rpb25EaXNhYmxlZCgpXHJcbiAgICAgIHRoaXMucGxheVN0b3BBY3Rpb24uZGlzYWJsZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZXJyb3IoKSB7XHJcbiAgICB0aGlzLnN0YXR1cyA9ICdFUlJPUic7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuIl19
|