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,424 +0,0 @@
|
|
|
1
|
-
import { Component, ViewChild, } from '@angular/core';
|
|
2
|
-
import { AudioDisplayPlayer } from "../../../audio/audio_player";
|
|
3
|
-
import { AudioDisplayScrollPane } from "../../../audio/ui/audio_display_scroll_pane";
|
|
4
|
-
import { AudioClip } from "../../../audio/persistor";
|
|
5
|
-
import { Selection } from "../../../audio/persistor";
|
|
6
|
-
import { Action } from "../../../action/action";
|
|
7
|
-
import { RecordingFileUtil } from "./recording-file";
|
|
8
|
-
import { MessageDialog } from "../../../ui/message_dialog";
|
|
9
|
-
import { ErrorHelper } from "../../../utils/utils";
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "./recordingfile-service";
|
|
12
|
-
import * as i2 from "../../recordings/recordings.service";
|
|
13
|
-
import * as i3 from "../session.service";
|
|
14
|
-
import * as i4 from "@angular/router";
|
|
15
|
-
import * as i5 from "@angular/material/dialog";
|
|
16
|
-
import * as i6 from "../../../audio/ui/audio_display_scroll_pane";
|
|
17
|
-
import * as i7 from "../../../audio/ui/audio_display_control";
|
|
18
|
-
import * as i8 from "./recording-file-navi.component";
|
|
19
|
-
import * as i9 from "./recording-file-meta.component";
|
|
20
|
-
export class ItemcodeIndex {
|
|
21
|
-
}
|
|
22
|
-
export class RecordingFileViewComponent extends AudioDisplayPlayer {
|
|
23
|
-
constructor(recordingFileService, recordingService, sessionService, router, route, ref, eRef, dialog) {
|
|
24
|
-
super(route, ref, eRef);
|
|
25
|
-
this.recordingFileService = recordingFileService;
|
|
26
|
-
this.recordingService = recordingService;
|
|
27
|
-
this.sessionService = sessionService;
|
|
28
|
-
this.router = router;
|
|
29
|
-
this.route = route;
|
|
30
|
-
this.ref = ref;
|
|
31
|
-
this.eRef = eRef;
|
|
32
|
-
this.dialog = dialog;
|
|
33
|
-
this.sessionId = null;
|
|
34
|
-
this.sessionIdFromRoute = null;
|
|
35
|
-
this.availRecFiles = null;
|
|
36
|
-
this.versions = null;
|
|
37
|
-
this.recordingFile = null;
|
|
38
|
-
this.recordingFileVersion = null;
|
|
39
|
-
this.routedByQueryParam = false;
|
|
40
|
-
this.posInList = null;
|
|
41
|
-
this.parentE = this.eRef.nativeElement;
|
|
42
|
-
// TODO Should be initialized with false, but this causes in debug mode:
|
|
43
|
-
// ERROR Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'false'. Current value: 'true'. Find more at https://angular.io/errors/NG0100
|
|
44
|
-
this.audioFetching = true;
|
|
45
|
-
this.naviInfoLoading = false;
|
|
46
|
-
this.firstAction = new Action('First');
|
|
47
|
-
this.firstAction.onAction = () => {
|
|
48
|
-
this.posInList = 0;
|
|
49
|
-
this.navigateToRecordingFile();
|
|
50
|
-
};
|
|
51
|
-
this.prevAction = new Action('Previous');
|
|
52
|
-
this.prevAction.onAction = () => this.prevFile();
|
|
53
|
-
this.nextAction = new Action('Next');
|
|
54
|
-
this.nextAction.onAction = () => this.nextFile();
|
|
55
|
-
this.lastAction = new Action('Last');
|
|
56
|
-
this.lastAction.onAction = () => {
|
|
57
|
-
if (this.availRecFiles) {
|
|
58
|
-
this.posInList = this.availRecFiles.length - 1;
|
|
59
|
-
this.navigateToRecordingFile();
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
this.toVersionAction = new Action('To version');
|
|
63
|
-
this.toVersionAction.onAction = (ae) => this.toVersion(ae);
|
|
64
|
-
}
|
|
65
|
-
ngOnInit() {
|
|
66
|
-
super.ngOnInit();
|
|
67
|
-
}
|
|
68
|
-
ngAfterViewInit() {
|
|
69
|
-
super.ngAfterViewInit();
|
|
70
|
-
this.route.queryParams.subscribe((params) => {
|
|
71
|
-
let rfIdP = params['recordingFileId'];
|
|
72
|
-
let sIdP = params['sessionId'];
|
|
73
|
-
if (sIdP) {
|
|
74
|
-
this.sessionIdFromRoute = sIdP;
|
|
75
|
-
}
|
|
76
|
-
if (rfIdP) {
|
|
77
|
-
this.routedByQueryParam = true;
|
|
78
|
-
this.loadRecFile(rfIdP);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
this.route.params.subscribe((params) => {
|
|
82
|
-
let rfIdP = params['recordingFileId'];
|
|
83
|
-
let sIdP = params['sessionId'];
|
|
84
|
-
if (sIdP) {
|
|
85
|
-
this.sessionIdFromRoute = sIdP;
|
|
86
|
-
}
|
|
87
|
-
if (rfIdP) {
|
|
88
|
-
this.routedByQueryParam = false;
|
|
89
|
-
this.loadRecFile(rfIdP);
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
// if(this.sessionId){
|
|
93
|
-
// this.loadSession(this.sessionId);
|
|
94
|
-
// }
|
|
95
|
-
}
|
|
96
|
-
navigateToId(rfId) {
|
|
97
|
-
if (this.routedByQueryParam) {
|
|
98
|
-
this.router.navigate([], { relativeTo: this.route, queryParams: { 'recordingFileId': rfId } });
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
this.router.navigate(['../' + rfId], { relativeTo: this.route });
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
navigateToRecordingFile() {
|
|
105
|
-
if (this.posInList != null && this.availRecFiles) {
|
|
106
|
-
let latestNextRf = this.availRecFiles[this.posInList][0];
|
|
107
|
-
let lnRfId = latestNextRf.recordingFileId;
|
|
108
|
-
if (lnRfId) {
|
|
109
|
-
this.navigateToId(lnRfId);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
toVersion(ae) {
|
|
114
|
-
let toRfId = null;
|
|
115
|
-
const version = ae.value;
|
|
116
|
-
if (this.posInList != null && this.availRecFiles) {
|
|
117
|
-
let cRfs = this.availRecFiles[this.posInList];
|
|
118
|
-
//let availVersionCnt = cRfs.length;
|
|
119
|
-
for (let cRf of cRfs) {
|
|
120
|
-
if (cRf.version != null) {
|
|
121
|
-
if (cRf.version === version) {
|
|
122
|
-
toRfId = cRf.recordingFileId;
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (toRfId != null) {
|
|
129
|
-
this.navigateToId(toRfId);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
prevFile() {
|
|
133
|
-
if (this.posInList != null) {
|
|
134
|
-
this.posInList--;
|
|
135
|
-
}
|
|
136
|
-
this.navigateToRecordingFile();
|
|
137
|
-
}
|
|
138
|
-
nextFile() {
|
|
139
|
-
if (this.posInList != null) {
|
|
140
|
-
this.posInList++;
|
|
141
|
-
}
|
|
142
|
-
this.navigateToRecordingFile();
|
|
143
|
-
}
|
|
144
|
-
positionInList() {
|
|
145
|
-
if (this.availRecFiles && this.recordingFile) {
|
|
146
|
-
let cic = this.recordingFile.itemCode;
|
|
147
|
-
if (!cic && this.recordingFile.recording && this.recordingFile.recording.itemcode) {
|
|
148
|
-
cic = this.recordingFile.recording.itemcode;
|
|
149
|
-
}
|
|
150
|
-
if (cic) {
|
|
151
|
-
let itemCnt = this.availRecFiles.length;
|
|
152
|
-
for (let rfdi = 0; rfdi < itemCnt; rfdi++) {
|
|
153
|
-
let arRf = this.availRecFiles[rfdi][0];
|
|
154
|
-
if (arRf.recording) {
|
|
155
|
-
let ar = arRf.recording;
|
|
156
|
-
if (cic === ar.itemcode) {
|
|
157
|
-
return rfdi;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
let itemCnt = this.availRecFiles.length;
|
|
164
|
-
for (let rfdi = 0; rfdi < itemCnt; rfdi++) {
|
|
165
|
-
let arRf = this.availRecFiles[rfdi][0];
|
|
166
|
-
if (this.recordingFile.uuid === arRf.uuid) {
|
|
167
|
-
return rfdi;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return null;
|
|
173
|
-
}
|
|
174
|
-
updatePos() {
|
|
175
|
-
this.posInList = this.positionInList();
|
|
176
|
-
this.toVersionAction.disabled = true;
|
|
177
|
-
if (this.availRecFiles) {
|
|
178
|
-
let avRfsLen = this.availRecFiles.length;
|
|
179
|
-
if (this.posInList != null && avRfsLen > this.posInList) {
|
|
180
|
-
let arfs = this.availRecFiles[this.posInList];
|
|
181
|
-
if (arfs) {
|
|
182
|
-
this.versions = new Array();
|
|
183
|
-
for (let arf of arfs) {
|
|
184
|
-
if (arf.recording?.itemcode) {
|
|
185
|
-
this.versions.push(arf.version);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
this.toVersionAction.disabled = (this.versions.length < 2);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
if (this.recordingFile) {
|
|
193
|
-
if (this.recordingFile.version) {
|
|
194
|
-
this.recordingFileVersion = this.recordingFile.version;
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
this.recordingFileVersion = 0;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
this.recordingFileVersion = null;
|
|
202
|
-
}
|
|
203
|
-
this.updateActions();
|
|
204
|
-
}
|
|
205
|
-
loadRecFile(rfId) {
|
|
206
|
-
this.ap?.stop();
|
|
207
|
-
this.audioClip = null;
|
|
208
|
-
this.recordingFile = null;
|
|
209
|
-
this.posInList = null;
|
|
210
|
-
this.updateActions();
|
|
211
|
-
this.audioFetching = true;
|
|
212
|
-
this.recordingFileService.fetchSprRecordingFile(rfId).subscribe({
|
|
213
|
-
next: value => {
|
|
214
|
-
this.audioFetching = false;
|
|
215
|
-
this.status = 'Audio file loaded.';
|
|
216
|
-
let clip = null;
|
|
217
|
-
this.recordingFile = value;
|
|
218
|
-
if (this.recordingFile) {
|
|
219
|
-
let ab = this.recordingFile.audioDataHolder;
|
|
220
|
-
if (ab) {
|
|
221
|
-
clip = new AudioClip(ab);
|
|
222
|
-
let esffsr = null;
|
|
223
|
-
let eeffsr = null;
|
|
224
|
-
let esr = null;
|
|
225
|
-
if (clip.audioDataHolder != null) {
|
|
226
|
-
esr = ab.sampleRate;
|
|
227
|
-
if (esr != null) {
|
|
228
|
-
esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);
|
|
229
|
-
eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);
|
|
230
|
-
}
|
|
231
|
-
let sel = null;
|
|
232
|
-
if (esffsr != null) {
|
|
233
|
-
if (eeffsr != null) {
|
|
234
|
-
sel = new Selection(ab.sampleRate, esffsr, eeffsr);
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
//let ch0 = ab.getChannelData(0);
|
|
238
|
-
let frameLength = ab.frameLen;
|
|
239
|
-
sel = new Selection(esr, esffsr, frameLength);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
else if (eeffsr != null) {
|
|
243
|
-
sel = new Selection(esr, 0, eeffsr);
|
|
244
|
-
}
|
|
245
|
-
clip.selection = sel;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
this.audioClip = clip;
|
|
250
|
-
this.loadedRecfile();
|
|
251
|
-
}, error: (err) => {
|
|
252
|
-
this.audioFetching = false;
|
|
253
|
-
this.status = 'Error loading audio file';
|
|
254
|
-
const errMsg = ErrorHelper.message('Could not load audio file', err);
|
|
255
|
-
this.dialog.open(MessageDialog, {
|
|
256
|
-
data: {
|
|
257
|
-
type: 'error',
|
|
258
|
-
title: this.status,
|
|
259
|
-
msg: errMsg,
|
|
260
|
-
advice: "Please check network connection and server state or contact application administrator."
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
loadedRecfile() {
|
|
267
|
-
if (this.recordingFile && !this.sessionId) {
|
|
268
|
-
let sId = this.recordingFile.session;
|
|
269
|
-
if (!sId) {
|
|
270
|
-
sId = this.sessionIdFromRoute;
|
|
271
|
-
}
|
|
272
|
-
if (sId) {
|
|
273
|
-
this.loadSession(sId);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
this.updatePos();
|
|
277
|
-
this.ref.detectChanges();
|
|
278
|
-
}
|
|
279
|
-
updateActions() {
|
|
280
|
-
let itemCnt = null;
|
|
281
|
-
if (this.availRecFiles) {
|
|
282
|
-
itemCnt = this.availRecFiles.length;
|
|
283
|
-
}
|
|
284
|
-
this.firstAction.disabled = (this.posInList == null || this.posInList == 0);
|
|
285
|
-
this.prevAction.disabled = (this.posInList == null || this.posInList == 0);
|
|
286
|
-
this.nextAction.disabled = (this.posInList == null || itemCnt == null || this.posInList >= itemCnt - 1);
|
|
287
|
-
this.lastAction.disabled = (this.posInList == null || itemCnt == null || this.posInList >= itemCnt - 1);
|
|
288
|
-
}
|
|
289
|
-
loadSession(sessionId) {
|
|
290
|
-
// load session and recording file metadata only when on init and when session changes
|
|
291
|
-
if (sessionId != this.sessionId) {
|
|
292
|
-
// tell UI that we are working...
|
|
293
|
-
this.naviInfoLoading = true;
|
|
294
|
-
this.sessionService.sessionObserver(sessionId).subscribe((s) => {
|
|
295
|
-
// received session data
|
|
296
|
-
this.sessionId = s.sessionId;
|
|
297
|
-
// fetch recording file meta data list
|
|
298
|
-
this.recordingService.sprRecordingFileList(s.project, s.sessionId).subscribe((rfds) => {
|
|
299
|
-
this.availRecFiles = new Array();
|
|
300
|
-
// build structure indexed by itemcode
|
|
301
|
-
let icIdx = new ItemcodeIndex();
|
|
302
|
-
for (let rfdi = 0; rfdi < rfds.length; rfdi++) {
|
|
303
|
-
let rfd = rfds[rfdi];
|
|
304
|
-
if (rfd.date) {
|
|
305
|
-
// convert date string for faster sorting later
|
|
306
|
-
rfd._dateAsDateObj = new Date(rfd.date);
|
|
307
|
-
}
|
|
308
|
-
let ic = rfd.itemCode;
|
|
309
|
-
if (!ic) {
|
|
310
|
-
let r = rfd.recording;
|
|
311
|
-
if (r && r.itemcode) {
|
|
312
|
-
ic = r.itemcode;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
if (ic) {
|
|
316
|
-
let exRfsForIc = icIdx[ic];
|
|
317
|
-
if (exRfsForIc == null) {
|
|
318
|
-
// itemcode not yet stored
|
|
319
|
-
let arfd = new Array();
|
|
320
|
-
arfd.push(rfd);
|
|
321
|
-
icIdx[ic] = arfd;
|
|
322
|
-
this.availRecFiles.push(arfd);
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
// rec file with itemcode already exists, add (push) this version ...
|
|
326
|
-
exRfsForIc.push(rfd);
|
|
327
|
-
// ... and sort latest version (highest version number) to lowest index
|
|
328
|
-
exRfsForIc.sort((rfd1, rfd2) => {
|
|
329
|
-
return rfd2.version - rfd1.version;
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
let arfd = new Array();
|
|
335
|
-
arfd.push(rfd);
|
|
336
|
-
this.availRecFiles.push(arfd);
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
// have unsorted itemcode indexed recording files here
|
|
340
|
-
// sort them ordered by date of latest version ascending
|
|
341
|
-
this.availRecFiles.sort((rfs1, rfs2) => {
|
|
342
|
-
let d1 = rfs2[0]._dateAsDateObj;
|
|
343
|
-
let d2 = rfs1[0]._dateAsDateObj;
|
|
344
|
-
if (d1 == null) {
|
|
345
|
-
if (d2 == null) {
|
|
346
|
-
return 0;
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
// Sort entries whose dates are not set to the end
|
|
350
|
-
return -1;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
else {
|
|
354
|
-
if (d2 == null) {
|
|
355
|
-
// Sort entries whose dates are not set to the end
|
|
356
|
-
return 1;
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
// Compare date by time in milliseconds value
|
|
360
|
-
return d2.getTime() - d1.getTime();
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
for (let avRf of this.availRecFiles) {
|
|
365
|
-
if (avRf[0] && avRf[0].recording) {
|
|
366
|
-
let os = avRf[0].recording.itemcode + ': versions: ';
|
|
367
|
-
for (let avRfV of avRf) {
|
|
368
|
-
os += avRfV.version + '/';
|
|
369
|
-
}
|
|
370
|
-
//console.debug(os);
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
this.updatePos();
|
|
374
|
-
this.naviInfoLoading = false;
|
|
375
|
-
this.ref.detectChanges();
|
|
376
|
-
});
|
|
377
|
-
});
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileViewComponent, deps: [{ token: i1.RecordingFileService }, { token: i2.RecordingService }, { token: i3.SessionService }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i5.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
381
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: RecordingFileViewComponent, selector: "app-audiodisplayplayer", viewQueries: [{ propertyName: "ac", first: true, predicate: AudioDisplayScrollPane, descendants: true }], usesInheritance: true, ngImport: i0, template: `
|
|
382
|
-
|
|
383
|
-
<audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
|
|
384
|
-
<div class="ctrlview">
|
|
385
|
-
<app-recording-file-meta [sessionId]="sessionId" [recordingFile]="recordingFile" [stateLoading]="audioFetching"></app-recording-file-meta>
|
|
386
|
-
|
|
387
|
-
<audio-display-control [audioClip]="audioClip"
|
|
388
|
-
[playStartAction]="playStartAction"
|
|
389
|
-
[playSelectionAction]="playSelectionAction"
|
|
390
|
-
[playStopAction]="playStopAction"
|
|
391
|
-
[autoPlayOnSelectToggleAction]="ap?.autoPlayOnSelectToggleAction"
|
|
392
|
-
[zoomInAction]="zoomInAction"
|
|
393
|
-
[zoomOutAction]="zoomOutAction"
|
|
394
|
-
[zoomSelectedAction]="zoomSelectedAction"
|
|
395
|
-
[zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
|
|
396
|
-
<app-recording-file-navi [items]="availRecFiles?.length" [itemPos]="posInList" [version]="recordingFileVersion" [versions]="versions" [firstAction]="firstAction" [prevAction]="prevAction" [nextAction]="nextAction" [lastAction]="lastAction" [selectVersion]="toVersionAction" [naviInfoLoading]="naviInfoLoading"></app-recording-file-navi>
|
|
397
|
-
</div>
|
|
398
|
-
`, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#fff}\n", ".ctrlview{display:flex;flex-direction:row}\n", "audio-display-control{flex:3}\n"], dependencies: [{ kind: "component", type: i6.AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: ["audioClip"], outputs: ["zoomInAction", "zoomOutAction", "zoomSelectedAction", "zoomFitToPanelAction"] }, { kind: "component", type: i7.AudioDisplayControl, selector: "audio-display-control", inputs: ["audioClip", "playStartAction", "playSelectionAction", "playStopAction", "zoomInAction", "zoomOutAction", "zoomFitToPanelAction", "zoomSelectedAction", "autoPlayOnSelectToggleAction"] }, { kind: "component", type: i8.RecordingFileNaviComponent, selector: "app-recording-file-navi", inputs: ["firstAction", "prevAction", "nextAction", "lastAction", "items", "itemPos", "selectVersion", "versions", "version", "naviInfoLoading"] }, { kind: "component", type: i9.RecordingFileMetaComponent, selector: "app-recording-file-meta", inputs: ["sessionId", "stateLoading", "recordingFile"] }] }); }
|
|
399
|
-
}
|
|
400
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: RecordingFileViewComponent, decorators: [{
|
|
401
|
-
type: Component,
|
|
402
|
-
args: [{ selector: 'app-audiodisplayplayer', template: `
|
|
403
|
-
|
|
404
|
-
<audio-display-scroll-pane #audioDisplayScrollPane></audio-display-scroll-pane>
|
|
405
|
-
<div class="ctrlview">
|
|
406
|
-
<app-recording-file-meta [sessionId]="sessionId" [recordingFile]="recordingFile" [stateLoading]="audioFetching"></app-recording-file-meta>
|
|
407
|
-
|
|
408
|
-
<audio-display-control [audioClip]="audioClip"
|
|
409
|
-
[playStartAction]="playStartAction"
|
|
410
|
-
[playSelectionAction]="playSelectionAction"
|
|
411
|
-
[playStopAction]="playStopAction"
|
|
412
|
-
[autoPlayOnSelectToggleAction]="ap?.autoPlayOnSelectToggleAction"
|
|
413
|
-
[zoomInAction]="zoomInAction"
|
|
414
|
-
[zoomOutAction]="zoomOutAction"
|
|
415
|
-
[zoomSelectedAction]="zoomSelectedAction"
|
|
416
|
-
[zoomFitToPanelAction]="zoomFitToPanelAction"></audio-display-control>
|
|
417
|
-
<app-recording-file-navi [items]="availRecFiles?.length" [itemPos]="posInList" [version]="recordingFileVersion" [versions]="versions" [firstAction]="firstAction" [prevAction]="prevAction" [nextAction]="nextAction" [lastAction]="lastAction" [selectVersion]="toVersionAction" [naviInfoLoading]="naviInfoLoading"></app-recording-file-navi>
|
|
418
|
-
</div>
|
|
419
|
-
`, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:20px;z-index:5;box-sizing:border-box;background-color:#fff}\n", ".ctrlview{display:flex;flex-direction:row}\n", "audio-display-control{flex:3}\n"] }]
|
|
420
|
-
}], ctorParameters: () => [{ type: i1.RecordingFileService }, { type: i2.RecordingService }, { type: i3.SessionService }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i5.MatDialog }], propDecorators: { ac: [{
|
|
421
|
-
type: ViewChild,
|
|
422
|
-
args: [AudioDisplayScrollPane]
|
|
423
|
-
}] } });
|
|
424
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWZpbGUtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdmaWxlL3JlY29yZGluZy1maWxlLXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFBO0FBUXRCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRS9ELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBYyxNQUFNLHdCQUF3QixDQUFDO0FBSTNELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7O0FBR2pELE1BQU0sT0FBTyxhQUFhO0NBRXpCO0FBaURELE1BQU0sT0FBTywwQkFBMkIsU0FBUSxrQkFBa0I7SUF3QmhFLFlBQXNCLG9CQUEwQyxFQUFZLGdCQUFrQyxFQUFZLGNBQThCLEVBQVksTUFBYSxFQUFXLEtBQXFCLEVBQVksR0FBc0IsRUFBWSxJQUFnQixFQUFZLE1BQWlCO1FBQzFTLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBREgseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUFZLHFCQUFnQixHQUFo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LENBQUMsQ0FBQyxDQUFDO1FBQ0gsQ0FBQztJQUNMLENBQUM7K0dBOVhVLDBCQUEwQjttR0FBMUIsMEJBQTBCLGtHQWExQixzQkFBc0IsdUVBeER2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQlQ7OzRGQTBCVSwwQkFBMEI7a0JBL0N0QyxTQUFTOytCQUVFLHdCQUF3QixZQUV4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQlQ7d1JBd0NPLEVBQUU7c0JBRFQsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiwgT25Jbml0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcblxyXG5cclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcblxyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGVTZXJ2aWNlfSBmcm9tIFwiLi9yZWNvcmRpbmdmaWxlLXNlcnZpY2VcIjtcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtBdWRpb0Rpc3BsYXlQbGF5ZXJ9IGZyb20gXCIuLi8uLi8uLi9hdWRpby9hdWRpb19wbGF5ZXJcIjtcclxuXHJcbmltcG9ydCB7QXVkaW9EaXNwbGF5U2Nyb2xsUGFuZX0gZnJvbSBcIi4uLy4uLy4uL2F1ZGlvL3VpL2F1ZGlvX2Rpc3BsYXlfc2Nyb2xsX3BhbmVcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuLi8uLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuXHJcbmltcG9ydCB7QWN0aW9uLCBBY3Rpb25FdmVudH0gZnJvbSBcIi4uLy4uLy4uL2FjdGlvbi9hY3Rpb25cIjtcclxuaW1wb3J0IHtTZXNzaW9uU2VydmljZX0gZnJvbSBcIi4uL3Nlc3Npb24uc2VydmljZVwiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge1NwclJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlVXRpbH0gZnJvbSBcIi4vcmVjb3JkaW5nLWZpbGVcIjtcclxuaW1wb3J0IHtNZXNzYWdlRGlhbG9nfSBmcm9tIFwiLi4vLi4vLi4vdWkvbWVzc2FnZV9kaWFsb2dcIjtcclxuaW1wb3J0IHtFcnJvckhlbHBlcn0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEl0ZW1jb2RlSW5kZXh7XHJcbiAgW2l0ZW1jb2RlOiBzdHJpbmddOiBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvZGlzcGxheXBsYXllcicsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcblxyXG4gICAgPGF1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmUgI2F1ZGlvRGlzcGxheVNjcm9sbFBhbmU+PC9hdWRpby1kaXNwbGF5LXNjcm9sbC1wYW5lPlxyXG4gICAgPGRpdiBjbGFzcz1cImN0cmx2aWV3XCI+XHJcbiAgICAgIDxhcHAtcmVjb3JkaW5nLWZpbGUtbWV0YSBbc2Vzc2lvbklkXT1cInNlc3Npb25JZFwiIFtyZWNvcmRpbmdGaWxlXT1cInJlY29yZGluZ0ZpbGVcIiBbc3RhdGVMb2FkaW5nXT1cImF1ZGlvRmV0Y2hpbmdcIj48L2FwcC1yZWNvcmRpbmctZmlsZS1tZXRhPlxyXG5cclxuICAgIDxhdWRpby1kaXNwbGF5LWNvbnRyb2wgW2F1ZGlvQ2xpcF09XCJhdWRpb0NsaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwicGxheVN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJwbGF5U2VsZWN0aW9uQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwicGxheVN0b3BBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXT1cImFwPy5hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbUluQWN0aW9uXT1cInpvb21JbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pvb21PdXRBY3Rpb25dPVwiem9vbU91dEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pvb21TZWxlY3RlZEFjdGlvbl09XCJ6b29tU2VsZWN0ZWRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbUZpdFRvUGFuZWxBY3Rpb25dPVwiem9vbUZpdFRvUGFuZWxBY3Rpb25cIj48L2F1ZGlvLWRpc3BsYXktY29udHJvbD5cclxuICAgICAgPGFwcC1yZWNvcmRpbmctZmlsZS1uYXZpIFtpdGVtc109XCJhdmFpbFJlY0ZpbGVzPy5sZW5ndGhcIiBbaXRlbVBvc109XCJwb3NJbkxpc3RcIiBbdmVyc2lvbl09XCJyZWNvcmRpbmdGaWxlVmVyc2lvblwiIFt2ZXJzaW9uc109XCJ2ZXJzaW9uc1wiIFtmaXJzdEFjdGlvbl09XCJmaXJzdEFjdGlvblwiIFtwcmV2QWN0aW9uXT1cInByZXZBY3Rpb25cIiBbbmV4dEFjdGlvbl09XCJuZXh0QWN0aW9uXCIgW2xhc3RBY3Rpb25dPVwibGFzdEFjdGlvblwiIFtzZWxlY3RWZXJzaW9uXT1cInRvVmVyc2lvbkFjdGlvblwiIFtuYXZpSW5mb0xvYWRpbmddPVwibmF2aUluZm9Mb2FkaW5nXCI+PC9hcHAtcmVjb3JkaW5nLWZpbGUtbmF2aT5cclxuICAgICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgIGA6aG9zdCB7XHJcbiAgICAgICAgICAgICAgIGZsZXg6IDI7XHJcbiAgICAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgICAgICAgIG1pbi1oZWlnaHQ6MDtcclxuICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICAgICAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgICAgICAgIHotaW5kZXg6IDU7XHJcbiAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgICAgICAgfWAsYFxyXG4gICAgICAgIC5jdHJsdmlld3tcclxuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG5cclxuICAgICAgICB9XHJcbiAgICBgLGBcclxuICAgICAgYXVkaW8tZGlzcGxheS1jb250cm9se1xyXG5cclxuICAgICAgICBmbGV4OiAzO1xyXG4gICAgICB9XHJcbiAgICBgXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGVWaWV3Q29tcG9uZW50IGV4dGVuZHMgQXVkaW9EaXNwbGF5UGxheWVyIGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXQge1xyXG5cclxuICBzZXNzaW9uSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGw9IG51bGw7XHJcbiAgc2Vzc2lvbklkRnJvbVJvdXRlOnN0cmluZ3xudWxsPW51bGw7XHJcblxyXG4gIGF2YWlsUmVjRmlsZXM6IEFycmF5PEFycmF5PFNwclJlY29yZGluZ0ZpbGU+PnxudWxsPW51bGw7XHJcbiAgdmVyc2lvbnM6IEFycmF5PG51bWJlcj58bnVsbD1udWxsO1xyXG5cclxuICByZWNvcmRpbmdGaWxlOiBTcHJSZWNvcmRpbmdGaWxlfG51bGw9bnVsbDtcclxuICByZWNvcmRpbmdGaWxlVmVyc2lvbjpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcm91dGVkQnlRdWVyeVBhcmFtPWZhbHNlO1xyXG4gIHBvc0luTGlzdDogbnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lKVxyXG4gIHByaXZhdGUgYWMhOiBBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lO1xyXG5cclxuICBmaXJzdEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIHByZXZBY3Rpb246IEFjdGlvbjx2b2lkPjtcclxuICBuZXh0QWN0aW9uOiBBY3Rpb248dm9pZD47XHJcbiAgbGFzdEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIHRvVmVyc2lvbkFjdGlvbjogQWN0aW9uPG51bWJlcj47XHJcbiAgYXVkaW9GZXRjaGluZzpib29sZWFuO1xyXG4gIG5hdmlJbmZvTG9hZGluZzpib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVjb3JkaW5nRmlsZVNlcnZpY2U6IFJlY29yZGluZ0ZpbGVTZXJ2aWNlLCBwcm90ZWN0ZWQgcmVjb3JkaW5nU2VydmljZTogUmVjb3JkaW5nU2VydmljZSwgcHJvdGVjdGVkIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZSwgcHJvdGVjdGVkIHJvdXRlcjpSb3V0ZXIscHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJvdGVjdGVkIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCBlUmVmOiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgZGlhbG9nOiBNYXREaWFsb2cpIHtcclxuICAgIHN1cGVyKHJvdXRlLCByZWYsIGVSZWYpXHJcbiAgICB0aGlzLnBhcmVudEUgPSB0aGlzLmVSZWYubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyBUT0RPIFNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIGZhbHNlLCBidXQgdGhpcyBjYXVzZXMgaW4gZGVidWcgbW9kZTpcclxuICAgIC8vIEVSUk9SIEVycm9yOiBORzAxMDA6IEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I6IEV4cHJlc3Npb24gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQuIFByZXZpb3VzIHZhbHVlOiAnZmFsc2UnLiBDdXJyZW50IHZhbHVlOiAndHJ1ZScuIEZpbmQgbW9yZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vZXJyb3JzL05HMDEwMFxyXG4gICAgdGhpcy5hdWRpb0ZldGNoaW5nPXRydWU7XHJcblxyXG4gICAgdGhpcy5uYXZpSW5mb0xvYWRpbmc9ZmFsc2U7XHJcbiAgICB0aGlzLmZpcnN0QWN0aW9uID0gbmV3IEFjdGlvbjx2b2lkPignRmlyc3QnKTtcclxuICAgIHRoaXMuZmlyc3RBY3Rpb24ub25BY3Rpb249ICgpPT57XHJcbiAgICAgIHRoaXMucG9zSW5MaXN0PTA7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVUb1JlY29yZGluZ0ZpbGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMucHJldkFjdGlvbiA9IG5ldyBBY3Rpb248dm9pZD4oJ1ByZXZpb3VzJyk7XHJcbiAgICB0aGlzLnByZXZBY3Rpb24ub25BY3Rpb249ICgpPT50aGlzLnByZXZGaWxlKCk7XHJcbiAgICB0aGlzLm5leHRBY3Rpb24gPSBuZXcgQWN0aW9uPHZvaWQ+KCdOZXh0Jyk7XHJcbiAgICB0aGlzLm5leHRBY3Rpb24ub25BY3Rpb249ICgpPT50aGlzLm5leHRGaWxlKCk7XHJcbiAgICB0aGlzLmxhc3RBY3Rpb24gPSBuZXcgQWN0aW9uPHZvaWQ+KCdMYXN0Jyk7XHJcbiAgICB0aGlzLmxhc3RBY3Rpb24ub25BY3Rpb249ICgpPT57XHJcbiAgICAgIGlmKHRoaXMuYXZhaWxSZWNGaWxlcykge1xyXG4gICAgICAgIHRoaXMucG9zSW5MaXN0ID0gdGhpcy5hdmFpbFJlY0ZpbGVzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUmVjb3JkaW5nRmlsZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50b1ZlcnNpb25BY3Rpb249bmV3IEFjdGlvbjxudW1iZXI+KCdUbyB2ZXJzaW9uJyk7XHJcbiAgICB0aGlzLnRvVmVyc2lvbkFjdGlvbi5vbkFjdGlvbj0gKGFlKT0+dGhpcy50b1ZlcnNpb24oYWUpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KClcclxuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgcmZJZFAgPSBwYXJhbXNbJ3JlY29yZGluZ0ZpbGVJZCddO1xyXG4gICAgICBsZXQgc0lkUCA9IHBhcmFtc1snc2Vzc2lvbklkJ107XHJcbiAgICAgIGlmIChzSWRQKSB7XHJcbiAgICAgICB0aGlzLnNlc3Npb25JZEZyb21Sb3V0ZT1zSWRQO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZklkUCkge1xyXG4gICAgICAgIHRoaXMucm91dGVkQnlRdWVyeVBhcmFtPXRydWU7XHJcbiAgICAgICAgdGhpcy5sb2FkUmVjRmlsZShyZklkUCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgcmZJZFAgPSBwYXJhbXNbJ3JlY29yZGluZ0ZpbGVJZCddO1xyXG4gICAgICBsZXQgc0lkUCA9IHBhcmFtc1snc2Vzc2lvbklkJ107XHJcbiAgICAgIGlmIChzSWRQKSB7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uSWRGcm9tUm91dGU9c0lkUDtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmZJZFApIHtcclxuICAgICAgICB0aGlzLnJvdXRlZEJ5UXVlcnlQYXJhbT1mYWxzZTtcclxuICAgICAgICB0aGlzLmxvYWRSZWNGaWxlKHJmSWRQKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBpZih0aGlzLnNlc3Npb25JZCl7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkU2Vzc2lvbih0aGlzLnNlc3Npb25JZCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvSWQocmZJZDpudW1iZXJ8IHN0cmluZyl7XHJcblxyXG4gICAgaWYodGhpcy5yb3V0ZWRCeVF1ZXJ5UGFyYW0pe1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge3JlbGF0aXZlVG86IHRoaXMucm91dGUsIHF1ZXJ5UGFyYW1zOnsncmVjb3JkaW5nRmlsZUlkJzpyZklkfX0pXHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4vJyArIHJmSWRdLCB7cmVsYXRpdmVUbzogdGhpcy5yb3V0ZX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvUmVjb3JkaW5nRmlsZSgpe1xyXG4gICAgaWYodGhpcy5wb3NJbkxpc3QhPW51bGwgJiYgdGhpcy5hdmFpbFJlY0ZpbGVzKSB7XHJcbiAgICAgIGxldCBsYXRlc3ROZXh0UmYgPSB0aGlzLmF2YWlsUmVjRmlsZXNbdGhpcy5wb3NJbkxpc3RdWzBdO1xyXG4gICAgICBsZXQgbG5SZklkID0gbGF0ZXN0TmV4dFJmLnJlY29yZGluZ0ZpbGVJZDtcclxuICAgICAgaWYobG5SZklkKSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvSWQobG5SZklkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9WZXJzaW9uKGFlOiBBY3Rpb25FdmVudDxudW1iZXI+KSB7XHJcbiAgICBsZXQgdG9SZklkID0gbnVsbDtcclxuICAgIGNvbnN0IHZlcnNpb24gPSBhZS52YWx1ZTtcclxuICAgIGlmKHRoaXMucG9zSW5MaXN0IT1udWxsICYmIHRoaXMuYXZhaWxSZWNGaWxlcykge1xyXG4gICAgICBsZXQgY1JmcyA9IHRoaXMuYXZhaWxSZWNGaWxlc1t0aGlzLnBvc0luTGlzdF07XHJcbiAgICAgIC8vbGV0IGF2YWlsVmVyc2lvbkNudCA9IGNSZnMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBjUmYgb2YgY1Jmcykge1xyXG4gICAgICAgIGlmKGNSZi52ZXJzaW9uICE9bnVsbCkge1xyXG4gICAgICAgICAgaWYgKGNSZi52ZXJzaW9uID09PSB2ZXJzaW9uKSB7XHJcbiAgICAgICAgICAgIHRvUmZJZCA9IGNSZi5yZWNvcmRpbmdGaWxlSWQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHRvUmZJZCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVUb0lkKHRvUmZJZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJldkZpbGUoKSB7XHJcbiAgICBpZih0aGlzLnBvc0luTGlzdCE9bnVsbCkge1xyXG4gICAgICB0aGlzLnBvc0luTGlzdC0tO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvUmVjb3JkaW5nRmlsZSgpXHJcbiAgfVxyXG4gIG5leHRGaWxlKCkge1xyXG4gICAgaWYodGhpcy5wb3NJbkxpc3QhPW51bGwpIHtcclxuICAgICAgdGhpcy5wb3NJbkxpc3QrKztcclxuICAgIH1cclxuICAgIHRoaXMubmF2aWdhdGVUb1JlY29yZGluZ0ZpbGUoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwb3NpdGlvbkluTGlzdCgpOm51bWJlciB8IG51bGx7XHJcbiAgICBpZiAodGhpcy5hdmFpbFJlY0ZpbGVzICYmIHRoaXMucmVjb3JkaW5nRmlsZSkge1xyXG4gICAgICBsZXQgY2ljPXRoaXMucmVjb3JkaW5nRmlsZS5pdGVtQ29kZTtcclxuICAgICAgaWYoIWNpYyAmJiB0aGlzLnJlY29yZGluZ0ZpbGUucmVjb3JkaW5nICYmIHRoaXMucmVjb3JkaW5nRmlsZS5yZWNvcmRpbmcuaXRlbWNvZGUpe1xyXG4gICAgICAgIGNpYz10aGlzLnJlY29yZGluZ0ZpbGUucmVjb3JkaW5nLml0ZW1jb2RlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjaWMpIHtcclxuICAgICAgICBsZXQgaXRlbUNudCA9IHRoaXMuYXZhaWxSZWNGaWxlcy5sZW5ndGhcclxuICAgICAgICBmb3IgKGxldCByZmRpID0gMDsgcmZkaSA8IGl0ZW1DbnQ7IHJmZGkrKykge1xyXG4gICAgICAgICAgbGV0IGFyUmYgPSB0aGlzLmF2YWlsUmVjRmlsZXNbcmZkaV1bMF07XHJcbiAgICAgICAgICBpZiAoYXJSZi5yZWNvcmRpbmcpIHtcclxuICAgICAgICAgICAgbGV0IGFyID0gYXJSZi5yZWNvcmRpbmc7XHJcbiAgICAgICAgICAgIGlmIChjaWMgPT09IGFyLml0ZW1jb2RlKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJmZGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIGxldCBpdGVtQ250ID0gdGhpcy5hdmFpbFJlY0ZpbGVzLmxlbmd0aFxyXG4gICAgICAgIGZvciAobGV0IHJmZGkgPSAwOyByZmRpIDwgaXRlbUNudDsgcmZkaSsrKSB7XHJcbiAgICAgICAgICBsZXQgYXJSZiA9IHRoaXMuYXZhaWxSZWNGaWxlc1tyZmRpXVswXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkaW5nRmlsZS51dWlkID09PSBhclJmLnV1aWQpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmZkaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlUG9zKCl7XHJcbiAgICB0aGlzLnBvc0luTGlzdD10aGlzLnBvc2l0aW9uSW5MaXN0KCk7XHJcbiAgICB0aGlzLnRvVmVyc2lvbkFjdGlvbi5kaXNhYmxlZD10cnVlO1xyXG4gICAgaWYodGhpcy5hdmFpbFJlY0ZpbGVzKXtcclxuICAgICAgbGV0IGF2UmZzTGVuPXRoaXMuYXZhaWxSZWNGaWxlcy5sZW5ndGg7XHJcbiAgICAgIGlmKHRoaXMucG9zSW5MaXN0ICE9bnVsbCAmJiBhdlJmc0xlbj50aGlzLnBvc0luTGlzdCkge1xyXG4gICAgICAgIGxldCBhcmZzID0gdGhpcy5hdmFpbFJlY0ZpbGVzW3RoaXMucG9zSW5MaXN0XTtcclxuICAgICAgICBpZiAoYXJmcykge1xyXG4gICAgICAgICAgdGhpcy52ZXJzaW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICAgICAgICBmb3IgKGxldCBhcmYgb2YgYXJmcykge1xyXG4gICAgICAgICAgICBpZihhcmYucmVjb3JkaW5nPy5pdGVtY29kZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMudmVyc2lvbnMucHVzaChhcmYudmVyc2lvbilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMudG9WZXJzaW9uQWN0aW9uLmRpc2FibGVkPSh0aGlzLnZlcnNpb25zLmxlbmd0aDwyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLnJlY29yZGluZ0ZpbGUpe1xyXG4gICAgICBpZih0aGlzLnJlY29yZGluZ0ZpbGUudmVyc2lvbil7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdGaWxlVmVyc2lvbj10aGlzLnJlY29yZGluZ0ZpbGUudmVyc2lvbjtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdGaWxlVmVyc2lvbj0wO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5yZWNvcmRpbmdGaWxlVmVyc2lvbj1udWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVBY3Rpb25zKClcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsb2FkUmVjRmlsZShyZklkOm51bWJlciB8IHN0cmluZykge1xyXG4gICAgdGhpcy5hcD8uc3RvcCgpO1xyXG4gICAgdGhpcy5hdWRpb0NsaXAgPW51bGw7XHJcbiAgICB0aGlzLnJlY29yZGluZ0ZpbGU9bnVsbDtcclxuICAgIHRoaXMucG9zSW5MaXN0PW51bGw7XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGlvbnMoKTtcclxuICAgICAgdGhpcy5hdWRpb0ZldGNoaW5nPXRydWU7XHJcbiAgICAgIHRoaXMucmVjb3JkaW5nRmlsZVNlcnZpY2UuZmV0Y2hTcHJSZWNvcmRpbmdGaWxlKCByZklkKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmF1ZGlvRmV0Y2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdBdWRpbyBmaWxlIGxvYWRlZC4nO1xyXG4gICAgICAgICAgICAgIGxldCBjbGlwID0gbnVsbDtcclxuICAgICAgICAgICAgICB0aGlzLnJlY29yZGluZ0ZpbGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmdGaWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWIgPSB0aGlzLnJlY29yZGluZ0ZpbGUuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFiKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNsaXAgPSBuZXcgQXVkaW9DbGlwKGFiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGxldCBlc2Zmc3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZWVmZnNyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgbGV0IGVzciA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoY2xpcC5hdWRpb0RhdGFIb2xkZXIgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVzciA9IGFiLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVzciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlc2Zmc3IgPSBSZWNvcmRpbmdGaWxlVXRpbC5lZGl0U3RhcnRGcmFtZUZvclNhbXBsZVJhdGUodGhpcy5yZWNvcmRpbmdGaWxlLCBlc3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWVmZnNyID0gUmVjb3JkaW5nRmlsZVV0aWwuZWRpdEVuZEZyYW1lRm9yU2FtcGxlUmF0ZSh0aGlzLnJlY29yZGluZ0ZpbGUsIGVzcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWw6IFNlbGVjdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlc2Zmc3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVlZmZzciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA9IG5ldyBTZWxlY3Rpb24oYWIuc2FtcGxlUmF0ZSwgZXNmZnNyLCBlZWZmc3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgY2gwID0gYWIuZ2V0Q2hhbm5lbERhdGEoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IGFiLmZyYW1lTGVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBuZXcgU2VsZWN0aW9uKGVzciwgZXNmZnNyLCBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlZWZmc3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc2VsID0gbmV3IFNlbGVjdGlvbihlc3IsIDAsIGVlZmZzcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNsaXAuc2VsZWN0aW9uID0gc2VsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5hdWRpb0NsaXAgPSBjbGlwXHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkZWRSZWNmaWxlKCk7XHJcblxyXG4gICAgICAgICAgICB9LCBlcnJvcjooZXJyKSA9PlxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5hdWRpb0ZldGNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnRXJyb3IgbG9hZGluZyBhdWRpbyBmaWxlJztcclxuICAgICAgICBjb25zdCBlcnJNc2c9RXJyb3JIZWxwZXIubWVzc2FnZSgnQ291bGQgbm90IGxvYWQgYXVkaW8gZmlsZScsZXJyKTtcclxuICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE1lc3NhZ2VEaWFsb2csIHtcclxuICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgICAgICAgdGl0bGU6IHRoaXMuc3RhdHVzLFxyXG4gICAgICAgICAgICBtc2c6IGVyck1zZyxcclxuICAgICAgICAgICAgYWR2aWNlOiBcIlBsZWFzZSBjaGVjayBuZXR3b3JrIGNvbm5lY3Rpb24gYW5kIHNlcnZlciBzdGF0ZSBvciBjb250YWN0IGFwcGxpY2F0aW9uIGFkbWluaXN0cmF0b3IuXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbG9hZGVkUmVjZmlsZSgpIHtcclxuICAgIGlmKHRoaXMucmVjb3JkaW5nRmlsZSAmJiAhdGhpcy5zZXNzaW9uSWQpIHtcclxuICAgICAgbGV0IHNJZD10aGlzLnJlY29yZGluZ0ZpbGUuc2Vzc2lvblxyXG4gICAgICBpZighc0lkKXtcclxuICAgICAgICBzSWQ9dGhpcy5zZXNzaW9uSWRGcm9tUm91dGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNJZCkge1xyXG4gICAgICAgIHRoaXMubG9hZFNlc3Npb24oc0lkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlUG9zKCk7XHJcbiAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUFjdGlvbnMoKXtcclxuICAgIGxldCBpdGVtQ250Om51bWJlcnxudWxsPW51bGw7XHJcbiAgICBpZih0aGlzLmF2YWlsUmVjRmlsZXMpIHtcclxuICAgICAgaXRlbUNudCA9IHRoaXMuYXZhaWxSZWNGaWxlcy5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpcnN0QWN0aW9uLmRpc2FibGVkPSh0aGlzLnBvc0luTGlzdD09bnVsbCB8fCB0aGlzLnBvc0luTGlzdCA9PSAwKTtcclxuICAgIHRoaXMucHJldkFjdGlvbi5kaXNhYmxlZD0odGhpcy5wb3NJbkxpc3Q9PW51bGwgfHwgdGhpcy5wb3NJbkxpc3QgPT0gMCk7XHJcbiAgICB0aGlzLm5leHRBY3Rpb24uZGlzYWJsZWQ9KHRoaXMucG9zSW5MaXN0PT1udWxsIHx8IGl0ZW1DbnQ9PW51bGwgfHwgdGhpcy5wb3NJbkxpc3QgPj0gaXRlbUNudCAtIDEpO1xyXG4gICAgdGhpcy5sYXN0QWN0aW9uLmRpc2FibGVkPSh0aGlzLnBvc0luTGlzdD09bnVsbCB8fCBpdGVtQ250PT1udWxsIHx8IHRoaXMucG9zSW5MaXN0ID49IGl0ZW1DbnQgLSAxKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZFNlc3Npb24oc2Vzc2lvbklkOiBzdHJpbmd8IG51bWJlcikge1xyXG4gICAgLy8gbG9hZCBzZXNzaW9uIGFuZCByZWNvcmRpbmcgZmlsZSBtZXRhZGF0YSBvbmx5IHdoZW4gb24gaW5pdCBhbmQgd2hlbiBzZXNzaW9uIGNoYW5nZXNcclxuICAgIGlmICg8c3RyaW5nPnNlc3Npb25JZCAhPSA8c3RyaW5nPnRoaXMuc2Vzc2lvbklkKSB7XHJcbiAgICAgIC8vIHRlbGwgVUkgdGhhdCB3ZSBhcmUgd29ya2luZy4uLlxyXG4gICAgICB0aGlzLm5hdmlJbmZvTG9hZGluZz10cnVlO1xyXG4gICAgICB0aGlzLnNlc3Npb25TZXJ2aWNlLnNlc3Npb25PYnNlcnZlcig8c3RyaW5nPnNlc3Npb25JZCkuc3Vic2NyaWJlKChzKSA9PiB7XHJcbiAgICAgICAgLy8gcmVjZWl2ZWQgc2Vzc2lvbiBkYXRhXHJcbiAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBzLnNlc3Npb25JZDtcclxuICAgICAgICAvLyBmZXRjaCByZWNvcmRpbmcgZmlsZSBtZXRhIGRhdGEgbGlzdFxyXG4gICAgICAgIHRoaXMucmVjb3JkaW5nU2VydmljZS5zcHJSZWNvcmRpbmdGaWxlTGlzdChzLnByb2plY3QsIHMuc2Vzc2lvbklkKS5zdWJzY3JpYmUoKHJmZHMpID0+IHtcclxuICAgICAgICAgIHRoaXMuYXZhaWxSZWNGaWxlcyA9IG5ldyBBcnJheTxBcnJheTxTcHJSZWNvcmRpbmdGaWxlPj4oKTtcclxuICAgICAgICAgIC8vIGJ1aWxkIHN0cnVjdHVyZSBpbmRleGVkIGJ5IGl0ZW1jb2RlXHJcbiAgICAgICAgICBsZXQgaWNJZHggPSBuZXcgSXRlbWNvZGVJbmRleCgpO1xyXG4gICAgICAgICAgZm9yIChsZXQgcmZkaSA9IDA7IHJmZGkgPCByZmRzLmxlbmd0aDsgcmZkaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCByZmQgPSByZmRzW3JmZGldO1xyXG4gICAgICAgICAgICBpZiAocmZkLmRhdGUpIHtcclxuICAgICAgICAgICAgICAvLyBjb252ZXJ0IGRhdGUgc3RyaW5nIGZvciBmYXN0ZXIgc29ydGluZyBsYXRlclxyXG4gICAgICAgICAgICAgIHJmZC5fZGF0ZUFzRGF0ZU9iaiA9IG5ldyBEYXRlKHJmZC5kYXRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaWMgPSByZmQuaXRlbUNvZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWljKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHIgPSByZmQucmVjb3JkaW5nO1xyXG4gICAgICAgICAgICAgIGlmIChyICYmIHIuaXRlbWNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGljID0gci5pdGVtY29kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGljKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGV4UmZzRm9ySWMgPSBpY0lkeFtpY107XHJcbiAgICAgICAgICAgICAgaWYgKGV4UmZzRm9ySWMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaXRlbWNvZGUgbm90IHlldCBzdG9yZWRcclxuICAgICAgICAgICAgICAgIGxldCBhcmZkID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgICAgICAgICBhcmZkLnB1c2gocmZkKTtcclxuICAgICAgICAgICAgICAgIGljSWR4W2ljXSA9IGFyZmQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsUmVjRmlsZXMucHVzaChhcmZkKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gcmVjIGZpbGUgd2l0aCBpdGVtY29kZSBhbHJlYWR5IGV4aXN0cywgYWRkIChwdXNoKSB0aGlzIHZlcnNpb24gLi4uXHJcbiAgICAgICAgICAgICAgICBleFJmc0ZvckljLnB1c2gocmZkKTtcclxuICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgc29ydCBsYXRlc3QgdmVyc2lvbiAoaGlnaGVzdCB2ZXJzaW9uIG51bWJlcikgdG8gbG93ZXN0IGluZGV4XHJcbiAgICAgICAgICAgICAgICBleFJmc0ZvckljLnNvcnQoKHJmZDEsIHJmZDIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJmZDIudmVyc2lvbiAtIHJmZDEudmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgYXJmZCA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgICAgICAgIGFyZmQucHVzaChyZmQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXZhaWxSZWNGaWxlcy5wdXNoKGFyZmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBoYXZlIHVuc29ydGVkIGl0ZW1jb2RlIGluZGV4ZWQgcmVjb3JkaW5nIGZpbGVzIGhlcmVcclxuICAgICAgICAgIC8vIHNvcnQgdGhlbSBvcmRlcmVkIGJ5IGRhdGUgb2YgbGF0ZXN0IHZlcnNpb24gYXNjZW5kaW5nXHJcbiAgICAgICAgICB0aGlzLmF2YWlsUmVjRmlsZXMuc29ydCgocmZzMSwgcmZzMikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZDEgPSByZnMyWzBdLl9kYXRlQXNEYXRlT2JqO1xyXG4gICAgICAgICAgICBsZXQgZDIgPSByZnMxWzBdLl9kYXRlQXNEYXRlT2JqO1xyXG4gICAgICAgICAgICBpZiAoZDEgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGlmIChkMiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gU29ydCBlbnRyaWVzIHdob3NlIGRhdGVzIGFyZSBub3Qgc2V0IHRvIHRoZSBlbmRcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGQyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNvcnQgZW50cmllcyB3aG9zZSBkYXRlcyBhcmUgbm90IHNldCB0byB0aGUgZW5kXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBkYXRlIGJ5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIHZhbHVlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZDIuZ2V0VGltZSgpIC0gZDEuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBmb3IobGV0IGF2UmYgb2YgdGhpcy5hdmFpbFJlY0ZpbGVzKXtcclxuICAgICAgICAgICAgICBpZihhdlJmWzBdICYmIGF2UmZbMF0ucmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3MgPSBhdlJmWzBdLnJlY29yZGluZy5pdGVtY29kZSArICc6IHZlcnNpb25zOiAnO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYXZSZlYgb2YgYXZSZikge1xyXG4gICAgICAgICAgICAgICAgICBvcyArPSBhdlJmVi52ZXJzaW9uICsgJy8nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKG9zKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvcygpXHJcbiAgICAgICAgICB0aGlzLm5hdmlJbmZvTG9hZGluZz1mYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { PromptitemUtil } from "../../script/script";
|
|
2
|
-
// export class RecordingFile {
|
|
3
|
-
//
|
|
4
|
-
// get recordingFileId(): string | number {
|
|
5
|
-
// return this._recordingFileId;
|
|
6
|
-
// }
|
|
7
|
-
//
|
|
8
|
-
// frames:number=null
|
|
9
|
-
// editStartFrame:number=null
|
|
10
|
-
// editEndFrame:number=null
|
|
11
|
-
//
|
|
12
|
-
// recording:PromptItem;
|
|
13
|
-
//
|
|
14
|
-
// session:number|string;
|
|
15
|
-
//
|
|
16
|
-
// get audioBuffer(): AudioBuffer {
|
|
17
|
-
// return this._audioBuffer;
|
|
18
|
-
// }
|
|
19
|
-
//
|
|
20
|
-
// set audioBuffer(value: AudioBuffer) {
|
|
21
|
-
// this._audioBuffer = value;
|
|
22
|
-
// }
|
|
23
|
-
// private _recordingFileId:string | number;
|
|
24
|
-
// private _audioBuffer:AudioBuffer;
|
|
25
|
-
//
|
|
26
|
-
// constructor(recordingFileId: string| number, audioBuffer:AudioBuffer){
|
|
27
|
-
// this._recordingFileId=recordingFileId;
|
|
28
|
-
// this._audioBuffer=audioBuffer;
|
|
29
|
-
// }
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
// }
|
|
33
|
-
export class RecordingFileUtil {
|
|
34
|
-
static recordingAsPlainText(recordingFile) {
|
|
35
|
-
if (recordingFile) {
|
|
36
|
-
let r = recordingFile.recording;
|
|
37
|
-
if (r) {
|
|
38
|
-
return PromptitemUtil.toPlainTextString(r);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return "n/a";
|
|
42
|
-
}
|
|
43
|
-
static framePosForSampleRate(framePosSampleRate, framePos, sampleRate) {
|
|
44
|
-
let fpFSr = null;
|
|
45
|
-
// TODO transitional until editSampleRates are set in the database
|
|
46
|
-
if (framePosSampleRate == null) {
|
|
47
|
-
framePosSampleRate = sampleRate;
|
|
48
|
-
}
|
|
49
|
-
if (framePosSampleRate != null && framePos != null) {
|
|
50
|
-
if (framePosSampleRate === sampleRate) {
|
|
51
|
-
fpFSr = framePos;
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
fpFSr = Math.round((framePos * sampleRate) / framePosSampleRate);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return fpFSr;
|
|
58
|
-
}
|
|
59
|
-
static editStartFrameForSampleRate(recordingFile, sampleRate) {
|
|
60
|
-
let esffSr = RecordingFileUtil.framePosForSampleRate(recordingFile.editSampleRate, recordingFile.editStartFrame, sampleRate);
|
|
61
|
-
return esffSr;
|
|
62
|
-
}
|
|
63
|
-
static editEndFrameForSampleRate(recordingFile, sampleRate) {
|
|
64
|
-
let eeffSr = RecordingFileUtil.framePosForSampleRate(recordingFile.editSampleRate, recordingFile.editEndFrame, sampleRate);
|
|
65
|
-
return eeffSr;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdmaWxlL3JlY29yZGluZy1maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUluRCwrQkFBK0I7QUFDL0IsRUFBRTtBQUNGLDZDQUE2QztBQUM3QyxvQ0FBb0M7QUFDcEMsTUFBTTtBQUNOLEVBQUU7QUFDRix1QkFBdUI7QUFDdkIsK0JBQStCO0FBQy9CLDZCQUE2QjtBQUM3QixFQUFFO0FBQ0YsMEJBQTBCO0FBQzFCLEVBQUU7QUFDRiwyQkFBMkI7QUFDM0IsRUFBRTtBQUNGLHFDQUFxQztBQUNyQyxnQ0FBZ0M7QUFDaEMsTUFBTTtBQUNOLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsaUNBQWlDO0FBQ2pDLE1BQU07QUFDTiw4Q0FBOEM7QUFDOUMsc0NBQXNDO0FBQ3RDLEVBQUU7QUFDRiwyRUFBMkU7QUFDM0UsNkNBQTZDO0FBQzdDLHFDQUFxQztBQUNyQyxNQUFNO0FBQ04sRUFBRTtBQUNGLEVBQUU7QUFDRixJQUFJO0FBRUosTUFBTSxPQUFPLGlCQUFpQjtJQUNyQixNQUFNLENBQUMsb0JBQW9CLENBQUMsYUFBOEI7UUFDL0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ04sT0FBTyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTSxNQUFNLENBQUMscUJBQXFCLENBQUMsa0JBQThCLEVBQUMsUUFBb0IsRUFBQyxVQUFpQjtRQUN2RyxJQUFJLEtBQUssR0FBQyxJQUFJLENBQUM7UUFFZixrRUFBa0U7UUFDbEUsSUFBRyxrQkFBa0IsSUFBRSxJQUFJLEVBQUMsQ0FBQztZQUMzQixrQkFBa0IsR0FBQyxVQUFVLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUcsa0JBQWtCLElBQUUsSUFBSSxJQUFJLFFBQVEsSUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5QyxJQUFJLGtCQUFrQixLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN0QyxLQUFLLEdBQUMsUUFBUSxDQUFDO1lBQ2pCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixLQUFLLEdBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2pFLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sTUFBTSxDQUFDLDJCQUEyQixDQUFDLGFBQTJCLEVBQUUsVUFBaUI7UUFDdEYsSUFBSSxNQUFNLEdBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBQyxhQUFhLENBQUMsY0FBYyxFQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxNQUFNLENBQUMseUJBQXlCLENBQUMsYUFBMkIsRUFBRSxVQUFpQjtRQUNwRixJQUFJLE1BQU0sR0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQcm9tcHRpdGVtVXRpbH0gZnJvbSBcIi4uLy4uL3NjcmlwdC9zY3JpcHRcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlLCBTcHJSZWNvcmRpbmdGaWxlfSBmcm9tIFwiLi4vLi4vcmVjb3JkaW5nXCI7XHJcblxyXG5cclxuLy8gZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGUge1xyXG4vL1xyXG4vLyAgIGdldCByZWNvcmRpbmdGaWxlSWQoKTogc3RyaW5nIHwgbnVtYmVyIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9yZWNvcmRpbmdGaWxlSWQ7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIGZyYW1lczpudW1iZXI9bnVsbFxyXG4vLyAgIGVkaXRTdGFydEZyYW1lOm51bWJlcj1udWxsXHJcbi8vICAgZWRpdEVuZEZyYW1lOm51bWJlcj1udWxsXHJcbi8vXHJcbi8vICAgcmVjb3JkaW5nOlByb21wdEl0ZW07XHJcbi8vXHJcbi8vICAgc2Vzc2lvbjpudW1iZXJ8c3RyaW5nO1xyXG4vL1xyXG4vLyAgIGdldCBhdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB7XHJcbi8vICAgICByZXR1cm4gdGhpcy5fYXVkaW9CdWZmZXI7XHJcbi8vICAgfVxyXG4vL1xyXG4vLyAgIHNldCBhdWRpb0J1ZmZlcih2YWx1ZTogQXVkaW9CdWZmZXIpIHtcclxuLy8gICAgIHRoaXMuX2F1ZGlvQnVmZmVyID0gdmFsdWU7XHJcbi8vICAgfVxyXG4vLyAgIHByaXZhdGUgX3JlY29yZGluZ0ZpbGVJZDpzdHJpbmcgfCBudW1iZXI7XHJcbi8vICAgcHJpdmF0ZSBfYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXI7XHJcbi8vXHJcbi8vICAgY29uc3RydWN0b3IocmVjb3JkaW5nRmlsZUlkOiBzdHJpbmd8IG51bWJlciwgYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpe1xyXG4vLyAgICAgdGhpcy5fcmVjb3JkaW5nRmlsZUlkPXJlY29yZGluZ0ZpbGVJZDtcclxuLy8gICAgIHRoaXMuX2F1ZGlvQnVmZmVyPWF1ZGlvQnVmZmVyO1xyXG4vLyAgIH1cclxuLy9cclxuLy9cclxuLy8gfVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGVVdGlsIHtcclxuICBwdWJsaWMgc3RhdGljIHJlY29yZGluZ0FzUGxhaW5UZXh0KHJlY29yZGluZ0ZpbGU6U3ByUmVjb3JkaW5nRmlsZSkge1xyXG4gICAgaWYgKHJlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgbGV0IHIgPSByZWNvcmRpbmdGaWxlLnJlY29yZGluZztcclxuICAgICAgaWYgKHIpIHtcclxuICAgICAgICByZXR1cm4gUHJvbXB0aXRlbVV0aWwudG9QbGFpblRleHRTdHJpbmcocik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcIm4vYVwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXRpYyBmcmFtZVBvc0ZvclNhbXBsZVJhdGUoZnJhbWVQb3NTYW1wbGVSYXRlOm51bWJlcnxudWxsLGZyYW1lUG9zOm51bWJlcnxudWxsLHNhbXBsZVJhdGU6bnVtYmVyKTpudW1iZXJ8bnVsbHtcclxuICAgIGxldCBmcEZTcj1udWxsO1xyXG5cclxuICAgIC8vIFRPRE8gdHJhbnNpdGlvbmFsIHVudGlsIGVkaXRTYW1wbGVSYXRlcyBhcmUgc2V0IGluIHRoZSBkYXRhYmFzZVxyXG4gICAgaWYoZnJhbWVQb3NTYW1wbGVSYXRlPT1udWxsKXtcclxuICAgICAgZnJhbWVQb3NTYW1wbGVSYXRlPXNhbXBsZVJhdGU7XHJcbiAgICB9XHJcbiAgICBpZihmcmFtZVBvc1NhbXBsZVJhdGUhPW51bGwgJiYgZnJhbWVQb3MhPW51bGwpIHtcclxuICAgICAgaWYgKGZyYW1lUG9zU2FtcGxlUmF0ZSA9PT0gc2FtcGxlUmF0ZSkge1xyXG4gICAgICAgIGZwRlNyPWZyYW1lUG9zO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZwRlNyPU1hdGgucm91bmQoKGZyYW1lUG9zICogc2FtcGxlUmF0ZSkgLyBmcmFtZVBvc1NhbXBsZVJhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnBGU3I7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGVkaXRTdGFydEZyYW1lRm9yU2FtcGxlUmF0ZShyZWNvcmRpbmdGaWxlOlJlY29yZGluZ0ZpbGUsIHNhbXBsZVJhdGU6bnVtYmVyKTpudW1iZXIgfCBudWxse1xyXG4gICAgbGV0IGVzZmZTcj1SZWNvcmRpbmdGaWxlVXRpbC5mcmFtZVBvc0ZvclNhbXBsZVJhdGUocmVjb3JkaW5nRmlsZS5lZGl0U2FtcGxlUmF0ZSxyZWNvcmRpbmdGaWxlLmVkaXRTdGFydEZyYW1lLHNhbXBsZVJhdGUpO1xyXG4gICAgcmV0dXJuIGVzZmZTcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZWRpdEVuZEZyYW1lRm9yU2FtcGxlUmF0ZShyZWNvcmRpbmdGaWxlOlJlY29yZGluZ0ZpbGUsIHNhbXBsZVJhdGU6bnVtYmVyKTpudW1iZXIgfCBudWxse1xyXG4gICAgbGV0IGVlZmZTcj1SZWNvcmRpbmdGaWxlVXRpbC5mcmFtZVBvc0ZvclNhbXBsZVJhdGUocmVjb3JkaW5nRmlsZS5lZGl0U2FtcGxlUmF0ZSxyZWNvcmRpbmdGaWxlLmVkaXRFbmRGcmFtZSxzYW1wbGVSYXRlKTtcclxuICAgIHJldHVybiBlZWZmU3I7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|