speechrecorderng 2.21.4 → 2.22.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/{esm2015/lib/action/action.js → esm2020/lib/action/action.mjs} +0 -0
- package/{esm2015/lib/audio/audio_display.js → esm2020/lib/audio/audio_display.mjs} +5 -5
- package/esm2020/lib/audio/audio_player.mjs +276 -0
- package/esm2020/lib/audio/capture/capture.mjs +547 -0
- package/{esm2015/lib/audio/context.js → esm2020/lib/audio/context.mjs} +0 -0
- package/esm2020/lib/audio/dsp/level_measure.mjs +351 -0
- package/{esm2015/lib/audio/format.js → esm2020/lib/audio/format.mjs} +0 -0
- package/{esm2015/lib/audio/impl/wavformat.js → esm2020/lib/audio/impl/wavformat.mjs} +0 -0
- package/{esm2015/lib/audio/impl/wavwriter.js → esm2020/lib/audio/impl/wavwriter.mjs} +0 -0
- package/{esm2015/lib/audio/io/stream.js → esm2020/lib/audio/io/stream.mjs} +0 -0
- package/{esm2015/lib/audio/persistor.js → esm2020/lib/audio/persistor.mjs} +0 -0
- package/{esm2015/lib/audio/playback/player.js → esm2020/lib/audio/playback/player.mjs} +0 -0
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +376 -0
- package/{esm2015/lib/audio/ui/audio_display_control.js → esm2020/lib/audio/ui/audio_display_control.mjs} +5 -5
- package/{esm2015/lib/audio/ui/audio_display_scroll_pane.js → esm2020/lib/audio/ui/audio_display_scroll_pane.mjs} +5 -5
- package/{esm2015/lib/audio/ui/audiosignal.js → esm2020/lib/audio/ui/audiosignal.mjs} +5 -5
- package/{esm2015/lib/audio/ui/common.js → esm2020/lib/audio/ui/common.mjs} +0 -0
- package/esm2020/lib/audio/ui/container.mjs +431 -0
- package/{esm2015/lib/audio/ui/livelevel.js → esm2020/lib/audio/ui/livelevel.mjs} +5 -5
- package/{esm2015/lib/audio/ui/scroll_pane_horizontal.js → esm2020/lib/audio/ui/scroll_pane_horizontal.mjs} +4 -4
- package/{esm2015/lib/audio/ui/sonagram.js → esm2020/lib/audio/ui/sonagram.mjs} +5 -5
- package/{esm2015/lib/dsp/utils.js → esm2020/lib/dsp/utils.mjs} +0 -0
- package/{esm2015/lib/io/BinaryWriter.js → esm2020/lib/io/BinaryWriter.mjs} +0 -0
- package/{esm2015/lib/io/stream.js → esm2020/lib/io/stream.mjs} +0 -0
- package/{esm2015/lib/math/2d/geometry.js → esm2020/lib/math/2d/geometry.mjs} +0 -0
- package/{esm2015/lib/math/complex.js → esm2020/lib/math/complex.mjs} +0 -0
- package/{esm2015/lib/math/dft.js → esm2020/lib/math/dft.mjs} +0 -0
- package/{esm2015/lib/math/utils.js → esm2020/lib/math/utils.mjs} +0 -0
- package/esm2020/lib/media/utils.mjs +14 -0
- package/esm2020/lib/net/uploader.mjs +246 -0
- package/{esm2015/lib/speechrecorder/project/project.js → esm2020/lib/speechrecorder/project/project.mjs} +0 -0
- package/{esm2015/lib/speechrecorder/project/project.service.js → esm2020/lib/speechrecorder/project/project.service.mjs} +4 -4
- package/esm2020/lib/speechrecorder/recording.mjs +54 -0
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +246 -0
- package/{esm2015/lib/speechrecorder/script/script.js → esm2020/lib/speechrecorder/script/script.mjs} +2 -2
- package/{esm2015/lib/speechrecorder/script/script.service.js → esm2020/lib/speechrecorder/script/script.service.mjs} +4 -4
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +1144 -0
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +449 -0
- package/{esm2015/lib/speechrecorder/session/item.js → esm2020/lib/speechrecorder/session/item.mjs} +1 -1
- package/{esm2015/lib/speechrecorder/session/progress.js → esm2020/lib/speechrecorder/session/progress.mjs} +5 -5
- package/{esm2015/lib/speechrecorder/session/prompting.js → esm2020/lib/speechrecorder/session/prompting.mjs} +21 -21
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +75 -0
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +109 -0
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +126 -0
- package/{esm2015/lib/speechrecorder/session/recordingfile/recording-file-navi.component.js → esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs} +5 -5
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +168 -0
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +415 -0
- package/{esm2015/lib/speechrecorder/session/recordingfile/recording-file.js → esm2020/lib/speechrecorder/session/recordingfile/recording-file.mjs} +1 -1
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +251 -0
- package/{esm2015/lib/speechrecorder/session/session.js → esm2020/lib/speechrecorder/session/session.mjs} +0 -0
- package/{esm2015/lib/speechrecorder/session/session.service.js → esm2020/lib/speechrecorder/session/session.service.mjs} +4 -4
- package/{esm2015/lib/speechrecorder/session/session_finished_dialog.js → esm2020/lib/speechrecorder/session/session_finished_dialog.mjs} +4 -4
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +1274 -0
- package/{esm2015/lib/speechrecorder/session/warning_bar.js → esm2020/lib/speechrecorder/session/warning_bar.mjs} +5 -5
- package/{esm2015/lib/speechrecorder/spruploader.js → esm2020/lib/speechrecorder/spruploader.mjs} +4 -4
- package/{esm2015/lib/speechrecorder/startstopsignal/startstopsignal.js → esm2020/lib/speechrecorder/startstopsignal/startstopsignal.mjs} +0 -0
- package/{esm2015/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.js → esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs} +5 -5
- package/esm2020/lib/speechrecorderng.component.mjs +427 -0
- package/{esm2015/lib/speechrecorderng.module.js → esm2020/lib/speechrecorderng.module.mjs} +12 -11
- package/{esm2015/lib/spr.config.js → esm2020/lib/spr.config.mjs} +4 -4
- package/{esm2015/lib/spr.module.version.js → esm2020/lib/spr.module.version.mjs} +2 -2
- package/{esm2015/lib/ui/canvas_layer_comp.js → esm2020/lib/ui/canvas_layer_comp.mjs} +4 -4
- package/{esm2015/lib/ui/message_dialog.js → esm2020/lib/ui/message_dialog.mjs} +4 -4
- package/{esm2015/lib/ui/recordingitem_display.js → esm2020/lib/ui/recordingitem_display.mjs} +9 -9
- package/{esm2015/lib/utils/css_utils.js → esm2020/lib/utils/css_utils.mjs} +0 -0
- package/{esm2015/lib/utils/scrollIntoViewToBottom.js → esm2020/lib/utils/scrollIntoViewToBottom.mjs} +4 -4
- package/{esm2015/lib/utils/ua-parser.js → esm2020/lib/utils/ua-parser.mjs} +0 -0
- package/{esm2015/lib/utils/utils.js → esm2020/lib/utils/utils.mjs} +0 -0
- package/esm2020/public-api.mjs +31 -0
- package/{esm2015/speechrecorderng.js → esm2020/speechrecorderng.mjs} +0 -0
- package/fesm2015/speechrecorderng.mjs +11991 -0
- package/fesm2015/speechrecorderng.mjs.map +1 -0
- package/{fesm2015/speechrecorderng.js → fesm2020/speechrecorderng.mjs} +1863 -285
- package/fesm2020/speechrecorderng.mjs.map +1 -0
- package/lib/media/utils.d.ts +3 -0
- package/lib/net/uploader.d.ts +4 -2
- package/lib/speechrecorder/recording.d.ts +14 -3
- package/lib/speechrecorder/recordings/recordings.service.d.ts +12 -5
- package/lib/speechrecorder/session/audiorecorder.d.ts +150 -0
- package/lib/speechrecorder/session/controlpanel.d.ts +2 -1
- package/lib/speechrecorder/session/item.d.ts +2 -2
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +26 -0
- package/lib/speechrecorder/session/recording_list.d.ts +19 -0
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +6 -2
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +5 -4
- package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +2 -2
- package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +5 -3
- package/lib/speechrecorder/session/sessionmanager.d.ts +5 -5
- package/lib/speechrecorderng.module.d.ts +31 -28
- package/lib/spr.module.version.d.ts +1 -1
- package/package.json +33 -20
- package/public-api.d.ts +2 -1
- package/bundles/speechrecorderng.umd.js +0 -10146
- package/bundles/speechrecorderng.umd.js.map +0 -1
- package/esm2015/lib/audio/audio_player.js +0 -274
- package/esm2015/lib/audio/capture/capture.js +0 -544
- package/esm2015/lib/audio/dsp/level_measure.js +0 -356
- package/esm2015/lib/audio/ui/audio_canvas_layer_comp.js +0 -364
- package/esm2015/lib/audio/ui/container.js +0 -412
- package/esm2015/lib/net/uploader.js +0 -220
- package/esm2015/lib/speechrecorder/recording.js +0 -38
- package/esm2015/lib/speechrecorder/recordings/recordings.service.js +0 -173
- package/esm2015/lib/speechrecorder/session/controlpanel.js +0 -446
- package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-meta.component.js +0 -83
- package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.js +0 -163
- package/esm2015/lib/speechrecorder/session/recordingfile/recording-file-view.component.js +0 -386
- package/esm2015/lib/speechrecorder/session/recordingfile/recordingfile-service.js +0 -191
- package/esm2015/lib/speechrecorder/session/sessionmanager.js +0 -1271
- package/esm2015/lib/speechrecorderng.component.js +0 -423
- package/esm2015/public-api.js +0 -30
- package/fesm2015/speechrecorderng.js.map +0 -1
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
import { CanvasLayerComponent } from "../../ui/canvas_layer_comp";
|
|
2
|
-
import { Selection } from '../persistor';
|
|
3
|
-
import { EventEmitter, HostListener, Input, Output, ViewChild, Directive } from "@angular/core";
|
|
4
|
-
import { Marker } from "./common";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export class ViewSelection {
|
|
7
|
-
constructor(_startX, _endX) {
|
|
8
|
-
this._startX = _startX;
|
|
9
|
-
this._endX = _endX;
|
|
10
|
-
}
|
|
11
|
-
get startX() {
|
|
12
|
-
return this._startX;
|
|
13
|
-
}
|
|
14
|
-
get endX() {
|
|
15
|
-
return this._endX;
|
|
16
|
-
}
|
|
17
|
-
width() {
|
|
18
|
-
return this._endX - this._startX;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
export class BasicAudioCanvasLayerComponent extends CanvasLayerComponent {
|
|
22
|
-
constructor() {
|
|
23
|
-
super(...arguments);
|
|
24
|
-
this._audioData = null;
|
|
25
|
-
this._bgColor = 'white';
|
|
26
|
-
this._selectColor = 'rgba(0%,0%,100%,25%)';
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Returns pixel position depending on current zoom setting.
|
|
30
|
-
* @param framePos audio frame (sample) position
|
|
31
|
-
*/
|
|
32
|
-
frameToXPixelPosition(framePos) {
|
|
33
|
-
let pixelPos = null;
|
|
34
|
-
if (this._audioData && this._audioData.numberOfChannels > 0) {
|
|
35
|
-
let ch0 = this._audioData.getChannelData(0);
|
|
36
|
-
let frameLength = ch0.length;
|
|
37
|
-
let vw;
|
|
38
|
-
if (this.bounds) {
|
|
39
|
-
vw = this.bounds.dimension.width;
|
|
40
|
-
}
|
|
41
|
-
if (this.virtualDimension) {
|
|
42
|
-
vw = this.virtualDimension.width;
|
|
43
|
-
}
|
|
44
|
-
if (vw !== undefined) {
|
|
45
|
-
pixelPos = framePos * vw / frameLength;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return pixelPos;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Returns pixel position in view port (visible window of scroll pane).
|
|
52
|
-
* @param framePos audio frame (sample) position
|
|
53
|
-
*/
|
|
54
|
-
frameToViewPortXPixelPosition(framePos) {
|
|
55
|
-
let pixelPos = this.frameToXPixelPosition(framePos);
|
|
56
|
-
if (pixelPos != null) {
|
|
57
|
-
let vPixelPos = this.toXViewPortPixelPosition(pixelPos);
|
|
58
|
-
return vPixelPos;
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
viewPortXPixelToFramePosition(xViewPortPixelPos) {
|
|
65
|
-
let vpXramePos = null;
|
|
66
|
-
if (this._audioData && this._audioData.numberOfChannels > 0) {
|
|
67
|
-
let ch0 = this._audioData.getChannelData(0);
|
|
68
|
-
let frameLength = ch0.length;
|
|
69
|
-
let vw;
|
|
70
|
-
if (this.bounds) {
|
|
71
|
-
vw = this.bounds.dimension.width;
|
|
72
|
-
}
|
|
73
|
-
if (this.virtualDimension) {
|
|
74
|
-
vw = this.virtualDimension.width;
|
|
75
|
-
}
|
|
76
|
-
if (vw !== undefined) {
|
|
77
|
-
let xVirtualPixelPos = this.toXVirtualPixelPosition(xViewPortPixelPos);
|
|
78
|
-
let framesPerPixel = frameLength / vw;
|
|
79
|
-
let framePos = framesPerPixel * xVirtualPixelPos;
|
|
80
|
-
if (framePos < 0) {
|
|
81
|
-
framePos = 0;
|
|
82
|
-
}
|
|
83
|
-
if (framePos >= frameLength) {
|
|
84
|
-
framePos = frameLength - 1;
|
|
85
|
-
}
|
|
86
|
-
vpXramePos = Math.round(framePos);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return vpXramePos;
|
|
90
|
-
}
|
|
91
|
-
layoutBounds(bounds, virtualDimension, redraw) {
|
|
92
|
-
this.bounds = bounds;
|
|
93
|
-
this.virtualDimension = virtualDimension;
|
|
94
|
-
//this.canvasLayers.forEach(cl=>{
|
|
95
|
-
for (let ci = 0; ci < this.canvasLayers.length; ci++) {
|
|
96
|
-
let cl = this.canvasLayers[ci];
|
|
97
|
-
const leftStyle = bounds.position.left + 'px';
|
|
98
|
-
const topStyle = bounds.position.top + 'px';
|
|
99
|
-
cl.style.left = leftStyle;
|
|
100
|
-
cl.style.top = topStyle;
|
|
101
|
-
}
|
|
102
|
-
if (bounds.dimension.width) {
|
|
103
|
-
let intW = Math.round(bounds.dimension.width);
|
|
104
|
-
if (redraw) {
|
|
105
|
-
// Do not set width of background canvas (causes flicker on start render)
|
|
106
|
-
for (let ci = 1; ci < this.canvasLayers.length; ci++) {
|
|
107
|
-
let cl = this.canvasLayers[ci];
|
|
108
|
-
cl.width = intW;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
let wStr = intW.toString() + 'px';
|
|
112
|
-
for (let ci = 0; ci < this.canvasLayers.length; ci++) {
|
|
113
|
-
let cl = this.canvasLayers[ci];
|
|
114
|
-
cl.style.width = wStr;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (bounds.dimension.height) {
|
|
118
|
-
let intH = Math.round(bounds.dimension.height);
|
|
119
|
-
if (redraw) {
|
|
120
|
-
// Do not set height of background canvas (causes flicker on start render)
|
|
121
|
-
for (let ci = 1; ci < this.canvasLayers.length; ci++) {
|
|
122
|
-
let cl = this.canvasLayers[ci];
|
|
123
|
-
cl.height = intH;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
let hStr = intH + 'px';
|
|
127
|
-
for (let ci = 0; ci < this.canvasLayers.length; ci++) {
|
|
128
|
-
let cl = this.canvasLayers[ci];
|
|
129
|
-
cl.style.height = hStr;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
//});
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
BasicAudioCanvasLayerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: BasicAudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
136
|
-
BasicAudioCanvasLayerComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: BasicAudioCanvasLayerComponent, usesInheritance: true, ngImport: i0 });
|
|
137
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: BasicAudioCanvasLayerComponent, decorators: [{
|
|
138
|
-
type: Directive
|
|
139
|
-
}] });
|
|
140
|
-
export class AudioCanvasLayerComponent extends BasicAudioCanvasLayerComponent {
|
|
141
|
-
constructor() {
|
|
142
|
-
super(...arguments);
|
|
143
|
-
this._pointerPosition = null;
|
|
144
|
-
this.selectStartX = null;
|
|
145
|
-
this._selecting = null;
|
|
146
|
-
this._selection = null;
|
|
147
|
-
this.pointerPositionEventEmitter = new EventEmitter();
|
|
148
|
-
this.selectingEventEmitter = new EventEmitter();
|
|
149
|
-
this.selectedEventEmitter = new EventEmitter();
|
|
150
|
-
}
|
|
151
|
-
onMouseup(me) {
|
|
152
|
-
this.selectionCommit(me);
|
|
153
|
-
}
|
|
154
|
-
layoutBounds(bounds, virtualDimension, redraw, clear = true) {
|
|
155
|
-
super.layoutBounds(bounds, virtualDimension, redraw);
|
|
156
|
-
if (redraw) {
|
|
157
|
-
this.startDraw(clear);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
set pointerPosition(pointerPosition) {
|
|
161
|
-
this._pointerPosition = pointerPosition;
|
|
162
|
-
this.drawCursorLayer();
|
|
163
|
-
}
|
|
164
|
-
set selecting(selecting) {
|
|
165
|
-
this._selecting = selecting;
|
|
166
|
-
this.drawBg();
|
|
167
|
-
this.drawCursorLayer();
|
|
168
|
-
}
|
|
169
|
-
get selecting() {
|
|
170
|
-
return this._selecting;
|
|
171
|
-
}
|
|
172
|
-
set selection(selection) {
|
|
173
|
-
this._selection = selection;
|
|
174
|
-
this.selecting = null;
|
|
175
|
-
this.drawBg();
|
|
176
|
-
this.drawCursorLayer();
|
|
177
|
-
}
|
|
178
|
-
get selection() {
|
|
179
|
-
return this._selection;
|
|
180
|
-
}
|
|
181
|
-
selectionStart(me) {
|
|
182
|
-
this.selectStartX = me.offsetX;
|
|
183
|
-
}
|
|
184
|
-
selectionCommit(me) {
|
|
185
|
-
let vs = null;
|
|
186
|
-
if (this.selectStartX != null) {
|
|
187
|
-
vs = new ViewSelection(this.selectStartX, me.offsetX);
|
|
188
|
-
this.selectStartX = null;
|
|
189
|
-
this.select(vs);
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
updateCursorCanvas(me, showCursorPosition = true) {
|
|
193
|
-
if (this.cursorCanvas) {
|
|
194
|
-
let w = this.cursorCanvas.width;
|
|
195
|
-
let h = this.cursorCanvas.height;
|
|
196
|
-
let g = this.cursorCanvas.getContext("2d");
|
|
197
|
-
// if (!showCursorPosition) {
|
|
198
|
-
// this.selectStartX = null
|
|
199
|
-
// this.selectingChange(null)
|
|
200
|
-
// }
|
|
201
|
-
if (me) {
|
|
202
|
-
if (this.selectStartX) {
|
|
203
|
-
this.pointerPositionChanged(null);
|
|
204
|
-
this.selectingChange(new ViewSelection(this.selectStartX, me.offsetX));
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
if (showCursorPosition) {
|
|
208
|
-
this.pointerPositionChanged(me.offsetX);
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
this.pointerPositionChanged(null);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
pointerPositionChanged(xPosition) {
|
|
218
|
-
let pointerPosition = undefined;
|
|
219
|
-
if (xPosition) {
|
|
220
|
-
pointerPosition = new Marker();
|
|
221
|
-
let vpXPos = this.viewPortXPixelToFramePosition(xPosition);
|
|
222
|
-
if (vpXPos != null) {
|
|
223
|
-
pointerPosition.framePosition = vpXPos;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
this.pointerPositionEventEmitter.emit(pointerPosition);
|
|
227
|
-
}
|
|
228
|
-
selectingChange(viewSel) {
|
|
229
|
-
let ns = undefined;
|
|
230
|
-
if (viewSel) {
|
|
231
|
-
let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX);
|
|
232
|
-
let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX);
|
|
233
|
-
if (this._audioData && frameStart != null && frameEnd != null) {
|
|
234
|
-
ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
this.selectingEventEmitter.emit(ns);
|
|
238
|
-
}
|
|
239
|
-
select(viewSel) {
|
|
240
|
-
let ns = undefined;
|
|
241
|
-
if (viewSel) {
|
|
242
|
-
let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX);
|
|
243
|
-
let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX);
|
|
244
|
-
if (this._audioData && frameStart != null && frameEnd != null) {
|
|
245
|
-
ns = new Selection(this._audioData.sampleRate, frameStart, frameEnd);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
this.selectedEventEmitter.emit(ns);
|
|
249
|
-
}
|
|
250
|
-
viewSelection() {
|
|
251
|
-
let vs = null;
|
|
252
|
-
let s = null;
|
|
253
|
-
if (this._selecting) {
|
|
254
|
-
s = this._selecting;
|
|
255
|
-
}
|
|
256
|
-
else if (this._selection) {
|
|
257
|
-
s = this._selection;
|
|
258
|
-
}
|
|
259
|
-
if (s) {
|
|
260
|
-
let sf = s.startFrame;
|
|
261
|
-
let ef = s.endFrame;
|
|
262
|
-
let xs = this.frameToViewPortXPixelPosition(sf);
|
|
263
|
-
let xe = this.frameToViewPortXPixelPosition(ef);
|
|
264
|
-
if (xs != null && xe != null) {
|
|
265
|
-
vs = new ViewSelection(xs, xe);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return vs;
|
|
269
|
-
}
|
|
270
|
-
drawBg() {
|
|
271
|
-
if (this.bgCanvas && this.bounds) {
|
|
272
|
-
this.bgCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';
|
|
273
|
-
this.bgCanvas.width = Math.round(this.bounds.dimension.width);
|
|
274
|
-
this.bgCanvas.height = Math.round(this.bounds.dimension.height);
|
|
275
|
-
let g1 = this.bgCanvas.getContext("2d");
|
|
276
|
-
if (g1) {
|
|
277
|
-
let w = this.bgCanvas.width;
|
|
278
|
-
let h = this.bgCanvas.height;
|
|
279
|
-
g1.clearRect(0, 0, w, h);
|
|
280
|
-
if (this._bgColor) {
|
|
281
|
-
g1.fillStyle = this._bgColor;
|
|
282
|
-
g1.fillRect(0, 0, w, h);
|
|
283
|
-
}
|
|
284
|
-
let vs = this.viewSelection();
|
|
285
|
-
if (vs) {
|
|
286
|
-
g1.fillStyle = this._selectColor;
|
|
287
|
-
g1.fillRect(vs.startX, 0, vs.width(), h);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
drawCursorLayer() {
|
|
293
|
-
if (this.cursorCanvas) {
|
|
294
|
-
let w = this.cursorCanvas.width;
|
|
295
|
-
let h = this.cursorCanvas.height;
|
|
296
|
-
let g = this.cursorCanvas.getContext("2d");
|
|
297
|
-
if (g) {
|
|
298
|
-
g.clearRect(0, 0, w, h);
|
|
299
|
-
// let s:Selection=null;
|
|
300
|
-
// if(this._selecting){
|
|
301
|
-
// s=this._selecting
|
|
302
|
-
// }else if(this._selection){
|
|
303
|
-
// s=this._selection
|
|
304
|
-
// }
|
|
305
|
-
// if(s){
|
|
306
|
-
// let sf=s.startFrame
|
|
307
|
-
// let ef=s.endFrame
|
|
308
|
-
// let xs=this.frameToViewPortXPixelPosition(sf)
|
|
309
|
-
// let xe=this.frameToViewPortXPixelPosition(ef)
|
|
310
|
-
// let sw=xe-xs
|
|
311
|
-
// g.fillStyle = 'rgba(0%,0%,100%,25%)';
|
|
312
|
-
// g.fillRect(xs,0,sw,h);
|
|
313
|
-
// }
|
|
314
|
-
if (this._pointerPosition) {
|
|
315
|
-
let framePos = this._pointerPosition.framePosition;
|
|
316
|
-
if (framePos) {
|
|
317
|
-
let xViewPortPixelpos = this.frameToViewPortXPixelPosition(framePos);
|
|
318
|
-
if (xViewPortPixelpos) {
|
|
319
|
-
g.fillStyle = 'yellow';
|
|
320
|
-
g.strokeStyle = 'yellow';
|
|
321
|
-
g.beginPath();
|
|
322
|
-
g.moveTo(xViewPortPixelpos, 0);
|
|
323
|
-
g.lineTo(xViewPortPixelpos, h);
|
|
324
|
-
g.closePath();
|
|
325
|
-
g.stroke();
|
|
326
|
-
if (this._audioData) {
|
|
327
|
-
g.font = '14px sans-serif';
|
|
328
|
-
g.fillStyle = 'yellow';
|
|
329
|
-
g.fillText(framePos.toString(), xViewPortPixelpos + 2, 50);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
AudioCanvasLayerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: AudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
339
|
-
AudioCanvasLayerComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.13", type: AudioCanvasLayerComponent, inputs: { pointerPosition: "pointerPosition", selecting: "selecting", selection: "selection" }, outputs: { pointerPositionEventEmitter: "pointerPositionEventEmitter", selectingEventEmitter: "selectingEventEmitter", selectedEventEmitter: "selectedEventEmitter" }, host: { listeners: { "document:mouseup": "onMouseup($event)" } }, viewQueries: [{ propertyName: "bgCanvasRef", first: true, predicate: ["bg"], descendants: true, static: true }, { propertyName: "cursorCanvasRef", first: true, predicate: ["cursor"], descendants: true, static: true }], usesInheritance: true, ngImport: i0 });
|
|
340
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: AudioCanvasLayerComponent, decorators: [{
|
|
341
|
-
type: Directive
|
|
342
|
-
}], propDecorators: { bgCanvasRef: [{
|
|
343
|
-
type: ViewChild,
|
|
344
|
-
args: ['bg', { static: true }]
|
|
345
|
-
}], cursorCanvasRef: [{
|
|
346
|
-
type: ViewChild,
|
|
347
|
-
args: ['cursor', { static: true }]
|
|
348
|
-
}], onMouseup: [{
|
|
349
|
-
type: HostListener,
|
|
350
|
-
args: ['document:mouseup', ['$event']]
|
|
351
|
-
}], pointerPosition: [{
|
|
352
|
-
type: Input
|
|
353
|
-
}], selecting: [{
|
|
354
|
-
type: Input
|
|
355
|
-
}], selection: [{
|
|
356
|
-
type: Input
|
|
357
|
-
}], pointerPositionEventEmitter: [{
|
|
358
|
-
type: Output
|
|
359
|
-
}], selectingEventEmitter: [{
|
|
360
|
-
type: Output
|
|
361
|
-
}], selectedEventEmitter: [{
|
|
362
|
-
type: Output
|
|
363
|
-
}] } });
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fY2FudmFzX2xheWVyX2NvbXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9fY2FudmFzX2xheWVyX2NvbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQzs7QUFJaEMsTUFBTSxPQUFPLGFBQWE7SUFheEIsWUFBb0IsT0FBYyxFQUFVLEtBQVk7UUFBcEMsWUFBTyxHQUFQLE9BQU8sQ0FBTztRQUFVLFVBQUssR0FBTCxLQUFLLENBQU87SUFBRSxDQUFDO0lBWjNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDaEMsQ0FBQztDQUdGO0FBR0QsTUFBTSxPQUFnQiw4QkFBK0IsU0FBUSxvQkFBb0I7SUFEakY7O1FBRVksZUFBVSxHQUFtQixJQUFJLENBQUM7UUFDbEMsYUFBUSxHQUFhLE9BQU8sQ0FBQztRQUM3QixpQkFBWSxHQUFDLHNCQUFzQixDQUFDO0tBaUgvQztJQS9HQzs7O09BR0c7SUFDSCxxQkFBcUIsQ0FBQyxRQUFnQjtRQUNsQyxJQUFJLFFBQVEsR0FBQyxJQUFJLENB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Q2FudmFzTGF5ZXJDb21wb25lbnR9IGZyb20gXCIuLi8uLi91aS9jYW52YXNfbGF5ZXJfY29tcFwiO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnLi4vcGVyc2lzdG9yJ1xyXG5pbXBvcnQgeyBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBEaXJlY3RpdmUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge01hcmtlcn0gZnJvbSBcIi4vY29tbW9uXCI7XHJcbmltcG9ydCB7RGltZW5zaW9uLCBSZWN0YW5nbGV9IGZyb20gXCIuLi8uLi9tYXRoLzJkL2dlb21ldHJ5XCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdTZWxlY3Rpb257XHJcbiAgZ2V0IHN0YXJ0WCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0WDtcclxuICB9XHJcblxyXG4gIGdldCBlbmRYKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kWDtcclxuICB9XHJcblxyXG4gIHdpZHRoKCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFgtdGhpcy5fc3RhcnRYXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zdGFydFg6bnVtYmVyLCBwcml2YXRlIF9lbmRYOm51bWJlcil7fVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2ljQXVkaW9DYW52YXNMYXllckNvbXBvbmVudCBleHRlbmRzIENhbnZhc0xheWVyQ29tcG9uZW50IHtcclxuICBwcm90ZWN0ZWQgX2F1ZGlvRGF0YTogQXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gIHByb3RlY3RlZCBfYmdDb2xvcjpzdHJpbmd8bnVsbD0nd2hpdGUnO1xyXG4gIHByb3RlY3RlZCBfc2VsZWN0Q29sb3I9J3JnYmEoMCUsMCUsMTAwJSwyNSUpJztcclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBwaXhlbCBwb3NpdGlvbiBkZXBlbmRpbmcgb24gY3VycmVudCB6b29tIHNldHRpbmcuXHJcbiAgICogQHBhcmFtIGZyYW1lUG9zIGF1ZGlvIGZyYW1lIChzYW1wbGUpIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgZnJhbWVUb1hQaXhlbFBvc2l0aW9uKGZyYW1lUG9zOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICAgbGV0IHBpeGVsUG9zPW51bGw7XHJcbiAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGEgJiYgdGhpcy5fYXVkaW9EYXRhLm51bWJlck9mQ2hhbm5lbHMgPiAwKSB7XHJcbiAgICAgICAgICBsZXQgY2gwID0gdGhpcy5fYXVkaW9EYXRhLmdldENoYW5uZWxEYXRhKDApO1xyXG4gICAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gY2gwLmxlbmd0aDtcclxuICAgICAgICAgIGxldCB2dztcclxuICAgICAgICAgIGlmKHRoaXMuYm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgdncgPSB0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy52aXJ0dWFsRGltZW5zaW9uKSB7XHJcbiAgICAgICAgICAgICAgdncgPSB0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZih2dyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgcGl4ZWxQb3MgPSBmcmFtZVBvcyAqIHZ3IC8gZnJhbWVMZW5ndGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIHJldHVybiBwaXhlbFBvcztcclxufVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHBpeGVsIHBvc2l0aW9uIGluIHZpZXcgcG9ydCAodmlzaWJsZSB3aW5kb3cgb2Ygc2Nyb2xsIHBhbmUpLlxyXG4gICAqIEBwYXJhbSBmcmFtZVBvcyBhdWRpbyBmcmFtZSAoc2FtcGxlKSBwb3NpdGlvblxyXG4gICAqL1xyXG4gIGZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGZyYW1lUG9zOiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGxldCBwaXhlbFBvcz10aGlzLmZyYW1lVG9YUGl4ZWxQb3NpdGlvbihmcmFtZVBvcyk7XHJcbiAgICBpZihwaXhlbFBvcyE9bnVsbCl7XHJcbiAgICAgIGxldCB2UGl4ZWxQb3MgPSB0aGlzLnRvWFZpZXdQb3J0UGl4ZWxQb3NpdGlvbihwaXhlbFBvcyk7XHJcbiAgICAgIHJldHVybiB2UGl4ZWxQb3M7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICAgdmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24oeFZpZXdQb3J0UGl4ZWxQb3M6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xyXG4gICAgICAgIGxldCB2cFhyYW1lUG9zPW51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YSAmJiB0aGlzLl9hdWRpb0RhdGEubnVtYmVyT2ZDaGFubmVscyA+IDApIHtcclxuICAgICAgICAgICAgbGV0IGNoMCA9IHRoaXMuX2F1ZGlvRGF0YS5nZXRDaGFubmVsRGF0YSgwKTtcclxuICAgICAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gY2gwLmxlbmd0aDtcclxuICAgICAgICAgICAgbGV0IHZ3O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcclxuICAgICAgICAgICAgICAgIHZ3PSB0aGlzLmJvdW5kcy5kaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMudmlydHVhbERpbWVuc2lvbikge1xyXG4gICAgICAgICAgICAgICAgdncgPSB0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodnchPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgeFZpcnR1YWxQaXhlbFBvcyA9IHRoaXMudG9YVmlydHVhbFBpeGVsUG9zaXRpb24oeFZpZXdQb3J0UGl4ZWxQb3MpXHJcbiAgICAgICAgICAgICAgICBsZXQgZnJhbWVzUGVyUGl4ZWwgPSBmcmFtZUxlbmd0aCAvIHZ3O1xyXG4gICAgICAgICAgICAgICAgbGV0IGZyYW1lUG9zID0gZnJhbWVzUGVyUGl4ZWwgKiB4VmlydHVhbFBpeGVsUG9zO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lUG9zIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZyYW1lUG9zID0gMFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZyYW1lUG9zID49IGZyYW1lTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnJhbWVQb3MgPSBmcmFtZUxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHZwWHJhbWVQb3MgPSBNYXRoLnJvdW5kKGZyYW1lUG9zKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdnBYcmFtZVBvcztcclxuICAgIH1cclxuXHJcbiAgICBsYXlvdXRCb3VuZHMoYm91bmRzOlJlY3RhbmdsZSwgdmlydHVhbERpbWVuc2lvbjpEaW1lbnNpb24scmVkcmF3OiBib29sZWFuKSB7XHJcblxyXG4gICAgICAgIHRoaXMuYm91bmRzPWJvdW5kcztcclxuICAgICAgICB0aGlzLnZpcnR1YWxEaW1lbnNpb249dmlydHVhbERpbWVuc2lvbjtcclxuICAgICAgICAvL3RoaXMuY2FudmFzTGF5ZXJzLmZvckVhY2goY2w9PntcclxuICAgICAgICBmb3IobGV0IGNpPTA7Y2k8dGhpcy5jYW52YXNMYXllcnMubGVuZ3RoO2NpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0U3R5bGU9Ym91bmRzLnBvc2l0aW9uLmxlZnQrICdweCc7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvcFN0eWxlPWJvdW5kcy5wb3NpdGlvbi50b3AgKyAncHgnO1xyXG4gICAgICAgICAgICBjbC5zdHlsZS5sZWZ0ID0gbGVmdFN0eWxlO1xyXG4gICAgICAgICAgICBjbC5zdHlsZS50b3AgPSB0b3BTdHlsZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvdW5kcy5kaW1lbnNpb24ud2lkdGgpIHtcclxuICAgICAgICAgICAgbGV0IGludFc9TWF0aC5yb3VuZChib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICAgICAgaWYgKHJlZHJhdykge1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCB3aWR0aCBvZiBiYWNrZ3JvdW5kIGNhbnZhcyAoY2F1c2VzIGZsaWNrZXIgb24gc3RhcnQgcmVuZGVyKVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBjaT0xO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsLndpZHRoID0gaW50VztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgd1N0ciA9IGludFcudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgICAgICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNhbnZhc0xheWVycy5sZW5ndGg7Y2krKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgY2wuc3R5bGUud2lkdGggPSB3U3RyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChib3VuZHMuZGltZW5zaW9uLmhlaWdodCkge1xyXG4gICAgICAgICAgICBsZXQgaW50SD1NYXRoLnJvdW5kKGJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KVxyXG4gICAgICAgICAgICBpZiAocmVkcmF3KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBEbyBub3Qgc2V0IGhlaWdodCBvZiBiYWNrZ3JvdW5kIGNhbnZhcyAoY2F1c2VzIGZsaWNrZXIgb24gc3RhcnQgcmVuZGVyKVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBjaT0xO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsLmhlaWdodCA9IGludEg7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGhTdHIgPSBpbnRIICsgJ3B4JztcclxuICAgICAgICAgICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2wgPSB0aGlzLmNhbnZhc0xheWVyc1tjaV07XHJcbiAgICAgICAgICAgICAgICBjbC5zdHlsZS5oZWlnaHQgPSBoU3RyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vfSk7XHJcblxyXG5cclxuICAgIH1cclxufVxyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IGV4dGVuZHMgQmFzaWNBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IHtcclxuICAgIF9wb2ludGVyUG9zaXRpb246TWFya2VyfG51bGw9bnVsbDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgc2VsZWN0U3RhcnRYOm51bWJlcnxudWxsPW51bGw7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnYmcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBiZ0NhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgICBiZ0NhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2N1cnNvcicsIHsgc3RhdGljOiB0cnVlIH0pIGN1cnNvckNhbnZhc1JlZiE6IEVsZW1lbnRSZWY7XHJcbiAgICBjdXJzb3JDYW52YXMhOiBIVE1MQ2FudmFzRWxlbWVudDtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZXVwKG1lOiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLnNlbGVjdGlvbkNvbW1pdChtZSlcclxuICB9XHJcblxyXG4gICAgbGF5b3V0Qm91bmRzKGJvdW5kczpSZWN0YW5nbGUsIHZpcnR1YWxEaW1lbnNpb246RGltZW5zaW9uLHJlZHJhdzogYm9vbGVhbixjbGVhcjpib29sZWFuPXRydWUpIHtcclxuICAgICAgICBzdXBlci5sYXlvdXRCb3VuZHMoYm91bmRzLHZpcnR1YWxEaW1lbnNpb24scmVkcmF3KVxyXG4gICAgICAgIGlmIChyZWRyYXcpIHtcclxuICAgICAgICAgICAgdGhpcy5zdGFydERyYXcoY2xlYXIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBzZXQgcG9pbnRlclBvc2l0aW9uKHBvaW50ZXJQb3NpdGlvbjpNYXJrZXJ8bnVsbCl7XHJcbiAgICAgICAgdGhpcy5fcG9pbnRlclBvc2l0aW9uPXBvaW50ZXJQb3NpdGlvblxyXG4gICAgICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICAgIH1cclxuXHJcbiAgICBfc2VsZWN0aW5nOiBTZWxlY3Rpb258bnVsbCA9bnVsbDtcclxuICAgIEBJbnB1dCgpIHNldCBzZWxlY3Rpbmcoc2VsZWN0aW5nOlNlbGVjdGlvbnwgbnVsbCl7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aW5nPXNlbGVjdGluZ1xyXG4gICAgICAgIHRoaXMuZHJhd0JnKClcclxuICAgICAgICB0aGlzLmRyYXdDdXJzb3JMYXllcigpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGluZygpOlNlbGVjdGlvbnxudWxse1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RpbmdcclxuICAgIH1cclxuXHJcbiAgICBfc2VsZWN0aW9uOiBTZWxlY3Rpb258bnVsbCA9bnVsbFxyXG4gICAgQElucHV0KCkgc2V0IHNlbGVjdGlvbihzZWxlY3Rpb246U2VsZWN0aW9ufG51bGwpe1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbj1zZWxlY3Rpb247XHJcbiAgICAgICAgdGhpcy5zZWxlY3Rpbmc9bnVsbDtcclxuICAgICAgICB0aGlzLmRyYXdCZygpXHJcbiAgICAgICAgdGhpcy5kcmF3Q3Vyc29yTGF5ZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3Rpb24oKTpTZWxlY3Rpb258bnVsbHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uXHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0aW9uU3RhcnQobWU6TW91c2VFdmVudCl7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RTdGFydFg9bWUub2Zmc2V0WDtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Rpb25Db21taXQobWU6TW91c2VFdmVudCl7XHJcbiAgICAgICAgbGV0IHZzOlZpZXdTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICAgIGlmKHRoaXMuc2VsZWN0U3RhcnRYIT1udWxsKSB7XHJcbiAgICAgICAgICB2cz1uZXcgVmlld1NlbGVjdGlvbih0aGlzLnNlbGVjdFN0YXJ0WCxtZS5vZmZzZXRYKVxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RTdGFydFg9bnVsbDtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0KHZzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWJzdHJhY3Qgc3RhcnREcmF3KGNsZWFyOmJvb2xlYW4pOnZvaWQ7XHJcblxyXG4gICAgdXBkYXRlQ3Vyc29yQ2FudmFzKG1lOk1vdXNlRXZlbnQsc2hvd0N1cnNvclBvc2l0aW9uPXRydWUpe1xyXG5cclxuICAgICAgICBpZiAodGhpcy5jdXJzb3JDYW52YXMpIHtcclxuXHJcbiAgICAgICAgICAgIGxldCB3ID0gdGhpcy5jdXJzb3JDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBoID0gdGhpcy5jdXJzb3JDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgZyA9IHRoaXMuY3Vyc29yQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuXHJcbiAgICAgICAgICAgIC8vIGlmICghc2hvd0N1cnNvclBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnNlbGVjdFN0YXJ0WCA9IG51bGxcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMuc2VsZWN0aW5nQ2hhbmdlKG51bGwpXHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgaWYgKG1lKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RTdGFydFgpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJQb3NpdGlvbkNoYW5nZWQobnVsbClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGluZ0NoYW5nZShuZXcgVmlld1NlbGVjdGlvbih0aGlzLnNlbGVjdFN0YXJ0WCwgbWUub2Zmc2V0WCkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd0N1cnNvclBvc2l0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRlclBvc2l0aW9uQ2hhbmdlZChtZS5vZmZzZXRYKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJQb3NpdGlvbkNoYW5nZWQobnVsbClcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpIHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TWFya2VyPigpO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGluZ0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uPigpO1xyXG4gICAgQE91dHB1dCgpIHNlbGVjdGVkRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb24+KCk7XHJcblxyXG5cclxuICAgIHBvaW50ZXJQb3NpdGlvbkNoYW5nZWQoeFBvc2l0aW9uOm51bWJlcnwgbnVsbCl7XHJcbiAgICAgICAgbGV0IHBvaW50ZXJQb3NpdGlvbjpNYXJrZXJ8dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICAgICAgICBpZih4UG9zaXRpb24pe1xyXG4gICAgICAgICAgICBwb2ludGVyUG9zaXRpb249bmV3IE1hcmtlcigpO1xyXG4gICAgICAgICAgICBsZXQgdnBYUG9zPXRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24oeFBvc2l0aW9uKTtcclxuICAgICAgICAgICAgaWYodnBYUG9zIT1udWxsKSB7XHJcbiAgICAgICAgICAgICAgICBwb2ludGVyUG9zaXRpb24uZnJhbWVQb3NpdGlvbiA9dnBYUG9zO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucG9pbnRlclBvc2l0aW9uRXZlbnRFbWl0dGVyLmVtaXQocG9pbnRlclBvc2l0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RpbmdDaGFuZ2Uodmlld1NlbDpWaWV3U2VsZWN0aW9ufCBudWxsKXtcclxuICAgICAgICBsZXQgbnM6U2VsZWN0aW9ufHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgICAgICAgaWYodmlld1NlbCkge1xyXG4gICAgICAgICAgICBsZXQgZnJhbWVTdGFydCA9IHRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24odmlld1NlbC5zdGFydFgpXHJcbiAgICAgICAgICAgIGxldCBmcmFtZUVuZCA9IHRoaXMudmlld1BvcnRYUGl4ZWxUb0ZyYW1lUG9zaXRpb24odmlld1NlbC5lbmRYKVxyXG4gICAgICAgICAgICBpZih0aGlzLl9hdWRpb0RhdGEgJiYgZnJhbWVTdGFydCE9bnVsbCAmJiBmcmFtZUVuZCE9bnVsbCkge1xyXG4gICAgICAgICAgICAgICAgbnMgPSBuZXcgU2VsZWN0aW9uKHRoaXMuX2F1ZGlvRGF0YS5zYW1wbGVSYXRlLCBmcmFtZVN0YXJ0LCBmcmFtZUVuZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RpbmdFdmVudEVtaXR0ZXIuZW1pdChucylcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Qodmlld1NlbDpWaWV3U2VsZWN0aW9ufCBudWxsKXtcclxuICAgICAgICBsZXQgbnM6U2VsZWN0aW9ufHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgICAgICAgaWYodmlld1NlbCkge1xyXG4gICAgICAgICAgbGV0IGZyYW1lU3RhcnQgPSB0aGlzLnZpZXdQb3J0WFBpeGVsVG9GcmFtZVBvc2l0aW9uKHZpZXdTZWwuc3RhcnRYKVxyXG4gICAgICAgICAgbGV0IGZyYW1lRW5kID0gdGhpcy52aWV3UG9ydFhQaXhlbFRvRnJhbWVQb3NpdGlvbih2aWV3U2VsLmVuZFgpXHJcbiAgICAgICAgICAgIGlmKHRoaXMuX2F1ZGlvRGF0YSAmJiBmcmFtZVN0YXJ0IT1udWxsICYmIGZyYW1lRW5kIT1udWxsKSB7XHJcbiAgICAgICAgICAgICAgICBucyA9IG5ldyBTZWxlY3Rpb24odGhpcy5fYXVkaW9EYXRhLnNhbXBsZVJhdGUsIGZyYW1lU3RhcnQsIGZyYW1lRW5kKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkRXZlbnRFbWl0dGVyLmVtaXQobnMpXHJcbiAgICB9XHJcblxyXG4gICAgdmlld1NlbGVjdGlvbigpOlZpZXdTZWxlY3Rpb258bnVsbHtcclxuICAgICAgbGV0IHZzOlZpZXdTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICBsZXQgczpTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICBpZih0aGlzLl9zZWxlY3Rpbmcpe1xyXG4gICAgICAgIHM9dGhpcy5fc2VsZWN0aW5nXHJcbiAgICAgIH1lbHNlIGlmKHRoaXMuX3NlbGVjdGlvbil7XHJcbiAgICAgICAgcz10aGlzLl9zZWxlY3Rpb25cclxuICAgICAgfVxyXG4gICAgICBpZihzKXtcclxuICAgICAgICBsZXQgc2Y9cy5zdGFydEZyYW1lO1xyXG4gICAgICAgIGxldCBlZj1zLmVuZEZyYW1lO1xyXG4gICAgICAgIGxldCB4cz10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKHNmKVxyXG4gICAgICAgIGxldCB4ZT10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGVmKVxyXG4gICAgICAgICAgaWYoeHMhPW51bGwgJiYgeGUhPW51bGwpIHtcclxuICAgICAgICAgICAgICB2cyA9IG5ldyBWaWV3U2VsZWN0aW9uKHhzLCB4ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdnM7XHJcbiAgICB9XHJcblxyXG5cclxuICBkcmF3QmcoKXtcclxuICAgICAgaWYodGhpcy5iZ0NhbnZhcyAmJiB0aGlzLmJvdW5kcykge1xyXG4gICAgICAgICAgdGhpcy5iZ0NhbnZhcy5zdHlsZS5sZWZ0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5wb3NpdGlvbi5sZWZ0KS50b1N0cmluZygpICsgJ3B4JztcclxuICAgICAgICAgIHRoaXMuYmdDYW52YXMud2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgICAgICB0aGlzLmJnQ2FudmFzLmhlaWdodCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLmhlaWdodCk7XHJcbiAgICAgICAgbGV0IGcxID0gdGhpcy5iZ0NhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XHJcbiAgICAgICAgaWYgKGcxKSB7XHJcbiAgICAgICAgICBsZXQgdyA9IHRoaXMuYmdDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICBsZXQgaCA9IHRoaXMuYmdDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgICAgZzEuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAgICAgaWYodGhpcy5fYmdDb2xvcikge1xyXG4gICAgICAgICAgICBnMS5maWxsU3R5bGUgPSB0aGlzLl9iZ0NvbG9yO1xyXG4gICAgICAgICAgICBnMS5maWxsUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCB2cyA9IHRoaXMudmlld1NlbGVjdGlvbigpXHJcbiAgICAgICAgICBpZiAodnMpIHtcclxuICAgICAgICAgICAgZzEuZmlsbFN0eWxlID0gdGhpcy5fc2VsZWN0Q29sb3I7XHJcbiAgICAgICAgICAgIGcxLmZpbGxSZWN0KHZzLnN0YXJ0WCwgMCwgdnMud2lkdGgoKSwgaCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgfVxyXG4gICAgZHJhd0N1cnNvckxheWVyKCl7XHJcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yQ2FudmFzKSB7XHJcbiAgICAgICAgICAgIGxldCB3ID0gdGhpcy5jdXJzb3JDYW52YXMud2lkdGg7XHJcbiAgICAgICAgICAgIGxldCBoID0gdGhpcy5jdXJzb3JDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgZyA9IHRoaXMuY3Vyc29yQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICAgICAgaWYoZykge1xyXG4gICAgICAgICAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgczpTZWxlY3Rpb249bnVsbDtcclxuICAgICAgICAgICAgICAgIC8vIGlmKHRoaXMuX3NlbGVjdGluZyl7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcz10aGlzLl9zZWxlY3RpbmdcclxuICAgICAgICAgICAgICAgIC8vIH1lbHNlIGlmKHRoaXMuX3NlbGVjdGlvbil7XHJcbiAgICAgICAgICAgICAgICAvLyAgICAgcz10aGlzLl9zZWxlY3Rpb25cclxuICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgIC8vIGlmKHMpe1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBzZj1zLnN0YXJ0RnJhbWVcclxuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgZWY9cy5lbmRGcmFtZVxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCB4cz10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKHNmKVxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCB4ZT10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKGVmKVxyXG4gICAgICAgICAgICAgICAgLy8gICAgIGxldCBzdz14ZS14c1xyXG4gICAgICAgICAgICAgICAgLy8gICAgIGcuZmlsbFN0eWxlID0gJ3JnYmEoMCUsMCUsMTAwJSwyNSUpJztcclxuICAgICAgICAgICAgICAgIC8vICAgICBnLmZpbGxSZWN0KHhzLDAsc3csaCk7XHJcbiAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5fcG9pbnRlclBvc2l0aW9uKXtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lUG9zPXRoaXMuX3BvaW50ZXJQb3NpdGlvbi5mcmFtZVBvc2l0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWVQb3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhWaWV3UG9ydFBpeGVscG9zID0gdGhpcy5mcmFtZVRvVmlld1BvcnRYUGl4ZWxQb3NpdGlvbihmcmFtZVBvcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhWaWV3UG9ydFBpeGVscG9zKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5maWxsU3R5bGUgPSAneWVsbG93JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuc3Ryb2tlU3R5bGUgPSAneWVsbG93JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuYmVnaW5QYXRoKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLm1vdmVUbyh4Vmlld1BvcnRQaXhlbHBvcywgMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmxpbmVUbyh4Vmlld1BvcnRQaXhlbHBvcywgaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmNsb3NlUGF0aCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuc3Ryb2tlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZm9udCA9ICcxNHB4IHNhbnMtc2VyaWYnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3llbGxvdyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5maWxsVGV4dChmcmFtZVBvcy50b1N0cmluZygpLCB4Vmlld1BvcnRQaXhlbHBvcyArIDIsIDUwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuIl19
|