angular-slickgrid 8.13.1 → 8.13.2
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 +3 -3
- package/app/modules/angular-slickgrid/extensions/slickRowDetailView.d.ts +2 -4
- package/esm2022/app/modules/angular-slickgrid/components/angular-slickgrid.component.mjs +3 -1
- package/esm2022/app/modules/angular-slickgrid/extensions/slickRowDetailView.mjs +75 -98
- package/fesm2022/angular-slickgrid.mjs +76 -97
- package/fesm2022/angular-slickgrid.mjs.map +1 -1
- package/package.json +8 -8
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { addToArrayWhenNotExists, castObservableToPromise, SlickEventData, SlickRowSelectionModel, unsubscribeAll, } from '@slickgrid-universal/common';
|
|
1
|
+
import { addToArrayWhenNotExists, castObservableToPromise, createDomElement, SlickEventData, SlickRowSelectionModel, unsubscribeAll, } from '@slickgrid-universal/common';
|
|
2
2
|
import { SlickRowDetailView as UniversalSlickRowDetailView } from '@slickgrid-universal/row-detail-view-plugin';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
const ROW_DETAIL_CONTAINER_PREFIX = 'container_';
|
|
@@ -30,12 +30,6 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
30
30
|
get datasetIdPropName() {
|
|
31
31
|
return this.gridOptions.datasetIdPropertyName || 'id';
|
|
32
32
|
}
|
|
33
|
-
get eventHandler() {
|
|
34
|
-
return this._eventHandler;
|
|
35
|
-
}
|
|
36
|
-
set eventHandler(eventHandler) {
|
|
37
|
-
this._eventHandler = eventHandler;
|
|
38
|
-
}
|
|
39
33
|
/** Getter for the Grid Options pulled through the Grid Object */
|
|
40
34
|
get gridOptions() {
|
|
41
35
|
return (this._grid?.getOptions() || {});
|
|
@@ -89,11 +83,11 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
89
83
|
// when those are Angular View/ViewModel, we need to create View Component & provide the html containers to the Plugin (preTemplate/postTemplate methods)
|
|
90
84
|
if (!this.gridOptions.rowDetailView.preTemplate) {
|
|
91
85
|
this._preloadComponent = this.gridOptions?.rowDetailView?.preloadComponent;
|
|
92
|
-
this.addonOptions.preTemplate = () =>
|
|
86
|
+
this.addonOptions.preTemplate = () => createDomElement('div', { className: `${PRELOAD_CONTAINER_PREFIX}` });
|
|
93
87
|
}
|
|
94
88
|
if (!this.gridOptions.rowDetailView.postTemplate) {
|
|
95
89
|
this._viewComponent = this.gridOptions?.rowDetailView?.viewComponent;
|
|
96
|
-
this.addonOptions.postTemplate = (itemDetail) =>
|
|
90
|
+
this.addonOptions.postTemplate = (itemDetail) => createDomElement('div', { className: `${ROW_DETAIL_CONTAINER_PREFIX}${itemDetail[this.datasetIdPropName]}` });
|
|
97
91
|
}
|
|
98
92
|
// this also requires the Row Selection Model to be registered as well
|
|
99
93
|
if (!rowSelectionPlugin || !this._grid.getSelectionModel()) {
|
|
@@ -105,114 +99,101 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
105
99
|
if (this.rowDetailViewOptions.onExtensionRegistered) {
|
|
106
100
|
this.rowDetailViewOptions.onExtensionRegistered(this);
|
|
107
101
|
}
|
|
108
|
-
|
|
109
|
-
this.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
this._eventHandler.subscribe(this.onBeforeRowOutOfViewportRange, (event, args) => {
|
|
157
|
-
if (typeof this.rowDetailViewOptions?.onBeforeRowOutOfViewportRange === 'function') {
|
|
158
|
-
this.rowDetailViewOptions.onBeforeRowOutOfViewportRange(event, args);
|
|
159
|
-
}
|
|
160
|
-
this.disposeViewByItem(args.item);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
if (this.onRowOutOfViewportRange) {
|
|
164
|
-
this.eventHandler.subscribe(this.onRowOutOfViewportRange, (e, args) => {
|
|
165
|
-
if (this.rowDetailViewOptions && typeof this.rowDetailViewOptions.onRowOutOfViewportRange === 'function') {
|
|
166
|
-
this.rowDetailViewOptions.onRowOutOfViewportRange(e, args);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
}
|
|
102
|
+
this.eventHandler.subscribe(this.onAsyncResponse, (event, args) => {
|
|
103
|
+
if (this.rowDetailViewOptions && typeof this.rowDetailViewOptions.onAsyncResponse === 'function') {
|
|
104
|
+
this.rowDetailViewOptions.onAsyncResponse(event, args);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
this.eventHandler.subscribe(this.onAsyncEndUpdate, (e, args) => {
|
|
108
|
+
// destroy preload if exists
|
|
109
|
+
this._preloadCompRef?.destroy();
|
|
110
|
+
// triggers after backend called "onAsyncResponse.notify()"
|
|
111
|
+
this.renderViewModel(args?.item);
|
|
112
|
+
if (this.rowDetailViewOptions && typeof this.rowDetailViewOptions.onAsyncEndUpdate === 'function') {
|
|
113
|
+
this.rowDetailViewOptions.onAsyncEndUpdate(e, args);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
this.eventHandler.subscribe(this.onAfterRowDetailToggle, (e, args) => {
|
|
117
|
+
// display preload template & re-render all the other Detail Views after toggling
|
|
118
|
+
// the preload View will eventually go away once the data gets loaded after the "onAsyncEndUpdate" event
|
|
119
|
+
this.renderPreloadView();
|
|
120
|
+
if (this.rowDetailViewOptions && typeof this.rowDetailViewOptions.onAfterRowDetailToggle === 'function') {
|
|
121
|
+
this.rowDetailViewOptions.onAfterRowDetailToggle(e, args);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
this.eventHandler.subscribe(this.onBeforeRowDetailToggle, (e, args) => {
|
|
125
|
+
// before toggling row detail, we need to create View Component if it doesn't exist
|
|
126
|
+
this.handleOnBeforeRowDetailToggle(e, args);
|
|
127
|
+
if (this.rowDetailViewOptions && typeof this.rowDetailViewOptions.onBeforeRowDetailToggle === 'function') {
|
|
128
|
+
return this.rowDetailViewOptions.onBeforeRowDetailToggle(e, args);
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
});
|
|
132
|
+
this.eventHandler.subscribe(this.onRowBackToViewportRange, (e, args) => {
|
|
133
|
+
// when row is back to viewport range, we will re-render the View Component(s)
|
|
134
|
+
this.handleOnRowBackToViewportRange(e, args);
|
|
135
|
+
if (this.rowDetailViewOptions && typeof this.rowDetailViewOptions.onRowBackToViewportRange === 'function') {
|
|
136
|
+
this.rowDetailViewOptions.onRowBackToViewportRange(e, args);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
this._eventHandler.subscribe(this.onBeforeRowOutOfViewportRange, (event, args) => {
|
|
140
|
+
if (typeof this.rowDetailViewOptions?.onBeforeRowOutOfViewportRange === 'function') {
|
|
141
|
+
this.rowDetailViewOptions.onBeforeRowOutOfViewportRange(event, args);
|
|
142
|
+
}
|
|
143
|
+
this.disposeViewByItem(args.item);
|
|
144
|
+
});
|
|
145
|
+
this.eventHandler.subscribe(this.onRowOutOfViewportRange, (e, args) => {
|
|
146
|
+
if (this.rowDetailViewOptions && typeof this.rowDetailViewOptions.onRowOutOfViewportRange === 'function') {
|
|
147
|
+
this.rowDetailViewOptions.onRowOutOfViewportRange(e, args);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
170
150
|
// --
|
|
171
151
|
// hook some events needed by the Plugin itself
|
|
172
152
|
// we need to redraw the open detail views if we change column position (column reorder)
|
|
173
|
-
this.eventHandler.subscribe(this._grid.onColumnsReordered, this.redrawAllViewComponents.bind(this));
|
|
153
|
+
this.eventHandler.subscribe(this._grid.onColumnsReordered, this.redrawAllViewComponents.bind(this, false));
|
|
174
154
|
// on row selection changed, we also need to redraw
|
|
175
155
|
if (this.gridOptions.enableRowSelection || this.gridOptions.enableCheckboxSelector) {
|
|
176
|
-
this.eventHandler.subscribe(this._grid.onSelectedRowsChanged, this.redrawAllViewComponents.bind(this));
|
|
156
|
+
this.eventHandler.subscribe(this._grid.onSelectedRowsChanged, this.redrawAllViewComponents.bind(this, false));
|
|
177
157
|
}
|
|
178
158
|
// on sort, all row detail are collapsed so we can dispose of all the Views as well
|
|
179
159
|
this.eventHandler.subscribe(this._grid.onSort, this.disposeAllViewComponents.bind(this));
|
|
180
160
|
// redraw all Views whenever certain events are triggered
|
|
181
|
-
this._subscriptions.push(this.eventPubSubService?.subscribe(['onFilterChanged', 'onGridMenuColumnsChanged', 'onColumnPickerColumnsChanged'], this.redrawAllViewComponents.bind(this)), this.eventPubSubService?.subscribe(['onGridMenuClearAllFilters', 'onGridMenuClearAllSorting'], () => window.setTimeout(() => this.redrawAllViewComponents())));
|
|
161
|
+
this._subscriptions.push(this.eventPubSubService?.subscribe(['onFilterChanged', 'onGridMenuColumnsChanged', 'onColumnPickerColumnsChanged'], this.redrawAllViewComponents.bind(this, false)), this.eventPubSubService?.subscribe(['onGridMenuClearAllFilters', 'onGridMenuClearAllSorting'], () => window.setTimeout(() => this.redrawAllViewComponents())));
|
|
182
162
|
}
|
|
183
163
|
}
|
|
184
164
|
return this;
|
|
185
165
|
}
|
|
186
166
|
/** Redraw (re-render) all the expanded row detail View Components */
|
|
187
|
-
redrawAllViewComponents() {
|
|
167
|
+
redrawAllViewComponents(forceRedraw = false) {
|
|
188
168
|
this.resetRenderedRows();
|
|
189
169
|
this._views.forEach((view) => {
|
|
190
|
-
if (!view.rendered) {
|
|
170
|
+
if (!view.rendered || forceRedraw) {
|
|
171
|
+
forceRedraw && view.componentRef?.destroy();
|
|
191
172
|
this.redrawViewComponent(view);
|
|
192
173
|
}
|
|
193
174
|
});
|
|
194
175
|
}
|
|
195
176
|
/** Redraw the necessary View Component */
|
|
196
177
|
redrawViewComponent(createdView) {
|
|
197
|
-
const
|
|
198
|
-
if (
|
|
178
|
+
const containerElement = this.gridContainerElement.querySelector(`.${ROW_DETAIL_CONTAINER_PREFIX}${createdView.id}`);
|
|
179
|
+
if (containerElement) {
|
|
199
180
|
this.renderViewModel(createdView.dataContext);
|
|
200
181
|
}
|
|
201
182
|
}
|
|
202
183
|
/** Render (or re-render) the View Component (Row Detail) */
|
|
203
184
|
renderPreloadView() {
|
|
204
|
-
const
|
|
205
|
-
if (this._preloadComponent &&
|
|
206
|
-
const preloadComp = this.angularUtilService.createAngularComponentAppendToDom(this._preloadComponent,
|
|
185
|
+
const containerElement = this.gridContainerElement.querySelector(`.${PRELOAD_CONTAINER_PREFIX}`);
|
|
186
|
+
if (this._preloadComponent && containerElement) {
|
|
187
|
+
const preloadComp = this.angularUtilService.createAngularComponentAppendToDom(this._preloadComponent, containerElement, {}, { sanitizer: this._grid.sanitizeHtmlString });
|
|
207
188
|
this._preloadCompRef = preloadComp.componentRef;
|
|
208
189
|
}
|
|
209
190
|
}
|
|
210
191
|
/** Render (or re-render) the View Component (Row Detail) */
|
|
211
192
|
renderViewModel(item) {
|
|
212
|
-
const
|
|
213
|
-
if (this._viewComponent &&
|
|
193
|
+
const containerElement = this.gridContainerElement.querySelector(`.${ROW_DETAIL_CONTAINER_PREFIX}${item[this.datasetIdPropName]}`);
|
|
194
|
+
if (this._viewComponent && containerElement) {
|
|
214
195
|
// render row detail
|
|
215
|
-
const componentOutput = this.angularUtilService.createAngularComponentAppendToDom(this._viewComponent,
|
|
196
|
+
const componentOutput = this.angularUtilService.createAngularComponentAppendToDom(this._viewComponent, containerElement, {
|
|
216
197
|
model: item,
|
|
217
198
|
addon: this,
|
|
218
199
|
grid: this._grid,
|
|
@@ -237,21 +218,20 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
237
218
|
// ------------------
|
|
238
219
|
disposeViewByItem(item, removeFromArray = false) {
|
|
239
220
|
const foundViewIndex = this._views.findIndex((view) => view.id === item[this.datasetIdPropName]);
|
|
240
|
-
if (foundViewIndex >= 0
|
|
241
|
-
|
|
242
|
-
this.disposeView(expandedView);
|
|
221
|
+
if (foundViewIndex >= 0) {
|
|
222
|
+
this.disposeView(this._views[foundViewIndex]);
|
|
243
223
|
if (removeFromArray) {
|
|
244
224
|
this._views.splice(foundViewIndex, 1);
|
|
245
225
|
}
|
|
246
226
|
}
|
|
247
227
|
}
|
|
248
228
|
disposeView(expandedView) {
|
|
229
|
+
expandedView.rendered = false;
|
|
249
230
|
const compRef = expandedView?.componentRef;
|
|
250
231
|
if (compRef) {
|
|
251
232
|
this.appRef.detachView(compRef.hostView);
|
|
252
|
-
if (compRef?.destroy) {
|
|
233
|
+
if (typeof compRef?.destroy === 'function') {
|
|
253
234
|
compRef.destroy();
|
|
254
|
-
expandedView.rendered = false;
|
|
255
235
|
}
|
|
256
236
|
return expandedView;
|
|
257
237
|
}
|
|
@@ -262,9 +242,7 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
262
242
|
* @param item
|
|
263
243
|
*/
|
|
264
244
|
notifyTemplate(item) {
|
|
265
|
-
|
|
266
|
-
this.onAsyncResponse.notify({ item, itemDetail: item }, new SlickEventData(), this);
|
|
267
|
-
}
|
|
245
|
+
this.onAsyncResponse.notify({ item, itemDetail: item }, new SlickEventData(), this);
|
|
268
246
|
}
|
|
269
247
|
/**
|
|
270
248
|
* On Processing, we will notify the plugin with the new item detail once backend server call completes
|
|
@@ -283,8 +261,8 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
283
261
|
awaitedItemDetail = await castObservableToPromise(this.rxjs, response); // from Angular-http-client
|
|
284
262
|
}
|
|
285
263
|
if (!awaitedItemDetail || !(this.datasetIdPropName in awaitedItemDetail)) {
|
|
286
|
-
throw new Error(
|
|
287
|
-
|
|
264
|
+
throw new Error('[Angular-Slickgrid] could not process the Row Detail, you must make sure that your "process" callback ' +
|
|
265
|
+
`returns an item object that has an "${this.datasetIdPropName}" property`);
|
|
288
266
|
}
|
|
289
267
|
// notify the plugin with the new item details
|
|
290
268
|
this.notifyTemplate(awaitedItemDetail || {});
|
|
@@ -305,8 +283,7 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
305
283
|
dataContext: args.item,
|
|
306
284
|
rendered: false,
|
|
307
285
|
};
|
|
308
|
-
|
|
309
|
-
addToArrayWhenNotExists(this._views, viewInfo, idPropName);
|
|
286
|
+
addToArrayWhenNotExists(this._views, viewInfo, this.datasetIdPropName);
|
|
310
287
|
}
|
|
311
288
|
else {
|
|
312
289
|
// collapsing, so dispose of the View/Component
|
|
@@ -315,10 +292,10 @@ export class SlickRowDetailView extends UniversalSlickRowDetailView {
|
|
|
315
292
|
}
|
|
316
293
|
/** When Row comes back to Viewport Range, we need to redraw the View */
|
|
317
294
|
handleOnRowBackToViewportRange(_e, args) {
|
|
318
|
-
const viewModel =
|
|
295
|
+
const viewModel = this._views.find((x) => x.id === args.rowId);
|
|
319
296
|
if (viewModel && !viewModel.rendered) {
|
|
320
297
|
this.redrawViewComponent(viewModel);
|
|
321
298
|
}
|
|
322
299
|
}
|
|
323
300
|
}
|
|
324
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2tSb3dEZXRhaWxWaWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2V4dGVuc2lvbnMvc2xpY2tSb3dEZXRhaWxWaWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVNBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLGNBQWMsRUFDZCxzQkFBc0IsRUFDdEIsY0FBYyxHQUNmLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsT0FBTyxFQUFFLGtCQUFrQixJQUFJLDJCQUEyQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDaEgsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFLaEQsTUFBTSwyQkFBMkIsR0FBRyxZQUFZLENBQUM7QUFDakQsTUFBTSx3QkFBd0IsR0FBRyxtQkFBbUIsQ0FBQztBQVNyRCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsMkJBQTJCO0lBVTVDO0lBQ0E7SUFDQTtJQUNBO0lBQ1Q7SUFiWixrQkFBa0IsQ0FBb0I7SUFDNUIsaUJBQWlCLENBQTJCO0lBQzVDLGVBQWUsQ0FBcUI7SUFDcEMsTUFBTSxHQUFrQixFQUFFLENBQUM7SUFDM0IsY0FBYyxDQUFnQjtJQUM5QixjQUFjLEdBQXdCLEVBQUUsQ0FBQztJQUN6QyxjQUFjLENBQWdFO0lBRXhGLFlBQ3FCLGtCQUFzQyxFQUN0QyxNQUFzQixFQUN0QixrQkFBc0MsRUFDdEMsb0JBQW9DLEVBQzdDLElBQWlCO1FBRTNCLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBTlAsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBZ0I7UUFDN0MsU0FBSSxHQUFKLElBQUksQ0FBYTtJQUc3QixD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WUFBWTtRQUNaLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUM1Qix1QkFBdUI7WUFDdkIsTUFBTSxRQUFRLEdBQWdCO2dCQUM1QixFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7Z0JBQ3JDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDdEIsUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQztZQUNGLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDO1lBQ2xFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdELENBQUM7YUFBTSxDQUFDO1lBQ04sK0NBQStDO1lBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQzlELDhCQUE4QixDQUFDLEVBQWdELEVBQUUsSUFBa0M7UUFDM0gsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRSxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXBwbGljYXRpb25SZWYsIENvbXBvbmVudFJlZiwgVHlwZSwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBFdmVudFN1YnNjcmlwdGlvbixcbiAgT25CZWZvcmVSb3dEZXRhaWxUb2dnbGVBcmdzLFxuICBPblJvd0JhY2tUb1ZpZXdwb3J0UmFuZ2VBcmdzLFxuICBSeEpzRmFjYWRlLFxuICBTbGlja0V2ZW50SGFuZGxlcixcbiAgU2xpY2tHcmlkLFxufSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jb21tb24nO1xuaW1wb3J0IHtcbiAgYWRkVG9BcnJheVdoZW5Ob3RFeGlzdHMsXG4gIGNhc3RPYnNlcnZhYmxlVG9Qcm9taXNlLFxuICBTbGlja0V2ZW50RGF0YSxcbiAgU2xpY2tSb3dTZWxlY3Rpb25Nb2RlbCxcbiAgdW5zdWJzY3JpYmVBbGwsXG59IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEV2ZW50UHViU3ViU2VydmljZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2V2ZW50LXB1Yi1zdWInO1xuaW1wb3J0IHsgU2xpY2tSb3dEZXRhaWxWaWV3IGFzIFVuaXZlcnNhbFNsaWNrUm93RGV0YWlsVmlldyB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3Jvdy1kZXRhaWwtdmlldy1wbHVnaW4nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdHlwZSBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB0eXBlIHsgR3JpZE9wdGlvbiwgUm93RGV0YWlsVmlldyB9IGZyb20gJy4uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgdHlwZSB7IEFuZ3VsYXJVdGlsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FuZ3VsYXJVdGlsLnNlcnZpY2UnO1xuXG5jb25zdCBST1dfREVUQUlMX0NPTlRBSU5FUl9QUkVGSVggPSAnY29udGFpbmVyXyc7XG5jb25zdCBQUkVMT0FEX0NPTlRBSU5FUl9QUkVGSVggPSAnY29udGFpbmVyX2xvYWRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZWRWaWV3IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgZGF0YUNvbnRleHQ6IGFueTtcbiAgY29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPGFueT47XG4gIHJlbmRlcmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNsaWNrUm93RGV0YWlsVmlldyBleHRlbmRzIFVuaXZlcnNhbFNsaWNrUm93RGV0YWlsVmlldyB7XG4gIHJvd0RldGFpbENvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG4gIHByb3RlY3RlZCBfcHJlbG9hZENvbXBvbmVudDogVHlwZTxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3ByZWxvYWRDb21wUmVmPzogQ29tcG9uZW50UmVmPGFueT47XG4gIHByb3RlY3RlZCBfdmlld3M6IENyZWF0ZWRWaWV3W10gPSBbXTtcbiAgcHJvdGVjdGVkIF92aWV3Q29tcG9uZW50ITogVHlwZTxvYmplY3Q+O1xuICBwcm90ZWN0ZWQgX3N1YnNjcmlwdGlvbnM6IEV2ZW50U3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJvdGVjdGVkIF91c2VyUHJvY2Vzc0ZuITogKGl0ZW06IGFueSkgPT4gUHJvbWlzZTxhbnk+IHwgT2JzZXJ2YWJsZTxhbnk+IHwgU3ViamVjdDxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhbmd1bGFyVXRpbFNlcnZpY2U6IEFuZ3VsYXJVdGlsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRQdWJTdWJTZXJ2aWNlOiBFdmVudFB1YlN1YlNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyaWRDb250YWluZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcm90ZWN0ZWQgcnhqcz86IFJ4SnNGYWNhZGVcbiAgKSB7XG4gICAgc3VwZXIoZXZlbnRQdWJTdWJTZXJ2aWNlKTtcbiAgfVxuXG4gIGdldCBhZGRvbk9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9ucygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBkYXRhc2V0SWRQcm9wTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSB8fCAnaWQnO1xuICB9XG5cbiAgZ2V0IGV2ZW50SGFuZGxlcigpOiBTbGlja0V2ZW50SGFuZGxlciB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50SGFuZGxlcjtcbiAgfVxuICBzZXQgZXZlbnRIYW5kbGVyKGV2ZW50SGFuZGxlcjogU2xpY2tFdmVudEhhbmRsZXIpIHtcbiAgICB0aGlzLl9ldmVudEhhbmRsZXIgPSBldmVudEhhbmRsZXI7XG4gIH1cblxuICAvKiogR2V0dGVyIGZvciB0aGUgR3JpZCBPcHRpb25zIHB1bGxlZCB0aHJvdWdoIHRoZSBHcmlkIE9iamVjdCAqL1xuICBnZXQgZ3JpZE9wdGlvbnMoKTogR3JpZE9wdGlvbiB7XG4gICAgcmV0dXJuICh0aGlzLl9ncmlkPy5nZXRPcHRpb25zKCkgfHwge30pIGFzIEdyaWRPcHRpb247XG4gIH1cblxuICBnZXQgcm93RGV0YWlsVmlld09wdGlvbnMoKTogUm93RGV0YWlsVmlldyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMucm93RGV0YWlsVmlldztcbiAgfVxuXG4gIGFkZFJ4SnNSZXNvdXJjZShyeGpzOiBSeEpzRmFjYWRlKSB7XG4gICAgdGhpcy5yeGpzID0gcnhqcztcbiAgfVxuXG4gIC8qKiBEaXNwb3NlIG9mIHRoZSBSb3dEZXRhaWxWaWV3IEV4dGVuc2lvbiAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuZGlzcG9zZUFsbFZpZXdDb21wb25lbnRzKCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IHVuc3Vic2NyaWJlQWxsKHRoaXMuX3N1YnNjcmlwdGlvbnMpOyAvLyBhbHNvIHVuc3Vic2NyaWJlIGFsbCBSeEpTIHN1YnNjcmlwdGlvbnNcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvKiogRGlzcG9zZSBvZiBhbGwgdGhlIG9wZW5lZCBSb3cgRGV0YWlsIFBhbmVscyBBbmd1bGFyIFZpZXcgQ29tcG9uZW50cyAqL1xuICBkaXNwb3NlQWxsVmlld0NvbXBvbmVudHMoKSB7XG4gICAgZG8ge1xuICAgICAgY29uc3QgdmlldyA9IHRoaXMuX3ZpZXdzLnBvcCgpO1xuICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlVmlldyh2aWV3KTtcbiAgICAgIH1cbiAgICB9IHdoaWxlICh0aGlzLl92aWV3cy5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBTbGlja0dyaWQgYWRkb24gKGNvbnRyb2wgb3IgcGx1Z2luKS4gKi9cbiAgZ2V0QWRkb25JbnN0YW5jZSgpOiBTbGlja1Jvd0RldGFpbFZpZXcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGluaXQoZ3JpZDogU2xpY2tHcmlkKSB7XG4gICAgdGhpcy5fZ3JpZCA9IGdyaWQ7XG4gICAgc3VwZXIuaW5pdCh0aGlzLl9ncmlkKTtcbiAgICB0aGlzLnJlZ2lzdGVyKGdyaWQ/LmdldFNlbGVjdGlvbk1vZGVsKCkgYXMgU2xpY2tSb3dTZWxlY3Rpb25Nb2RlbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBwbHVnaW4gYmVmb3JlIHRoZSBHcmlkIGNyZWF0aW9uLCBlbHNlIGl0IHdpbGwgYmVoYXZlIG9kZGx5LlxuICAgKiBNb3N0bHkgYmVjYXVzZSB0aGUgY29sdW1uIGRlZmluaXRpb25zIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgZ3JpZCBjcmVhdGlvblxuICAgKi9cbiAgcmVnaXN0ZXIocm93U2VsZWN0aW9uUGx1Z2luPzogU2xpY2tSb3dTZWxlY3Rpb25Nb2RlbCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5ncmlkT3B0aW9ucy5yb3dEZXRhaWxWaWV3Py5wcm9jZXNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyB3ZSBuZWVkIHRvIGtlZXAgdGhlIHVzZXIgXCJwcm9jZXNzXCIgbWV0aG9kIGFuZCByZXBsYWNlIGl0IHdpdGggb3VyIG93biBleGVjdXRpb24gbWV0aG9kXG4gICAgICAvLyB3ZSBkbyB0aGlzIGJlY2F1c2Ugd2hlbiB3ZSBnZXQgdGhlIGl0ZW0gZGV0YWlsLCB3ZSBuZWVkIHRvIGNhbGwgXCJvbkFzeW5jUmVzcG9uc2Uubm90aWZ5XCIgZm9yIHRoZSBwbHVnaW4gdG8gd29ya1xuICAgICAgdGhpcy5fdXNlclByb2Nlc3NGbiA9IHRoaXMuZ3JpZE9wdGlvbnMucm93RGV0YWlsVmlldy5wcm9jZXNzIGFzIChpdGVtOiBhbnkpID0+IFByb21pc2U8YW55PjsgLy8ga2VlcCB1c2VyJ3MgcHJvY2VzcyBtZXRob2RcbiAgICAgIHRoaXMuYWRkb25PcHRpb25zLnByb2Nlc3MgPSAoaXRlbSkgPT4gdGhpcy5vblByb2Nlc3NpbmcoaXRlbSk7IC8vIHJlcGxhY2UgcHJvY2VzcyBtZXRob2QgJiBydW4gb3VyIGludGVybmFsIG9uZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbQW5ndWxhci1TbGlja2dyaWRdIFlvdSBuZWVkIHRvIHByb3ZpZGUgYSBcInByb2Nlc3NcIiBmdW5jdGlvbiBmb3IgdGhlIFJvdyBEZXRhaWwgRXh0ZW5zaW9uIHRvIHdvcmsgcHJvcGVybHknXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ncmlkICYmIHRoaXMuZ3JpZE9wdGlvbnM/LnJvd0RldGFpbFZpZXcpIHtcbiAgICAgIC8vIGxvYWQgdGhlIFByZWxvYWQgJiBSb3dEZXRhaWwgVGVtcGxhdGVzIChjb3VsZCBiZSBzdHJhaWdodCBIVE1MIG9yIEFuZ3VsYXIgVmlldy9WaWV3TW9kZWwpXG4gICAgICAvLyB3aGVuIHRob3NlIGFyZSBBbmd1bGFyIFZpZXcvVmlld01vZGVsLCB3ZSBuZWVkIHRvIGNyZWF0ZSBWaWV3IENvbXBvbmVudCAmIHByb3ZpZGUgdGhlIGh0bWwgY29udGFpbmVycyB0byB0aGUgUGx1Z2luIChwcmVUZW1wbGF0ZS9wb3N0VGVtcGxhdGUgbWV0aG9kcylcbiAgICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5yb3dEZXRhaWxWaWV3LnByZVRlbXBsYXRlKSB7XG4gICAgICAgIHRoaXMuX3ByZWxvYWRDb21wb25lbnQgPSB0aGlzLmdyaWRPcHRpb25zPy5yb3dEZXRhaWxWaWV3Py5wcmVsb2FkQ29tcG9uZW50O1xuICAgICAgICB0aGlzLmFkZG9uT3B0aW9ucy5wcmVUZW1wbGF0ZSA9ICgpID0+XG4gICAgICAgICAgdGhpcy5fZ3JpZC5zYW5pdGl6ZUh0bWxTdHJpbmcoYDxkaXYgY2xhc3M9XCIke1BSRUxPQURfQ09OVEFJTkVSX1BSRUZJWH1cIj48L2Rpdj5gKSBhcyBzdHJpbmc7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMucm93RGV0YWlsVmlldy5wb3N0VGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5fdmlld0NvbXBvbmVudCA9IHRoaXMuZ3JpZE9wdGlvbnM/LnJvd0RldGFpbFZpZXc/LnZpZXdDb21wb25lbnQ7XG4gICAgICAgIHRoaXMuYWRkb25PcHRpb25zLnBvc3RUZW1wbGF0ZSA9IChpdGVtRGV0YWlsOiBhbnkpID0+XG4gICAgICAgICAgdGhpcy5fZ3JpZC5zYW5pdGl6ZUh0bWxTdHJpbmcoXG4gICAgICAgICAgICBgPGRpdiBjbGFzcz1cIiR7Uk9XX0RFVEFJTF9DT05UQUlORVJfUFJFRklYfSR7aXRlbURldGFpbFt0aGlzLmRhdGFzZXRJZFByb3BOYW1lXX1cIj48L2Rpdj5gXG4gICAgICAgICAgKSBhcyBzdHJpbmc7XG4gICAgICB9XG5cbiAgICAgIC8vIHRoaXMgYWxzbyByZXF1aXJlcyB0aGUgUm93IFNlbGVjdGlvbiBNb2RlbCB0byBiZSByZWdpc3RlcmVkIGFzIHdlbGxcbiAgICAgIGlmICghcm93U2VsZWN0aW9uUGx1Z2luIHx8ICF0aGlzLl9ncmlkLmdldFNlbGVjdGlvbk1vZGVsKCkpIHtcbiAgICAgICAgcm93U2VsZWN0aW9uUGx1Z2luID0gbmV3IFNsaWNrUm93U2VsZWN0aW9uTW9kZWwodGhpcy5ncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb25PcHRpb25zIHx8IHsgc2VsZWN0QWN0aXZlUm93OiB0cnVlIH0pO1xuICAgICAgICB0aGlzLl9ncmlkLnNldFNlbGVjdGlvbk1vZGVsKHJvd1NlbGVjdGlvblBsdWdpbik7XG4gICAgICB9XG5cbiAgICAgIC8vIGhvb2sgYWxsIGV2ZW50c1xuICAgICAgaWYgKHRoaXMuX2dyaWQgJiYgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucykge1xuICAgICAgICBpZiAodGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkV4dGVuc2lvblJlZ2lzdGVyZWQpIHtcbiAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uRXh0ZW5zaW9uUmVnaXN0ZXJlZCh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uQXN5bmNSZXNwb25zZSkge1xuICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLm9uQXN5bmNSZXNwb25zZSwgKGV2ZW50LCBhcmdzKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkFzeW5jUmVzcG9uc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkFzeW5jUmVzcG9uc2UoZXZlbnQsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25Bc3luY0VuZFVwZGF0ZSkge1xuICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLm9uQXN5bmNFbmRVcGRhdGUsIChlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgICAvLyBkZXN0cm95IHByZWxvYWQgaWYgZXhpc3RzXG4gICAgICAgICAgICB0aGlzLl9wcmVsb2FkQ29tcFJlZj8uZGVzdHJveSgpO1xuXG4gICAgICAgICAgICAvLyB0cmlnZ2VycyBhZnRlciBiYWNrZW5kIGNhbGxlZCBcIm9uQXN5bmNSZXNwb25zZS5ub3RpZnkoKVwiXG4gICAgICAgICAgICB0aGlzLnJlbmRlclZpZXdNb2RlbChhcmdzPy5pdGVtKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMgJiYgdHlwZW9mIHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMub25Bc3luY0VuZFVwZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uQXN5bmNFbmRVcGRhdGUoZSwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbkFmdGVyUm93RGV0YWlsVG9nZ2xlKSB7XG4gICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuc3Vic2NyaWJlKFxuICAgICAgICAgICAgdGhpcy5vbkFmdGVyUm93RGV0YWlsVG9nZ2xlLFxuICAgICAgICAgICAgKGU6IGFueSwgYXJnczogeyBncmlkOiBTbGlja0dyaWQ7IGl0ZW06IGFueTsgZXhwYW5kZWRSb3dzOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+IH0pID0+IHtcbiAgICAgICAgICAgICAgLy8gZGlzcGxheSBwcmVsb2FkIHRlbXBsYXRlICYgcmUtcmVuZGVyIGFsbCB0aGUgb3RoZXIgRGV0YWlsIFZpZXdzIGFmdGVyIHRvZ2dsaW5nXG4gICAgICAgICAgICAgIC8vIHRoZSBwcmVsb2FkIFZpZXcgd2lsbCBldmVudHVhbGx5IGdvIGF3YXkgb25jZSB0aGUgZGF0YSBnZXRzIGxvYWRlZCBhZnRlciB0aGUgXCJvbkFzeW5jRW5kVXBkYXRlXCIgZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy5yZW5kZXJQcmVsb2FkVmlldygpO1xuXG4gICAgICAgICAgICAgIGlmICh0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zICYmIHR5cGVvZiB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uQWZ0ZXJSb3dEZXRhaWxUb2dnbGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uQWZ0ZXJSb3dEZXRhaWxUb2dnbGUoZSwgYXJncyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVSb3dEZXRhaWxUb2dnbGUpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5zdWJzY3JpYmUodGhpcy5vbkJlZm9yZVJvd0RldGFpbFRvZ2dsZSwgKGUsIGFyZ3MpID0+IHtcbiAgICAgICAgICAgIC8vIGJlZm9yZSB0b2dnbGluZyByb3cgZGV0YWlsLCB3ZSBuZWVkIHRvIGNyZWF0ZSBWaWV3IENvbXBvbmVudCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9uQmVmb3JlUm93RGV0YWlsVG9nZ2xlKGUsIGFyZ3MpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkJlZm9yZVJvd0RldGFpbFRvZ2dsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkJlZm9yZVJvd0RldGFpbFRvZ2dsZShlLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25Sb3dCYWNrVG9WaWV3cG9ydFJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuc3Vic2NyaWJlKHRoaXMub25Sb3dCYWNrVG9WaWV3cG9ydFJhbmdlLCAoZSwgYXJncykgPT4ge1xuICAgICAgICAgICAgLy8gd2hlbiByb3cgaXMgYmFjayB0byB2aWV3cG9ydCByYW5nZSwgd2Ugd2lsbCByZS1yZW5kZXIgdGhlIFZpZXcgQ29tcG9uZW50KHMpXG4gICAgICAgICAgICB0aGlzLmhhbmRsZU9uUm93QmFja1RvVmlld3BvcnRSYW5nZShlLCBhcmdzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMgJiYgdHlwZW9mIHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMub25Sb3dCYWNrVG9WaWV3cG9ydFJhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMub25Sb3dCYWNrVG9WaWV3cG9ydFJhbmdlKGUsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25CZWZvcmVSb3dPdXRPZlZpZXdwb3J0UmFuZ2UpIHtcbiAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKHRoaXMub25CZWZvcmVSb3dPdXRPZlZpZXdwb3J0UmFuZ2UsIChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zPy5vbkJlZm9yZVJvd091dE9mVmlld3BvcnRSYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uQmVmb3JlUm93T3V0T2ZWaWV3cG9ydFJhbmdlKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZVZpZXdCeUl0ZW0oYXJncy5pdGVtKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uUm93T3V0T2ZWaWV3cG9ydFJhbmdlKSB7XG4gICAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuc3Vic2NyaWJlKHRoaXMub25Sb3dPdXRPZlZpZXdwb3J0UmFuZ2UsIChlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vblJvd091dE9mVmlld3BvcnRSYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uUm93T3V0T2ZWaWV3cG9ydFJhbmdlKGUsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS1cbiAgICAgICAgLy8gaG9vayBzb21lIGV2ZW50cyBuZWVkZWQgYnkgdGhlIFBsdWdpbiBpdHNlbGZcblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlZHJhdyB0aGUgb3BlbiBkZXRhaWwgdmlld3MgaWYgd2UgY2hhbmdlIGNvbHVtbiBwb3NpdGlvbiAoY29sdW1uIHJlb3JkZXIpXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLl9ncmlkLm9uQ29sdW1uc1Jlb3JkZXJlZCwgdGhpcy5yZWRyYXdBbGxWaWV3Q29tcG9uZW50cy5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBvbiByb3cgc2VsZWN0aW9uIGNoYW5nZWQsIHdlIGFsc28gbmVlZCB0byByZWRyYXdcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlUm93U2VsZWN0aW9uIHx8IHRoaXMuZ3JpZE9wdGlvbnMuZW5hYmxlQ2hlY2tib3hTZWxlY3Rvcikge1xuICAgICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLl9ncmlkLm9uU2VsZWN0ZWRSb3dzQ2hhbmdlZCwgdGhpcy5yZWRyYXdBbGxWaWV3Q29tcG9uZW50cy5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG9uIHNvcnQsIGFsbCByb3cgZGV0YWlsIGFyZSBjb2xsYXBzZWQgc28gd2UgY2FuIGRpc3Bvc2Ugb2YgYWxsIHRoZSBWaWV3cyBhcyB3ZWxsXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLl9ncmlkLm9uU29ydCwgdGhpcy5kaXNwb3NlQWxsVmlld0NvbXBvbmVudHMuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gcmVkcmF3IGFsbCBWaWV3cyB3aGVuZXZlciBjZXJ0YWluIGV2ZW50cyBhcmUgdHJpZ2dlcmVkXG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICB0aGlzLmV2ZW50UHViU3ViU2VydmljZT8uc3Vic2NyaWJlKFxuICAgICAgICAgICAgWydvbkZpbHRlckNoYW5nZWQnLCAnb25HcmlkTWVudUNvbHVtbnNDaGFuZ2VkJywgJ29uQ29sdW1uUGlja2VyQ29sdW1uc0NoYW5nZWQnXSxcbiAgICAgICAgICAgIHRoaXMucmVkcmF3QWxsVmlld0NvbXBvbmVudHMuYmluZCh0aGlzKVxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy5ldmVudFB1YlN1YlNlcnZpY2U/LnN1YnNjcmliZShbJ29uR3JpZE1lbnVDbGVhckFsbEZpbHRlcnMnLCAnb25HcmlkTWVudUNsZWFyQWxsU29ydGluZyddLCAoKSA9PlxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWRyYXdBbGxWaWV3Q29tcG9uZW50cygpKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogUmVkcmF3IChyZS1yZW5kZXIpIGFsbCB0aGUgZXhwYW5kZWQgcm93IGRldGFpbCBWaWV3IENvbXBvbmVudHMgKi9cbiAgcmVkcmF3QWxsVmlld0NvbXBvbmVudHMoKSB7XG4gICAgdGhpcy5yZXNldFJlbmRlcmVkUm93cygpO1xuICAgIHRoaXMuX3ZpZXdzLmZvckVhY2goKHZpZXcpID0+IHtcbiAgICAgIGlmICghdmlldy5yZW5kZXJlZCkge1xuICAgICAgICB0aGlzLnJlZHJhd1ZpZXdDb21wb25lbnQodmlldyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmVkcmF3IHRoZSBuZWNlc3NhcnkgVmlldyBDb21wb25lbnQgKi9cbiAgcmVkcmF3Vmlld0NvbXBvbmVudChjcmVhdGVkVmlldzogQ3JlYXRlZFZpZXcpIHtcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50cyA9IHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShgJHtST1dfREVUQUlMX0NPTlRBSU5FUl9QUkVGSVh9JHtjcmVhdGVkVmlldy5pZH1gKTtcbiAgICBpZiAoY29udGFpbmVyRWxlbWVudHM/Lmxlbmd0aCA+PSAwKSB7XG4gICAgICB0aGlzLnJlbmRlclZpZXdNb2RlbChjcmVhdGVkVmlldy5kYXRhQ29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlbmRlciAob3IgcmUtcmVuZGVyKSB0aGUgVmlldyBDb21wb25lbnQgKFJvdyBEZXRhaWwpICovXG4gIHJlbmRlclByZWxvYWRWaWV3KCkge1xuICAgIGNvbnN0IGNvbnRhaW5lckVsZW1lbnRzID0gdGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFxuICAgICAgYCR7UFJFTE9BRF9DT05UQUlORVJfUFJFRklYfWBcbiAgICApIGFzIEhUTUxDb2xsZWN0aW9uT2Y8SFRNTEVsZW1lbnQ+O1xuICAgIGlmICh0aGlzLl9wcmVsb2FkQ29tcG9uZW50ICYmIGNvbnRhaW5lckVsZW1lbnRzPy5sZW5ndGggPj0gMCkge1xuICAgICAgY29uc3QgcHJlbG9hZENvbXAgPSB0aGlzLmFuZ3VsYXJVdGlsU2VydmljZS5jcmVhdGVBbmd1bGFyQ29tcG9uZW50QXBwZW5kVG9Eb20oXG4gICAgICAgIHRoaXMuX3ByZWxvYWRDb21wb25lbnQsXG4gICAgICAgIGNvbnRhaW5lckVsZW1lbnRzW2NvbnRhaW5lckVsZW1lbnRzLmxlbmd0aCAtIDFdLFxuICAgICAgICB7fSxcbiAgICAgICAgeyBzYW5pdGl6ZXI6IHRoaXMuX2dyaWQuc2FuaXRpemVIdG1sU3RyaW5nIH1cbiAgICAgICk7XG4gICAgICB0aGlzLl9wcmVsb2FkQ29tcFJlZiA9IHByZWxvYWRDb21wLmNvbXBvbmVudFJlZjtcbiAgICB9XG4gIH1cblxuICAvKiogUmVuZGVyIChvciByZS1yZW5kZXIpIHRoZSBWaWV3IENvbXBvbmVudCAoUm93IERldGFpbCkgKi9cbiAgcmVuZGVyVmlld01vZGVsKGl0ZW06IGFueSk6IENyZWF0ZWRWaWV3IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50cyA9IHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcbiAgICAgIGAke1JPV19ERVRBSUxfQ09OVEFJTkVSX1BSRUZJWH0ke2l0ZW1bdGhpcy5kYXRhc2V0SWRQcm9wTmFtZV19YFxuICAgICkgYXMgSFRNTENvbGxlY3Rpb25PZjxIVE1MRWxlbWVudD47XG5cbiAgICBpZiAodGhpcy5fdmlld0NvbXBvbmVudCAmJiBjb250YWluZXJFbGVtZW50cz8ubGVuZ3RoID4gMCkge1xuICAgICAgLy8gcmVuZGVyIHJvdyBkZXRhaWxcbiAgICAgIGNvbnN0IGNvbXBvbmVudE91dHB1dCA9IHRoaXMuYW5ndWxhclV0aWxTZXJ2aWNlLmNyZWF0ZUFuZ3VsYXJDb21wb25lbnRBcHBlbmRUb0RvbShcbiAgICAgICAgdGhpcy5fdmlld0NvbXBvbmVudCxcbiAgICAgICAgY29udGFpbmVyRWxlbWVudHNbY29udGFpbmVyRWxlbWVudHMubGVuZ3RoIC0gMV0sXG4gICAgICAgIHtcbiAgICAgICAgICBtb2RlbDogaXRlbSxcbiAgICAgICAgICBhZGRvbjogdGhpcyxcbiAgICAgICAgICBncmlkOiB0aGlzLl9ncmlkLFxuICAgICAgICAgIGRhdGFWaWV3OiB0aGlzLmRhdGFWaWV3LFxuICAgICAgICAgIHBhcmVudDogdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucz8ucGFyZW50LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgc2FuaXRpemVyOiB0aGlzLl9ncmlkLnNhbml0aXplSHRtbFN0cmluZyxcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGlmIChjb21wb25lbnRPdXRwdXQ/LmNvbXBvbmVudFJlZikge1xuICAgICAgICBjb25zdCB2aWV3T2JqID0gdGhpcy5fdmlld3MuZmluZCgob2JqKSA9PiBvYmouaWQgPT09IGl0ZW1bdGhpcy5kYXRhc2V0SWRQcm9wTmFtZV0pO1xuICAgICAgICBpZiAodmlld09iaikge1xuICAgICAgICAgIHZpZXdPYmouY29tcG9uZW50UmVmID0gY29tcG9uZW50T3V0cHV0LmNvbXBvbmVudFJlZjtcbiAgICAgICAgICB2aWV3T2JqLnJlbmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlld09iajtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIC0tXG4gIC8vIHByb3RlY3RlZCBmdW5jdGlvbnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcHJvdGVjdGVkIGRpc3Bvc2VWaWV3QnlJdGVtKGl0ZW06IGFueSwgcmVtb3ZlRnJvbUFycmF5ID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBmb3VuZFZpZXdJbmRleCA9IHRoaXMuX3ZpZXdzLmZpbmRJbmRleCgodmlldzogQ3JlYXRlZFZpZXcpID0+IHZpZXcuaWQgPT09IGl0ZW1bdGhpcy5kYXRhc2V0SWRQcm9wTmFtZV0pO1xuICAgIGlmIChmb3VuZFZpZXdJbmRleCA+PSAwICYmIGZvdW5kVmlld0luZGV4IGluIHRoaXMuX3ZpZXdzKSB7XG4gICAgICBjb25zdCBleHBhbmRlZFZpZXcgPSB0aGlzLl92aWV3c1tmb3VuZFZpZXdJbmRleF07XG4gICAgICB0aGlzLmRpc3Bvc2VWaWV3KGV4cGFuZGVkVmlldyk7XG4gICAgICBpZiAocmVtb3ZlRnJvbUFycmF5KSB7XG4gICAgICAgIHRoaXMuX3ZpZXdzLnNwbGljZShmb3VuZFZpZXdJbmRleCwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRpc3Bvc2VWaWV3KGV4cGFuZGVkVmlldzogQ3JlYXRlZFZpZXcpOiBDcmVhdGVkVmlldyB8IHZvaWQge1xuICAgIGNvbnN0IGNvbXBSZWYgPSBleHBhbmRlZFZpZXc/LmNvbXBvbmVudFJlZjtcbiAgICBpZiAoY29tcFJlZikge1xuICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhjb21wUmVmLmhvc3RWaWV3KTtcbiAgICAgIGlmIChjb21wUmVmPy5kZXN0cm95KSB7XG4gICAgICAgIGNvbXBSZWYuZGVzdHJveSgpO1xuICAgICAgICBleHBhbmRlZFZpZXcucmVuZGVyZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHBhbmRlZFZpZXc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG5vdGlmeSB0aGUgb25Bc3luY1Jlc3BvbnNlIHdpdGggdGhlIFwiYXJncy5pdGVtXCIgKHJlcXVpcmVkIHByb3BlcnR5KVxuICAgKiB0aGUgcGx1Z2luIHdpbGwgdGhlbiB1c2UgaXRlbSB0byBwb3B1bGF0ZSB0aGUgcm93IGRldGFpbCBwYW5lbCB3aXRoIHRoZSBcInBvc3RUZW1wbGF0ZVwiXG4gICAqIEBwYXJhbSBpdGVtXG4gICAqL1xuICBwcm90ZWN0ZWQgbm90aWZ5VGVtcGxhdGUoaXRlbTogYW55KSB7XG4gICAgaWYgKHRoaXMub25Bc3luY1Jlc3BvbnNlKSB7XG4gICAgICB0aGlzLm9uQXN5bmNSZXNwb25zZS5ub3RpZnkoeyBpdGVtLCBpdGVtRGV0YWlsOiBpdGVtIH0sIG5ldyBTbGlja0V2ZW50RGF0YSgpLCB0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gUHJvY2Vzc2luZywgd2Ugd2lsbCBub3RpZnkgdGhlIHBsdWdpbiB3aXRoIHRoZSBuZXcgaXRlbSBkZXRhaWwgb25jZSBiYWNrZW5kIHNlcnZlciBjYWxsIGNvbXBsZXRlc1xuICAgKiBAcGFyYW0gaXRlbVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uUHJvY2Vzc2luZyhpdGVtOiBhbnkpIHtcbiAgICBpZiAoaXRlbSAmJiB0eXBlb2YgdGhpcy5fdXNlclByb2Nlc3NGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGV0IGF3YWl0ZWRJdGVtRGV0YWlsOiBhbnk7XG4gICAgICBjb25zdCB1c2VyUHJvY2Vzc0ZuID0gdGhpcy5fdXNlclByb2Nlc3NGbihpdGVtKTtcblxuICAgICAgLy8gd2FpdCBmb3IgdGhlIFwidXNlclByb2Nlc3NGblwiLCBvbmNlIHJlc29sdmVkIHdlIHdpbGwgc2F2ZSBpdCBpbnRvIHRoZSBcImNvbGxlY3Rpb25cIlxuICAgICAgY29uc3QgcmVzcG9uc2U6IGFueSB8IGFueVtdID0gYXdhaXQgdXNlclByb2Nlc3NGbjtcblxuICAgICAgaWYgKHRoaXMuZGF0YXNldElkUHJvcE5hbWUgaW4gcmVzcG9uc2UpIHtcbiAgICAgICAgYXdhaXRlZEl0ZW1EZXRhaWwgPSByZXNwb25zZTsgLy8gZnJvbSBQcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKChyZXNwb25zZSAmJiByZXNwb25zZSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHx8IHJlc3BvbnNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBhd2FpdGVkSXRlbURldGFpbCA9IGF3YWl0IGNhc3RPYnNlcnZhYmxlVG9Qcm9taXNlKHRoaXMucnhqcyBhcyBSeEpzRmFjYWRlLCByZXNwb25zZSk7IC8vIGZyb20gQW5ndWxhci1odHRwLWNsaWVudFxuICAgICAgfVxuXG4gICAgICBpZiAoIWF3YWl0ZWRJdGVtRGV0YWlsIHx8ICEodGhpcy5kYXRhc2V0SWRQcm9wTmFtZSBpbiBhd2FpdGVkSXRlbURldGFpbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbQW5ndWxhci1TbGlja2dyaWRdIGNvdWxkIG5vdCBwcm9jZXNzIHRoZSBSb3cgRGV0YWlsLCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB5b3VyIFwicHJvY2Vzc1wiIGNhbGxiYWNrXG4gICAgICAgICAgKGEgUHJvbWlzZSBvciBhbiBIdHRwQ2xpZW50IGNhbGwgcmV0dXJuaW5nIGFuIE9ic2VydmFibGUpIHJldHVybnMgYW4gaXRlbSBvYmplY3QgdGhhdCBoYXMgYW4gXCIke3RoaXMuZGF0YXNldElkUHJvcE5hbWV9XCIgcHJvcGVydHlgKTtcbiAgICAgIH1cblxuICAgICAgLy8gbm90aWZ5IHRoZSBwbHVnaW4gd2l0aCB0aGUgbmV3IGl0ZW0gZGV0YWlsc1xuICAgICAgdGhpcy5ub3RpZnlUZW1wbGF0ZShhd2FpdGVkSXRlbURldGFpbCB8fCB7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEp1c3QgYmVmb3JlIHRoZSByb3cgZ2V0IGV4cGFuZGVkIG9yIGNvbGxhcHNlZCB3ZSB3aWxsIGRvIHRoZSBmb2xsb3dpbmdcbiAgICogRmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSByb3cgaXMgZXhwYW5kaW5nIG9yIGNvbGxhcHNpbmcsXG4gICAqIGlmIGl0J3MgZXhwYW5kaW5nIHdlIHdpbGwgYWRkIGl0IHRvIG91ciBWaWV3IENvbXBvbmVudHMgcmVmZXJlbmNlIGFycmF5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBpdFxuICAgKiBvciBpZiBpdCdzIGNvbGxhcHNpbmcgd2Ugd2lsbCByZW1vdmUgaXQgZnJvbSBvdXIgVmlldyBDb21wb25lbnRzIHJlZmVyZW5jZSBhcnJheVxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZU9uQmVmb3JlUm93RGV0YWlsVG9nZ2xlKF9lOiBTbGlja0V2ZW50RGF0YTxPbkJlZm9yZVJvd0RldGFpbFRvZ2dsZUFyZ3M+LCBhcmdzOiB7IGdyaWQ6IFNsaWNrR3JpZDsgaXRlbTogYW55IH0pIHtcbiAgICAvLyBleHBhbmRpbmdcbiAgICBpZiAoYXJncz8uaXRlbT8uX19jb2xsYXBzZWQpIHtcbiAgICAgIC8vIGV4cGFuZGluZyByb3cgZGV0YWlsXG4gICAgICBjb25zdCB2aWV3SW5mbzogQ3JlYXRlZFZpZXcgPSB7XG4gICAgICAgIGlkOiBhcmdzLml0ZW1bdGhpcy5kYXRhc2V0SWRQcm9wTmFtZV0sXG4gICAgICAgIGRhdGFDb250ZXh0OiBhcmdzLml0ZW0sXG4gICAgICAgIHJlbmRlcmVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBjb25zdCBpZFByb3BOYW1lID0gdGhpcy5ncmlkT3B0aW9ucy5kYXRhc2V0SWRQcm9wZXJ0eU5hbWUgfHwgJ2lkJztcbiAgICAgIGFkZFRvQXJyYXlXaGVuTm90RXhpc3RzKHRoaXMuX3ZpZXdzLCB2aWV3SW5mbywgaWRQcm9wTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbGxhcHNpbmcsIHNvIGRpc3Bvc2Ugb2YgdGhlIFZpZXcvQ29tcG9uZW50XG4gICAgICB0aGlzLmRpc3Bvc2VWaWV3QnlJdGVtKGFyZ3MuaXRlbSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZW4gUm93IGNvbWVzIGJhY2sgdG8gVmlld3BvcnQgUmFuZ2UsIHdlIG5lZWQgdG8gcmVkcmF3IHRoZSBWaWV3ICovXG4gIHByb3RlY3RlZCBoYW5kbGVPblJvd0JhY2tUb1ZpZXdwb3J0UmFuZ2UoX2U6IFNsaWNrRXZlbnREYXRhPE9uUm93QmFja1RvVmlld3BvcnRSYW5nZUFyZ3M+LCBhcmdzOiBPblJvd0JhY2tUb1ZpZXdwb3J0UmFuZ2VBcmdzKSB7XG4gICAgY29uc3Qgdmlld01vZGVsID0gQXJyYXkuZnJvbSh0aGlzLl92aWV3cykuZmluZCgoeCkgPT4geC5pZCA9PT0gYXJncy5yb3dJZCk7XG4gICAgaWYgKHZpZXdNb2RlbCAmJiAhdmlld01vZGVsLnJlbmRlcmVkKSB7XG4gICAgICB0aGlzLnJlZHJhd1ZpZXdDb21wb25lbnQodmlld01vZGVsKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2tSb3dEZXRhaWxWaWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL2FuZ3VsYXItc2xpY2tncmlkL2V4dGVuc2lvbnMvc2xpY2tSb3dEZXRhaWxWaWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixjQUFjLEVBQ2Qsc0JBQXNCLEVBQ3RCLGNBQWMsR0FDZixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFBRSxrQkFBa0IsSUFBSSwyQkFBMkIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hILE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBS2hELE1BQU0sMkJBQTJCLEdBQUcsWUFBWSxDQUFDO0FBQ2pELE1BQU0sd0JBQXdCLEdBQUcsbUJBQW1CLENBQUM7QUFTckQsTUFBTSxPQUFPLGtCQUFtQixTQUFRLDJCQUEyQjtJQVU1QztJQUNBO0lBQ0E7SUFDQTtJQUNUO0lBYlosa0JBQWtCLENBQW9CO0lBQzVCLGlCQUFpQixDQUEyQjtJQUM1QyxlQUFlLENBQXFCO0lBQ3BDLE1BQU0sR0FBa0IsRUFBRSxDQUFDO0lBQzNCLGNBQWMsQ0FBZ0I7SUFDOUIsY0FBYyxHQUF3QixFQUFFLENBQUM7SUFDekMsY0FBYyxDQUFnRTtJQUV4RixZQUNxQixrQkFBc0MsRUFDdEMsTUFBc0IsRUFDdEIsa0JBQXNDLEVBQ3RDLG9CQUFvQyxFQUM3QyxJQUFpQjtRQUUzQixLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQU5QLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQWdCO1FBQzdDLFNBQUksR0FBSixJQUFJ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SyxDQUFDLENBQUM7UUFDL0QsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFwcGxpY2F0aW9uUmVmLCBDb21wb25lbnRSZWYsIFR5cGUsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHtcbiAgRXZlbnRTdWJzY3JpcHRpb24sXG4gIE9uQmVmb3JlUm93RGV0YWlsVG9nZ2xlQXJncyxcbiAgT25Sb3dCYWNrVG9WaWV3cG9ydFJhbmdlQXJncyxcbiAgUnhKc0ZhY2FkZSxcbiAgU2xpY2tHcmlkLFxufSBmcm9tICdAc2xpY2tncmlkLXVuaXZlcnNhbC9jb21tb24nO1xuaW1wb3J0IHtcbiAgYWRkVG9BcnJheVdoZW5Ob3RFeGlzdHMsXG4gIGNhc3RPYnNlcnZhYmxlVG9Qcm9taXNlLFxuICBjcmVhdGVEb21FbGVtZW50LFxuICBTbGlja0V2ZW50RGF0YSxcbiAgU2xpY2tSb3dTZWxlY3Rpb25Nb2RlbCxcbiAgdW5zdWJzY3JpYmVBbGwsXG59IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEV2ZW50UHViU3ViU2VydmljZSB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL2V2ZW50LXB1Yi1zdWInO1xuaW1wb3J0IHsgU2xpY2tSb3dEZXRhaWxWaWV3IGFzIFVuaXZlcnNhbFNsaWNrUm93RGV0YWlsVmlldyB9IGZyb20gJ0BzbGlja2dyaWQtdW5pdmVyc2FsL3Jvdy1kZXRhaWwtdmlldy1wbHVnaW4nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdHlwZSBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB0eXBlIHsgR3JpZE9wdGlvbiwgUm93RGV0YWlsVmlldyB9IGZyb20gJy4uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgdHlwZSB7IEFuZ3VsYXJVdGlsU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FuZ3VsYXJVdGlsLnNlcnZpY2UnO1xuXG5jb25zdCBST1dfREVUQUlMX0NPTlRBSU5FUl9QUkVGSVggPSAnY29udGFpbmVyXyc7XG5jb25zdCBQUkVMT0FEX0NPTlRBSU5FUl9QUkVGSVggPSAnY29udGFpbmVyX2xvYWRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZWRWaWV3IHtcbiAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgZGF0YUNvbnRleHQ6IGFueTtcbiAgY29tcG9uZW50UmVmPzogQ29tcG9uZW50UmVmPGFueT47XG4gIHJlbmRlcmVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFNsaWNrUm93RGV0YWlsVmlldyBleHRlbmRzIFVuaXZlcnNhbFNsaWNrUm93RGV0YWlsVmlldyB7XG4gIHJvd0RldGFpbENvbnRhaW5lciE6IFZpZXdDb250YWluZXJSZWY7XG4gIHByb3RlY3RlZCBfcHJlbG9hZENvbXBvbmVudDogVHlwZTxvYmplY3Q+IHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgX3ByZWxvYWRDb21wUmVmPzogQ29tcG9uZW50UmVmPGFueT47XG4gIHByb3RlY3RlZCBfdmlld3M6IENyZWF0ZWRWaWV3W10gPSBbXTtcbiAgcHJvdGVjdGVkIF92aWV3Q29tcG9uZW50ITogVHlwZTxvYmplY3Q+O1xuICBwcm90ZWN0ZWQgX3N1YnNjcmlwdGlvbnM6IEV2ZW50U3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJvdGVjdGVkIF91c2VyUHJvY2Vzc0ZuITogKGl0ZW06IGFueSkgPT4gUHJvbWlzZTxhbnk+IHwgT2JzZXJ2YWJsZTxhbnk+IHwgU3ViamVjdDxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBhbmd1bGFyVXRpbFNlcnZpY2U6IEFuZ3VsYXJVdGlsU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRQdWJTdWJTZXJ2aWNlOiBFdmVudFB1YlN1YlNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGdyaWRDb250YWluZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudCxcbiAgICBwcm90ZWN0ZWQgcnhqcz86IFJ4SnNGYWNhZGVcbiAgKSB7XG4gICAgc3VwZXIoZXZlbnRQdWJTdWJTZXJ2aWNlKTtcbiAgfVxuXG4gIGdldCBhZGRvbk9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9ucygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBkYXRhc2V0SWRQcm9wTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmRhdGFzZXRJZFByb3BlcnR5TmFtZSB8fCAnaWQnO1xuICB9XG5cbiAgLyoqIEdldHRlciBmb3IgdGhlIEdyaWQgT3B0aW9ucyBwdWxsZWQgdGhyb3VnaCB0aGUgR3JpZCBPYmplY3QgKi9cbiAgZ2V0IGdyaWRPcHRpb25zKCk6IEdyaWRPcHRpb24ge1xuICAgIHJldHVybiAodGhpcy5fZ3JpZD8uZ2V0T3B0aW9ucygpIHx8IHt9KSBhcyBHcmlkT3B0aW9uO1xuICB9XG5cbiAgZ2V0IHJvd0RldGFpbFZpZXdPcHRpb25zKCk6IFJvd0RldGFpbFZpZXcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLnJvd0RldGFpbFZpZXc7XG4gIH1cblxuICBhZGRSeEpzUmVzb3VyY2UocnhqczogUnhKc0ZhY2FkZSkge1xuICAgIHRoaXMucnhqcyA9IHJ4anM7XG4gIH1cblxuICAvKiogRGlzcG9zZSBvZiB0aGUgUm93RGV0YWlsVmlldyBFeHRlbnNpb24gKi9cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLmRpc3Bvc2VBbGxWaWV3Q29tcG9uZW50cygpO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMgPSB1bnN1YnNjcmliZUFsbCh0aGlzLl9zdWJzY3JpcHRpb25zKTsgLy8gYWxzbyB1bnN1YnNjcmliZSBhbGwgUnhKUyBzdWJzY3JpcHRpb25zXG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqIERpc3Bvc2Ugb2YgYWxsIHRoZSBvcGVuZWQgUm93IERldGFpbCBQYW5lbHMgQW5ndWxhciBWaWV3IENvbXBvbmVudHMgKi9cbiAgZGlzcG9zZUFsbFZpZXdDb21wb25lbnRzKCkge1xuICAgIGRvIHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLl92aWV3cy5wb3AoKTtcbiAgICAgIGlmICh2aWV3KSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVZpZXcodmlldyk7XG4gICAgICB9XG4gICAgfSB3aGlsZSAodGhpcy5fdmlld3MubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBpbnN0YW5jZSBvZiB0aGUgU2xpY2tHcmlkIGFkZG9uIChjb250cm9sIG9yIHBsdWdpbikuICovXG4gIGdldEFkZG9uSW5zdGFuY2UoKTogU2xpY2tSb3dEZXRhaWxWaWV3IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpbml0KGdyaWQ6IFNsaWNrR3JpZCkge1xuICAgIHRoaXMuX2dyaWQgPSBncmlkO1xuICAgIHN1cGVyLmluaXQodGhpcy5fZ3JpZCk7XG4gICAgdGhpcy5yZWdpc3RlcihncmlkPy5nZXRTZWxlY3Rpb25Nb2RlbCgpIGFzIFNsaWNrUm93U2VsZWN0aW9uTW9kZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgcGx1Z2luIGJlZm9yZSB0aGUgR3JpZCBjcmVhdGlvbiwgZWxzZSBpdCB3aWxsIGJlaGF2ZSBvZGRseS5cbiAgICogTW9zdGx5IGJlY2F1c2UgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGdyaWQgY3JlYXRpb25cbiAgICovXG4gIHJlZ2lzdGVyKHJvd1NlbGVjdGlvblBsdWdpbj86IFNsaWNrUm93U2VsZWN0aW9uTW9kZWwpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuZ3JpZE9wdGlvbnMucm93RGV0YWlsVmlldz8ucHJvY2VzcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gd2UgbmVlZCB0byBrZWVwIHRoZSB1c2VyIFwicHJvY2Vzc1wiIG1ldGhvZCBhbmQgcmVwbGFjZSBpdCB3aXRoIG91ciBvd24gZXhlY3V0aW9uIG1ldGhvZFxuICAgICAgLy8gd2UgZG8gdGhpcyBiZWNhdXNlIHdoZW4gd2UgZ2V0IHRoZSBpdGVtIGRldGFpbCwgd2UgbmVlZCB0byBjYWxsIFwib25Bc3luY1Jlc3BvbnNlLm5vdGlmeVwiIGZvciB0aGUgcGx1Z2luIHRvIHdvcmtcbiAgICAgIHRoaXMuX3VzZXJQcm9jZXNzRm4gPSB0aGlzLmdyaWRPcHRpb25zLnJvd0RldGFpbFZpZXcucHJvY2VzcyBhcyAoaXRlbTogYW55KSA9PiBQcm9taXNlPGFueT47IC8vIGtlZXAgdXNlcidzIHByb2Nlc3MgbWV0aG9kXG4gICAgICB0aGlzLmFkZG9uT3B0aW9ucy5wcm9jZXNzID0gKGl0ZW0pID0+IHRoaXMub25Qcm9jZXNzaW5nKGl0ZW0pOyAvLyByZXBsYWNlIHByb2Nlc3MgbWV0aG9kICYgcnVuIG91ciBpbnRlcm5hbCBvbmVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnW0FuZ3VsYXItU2xpY2tncmlkXSBZb3UgbmVlZCB0byBwcm92aWRlIGEgXCJwcm9jZXNzXCIgZnVuY3Rpb24gZm9yIHRoZSBSb3cgRGV0YWlsIEV4dGVuc2lvbiB0byB3b3JrIHByb3Blcmx5J1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ3JpZCAmJiB0aGlzLmdyaWRPcHRpb25zPy5yb3dEZXRhaWxWaWV3KSB7XG4gICAgICAvLyBsb2FkIHRoZSBQcmVsb2FkICYgUm93RGV0YWlsIFRlbXBsYXRlcyAoY291bGQgYmUgc3RyYWlnaHQgSFRNTCBvciBBbmd1bGFyIFZpZXcvVmlld01vZGVsKVxuICAgICAgLy8gd2hlbiB0aG9zZSBhcmUgQW5ndWxhciBWaWV3L1ZpZXdNb2RlbCwgd2UgbmVlZCB0byBjcmVhdGUgVmlldyBDb21wb25lbnQgJiBwcm92aWRlIHRoZSBodG1sIGNvbnRhaW5lcnMgdG8gdGhlIFBsdWdpbiAocHJlVGVtcGxhdGUvcG9zdFRlbXBsYXRlIG1ldGhvZHMpXG4gICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMucm93RGV0YWlsVmlldy5wcmVUZW1wbGF0ZSkge1xuICAgICAgICB0aGlzLl9wcmVsb2FkQ29tcG9uZW50ID0gdGhpcy5ncmlkT3B0aW9ucz8ucm93RGV0YWlsVmlldz8ucHJlbG9hZENvbXBvbmVudDtcbiAgICAgICAgdGhpcy5hZGRvbk9wdGlvbnMucHJlVGVtcGxhdGUgPSAoKSA9PiBjcmVhdGVEb21FbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogYCR7UFJFTE9BRF9DT05UQUlORVJfUFJFRklYfWAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMucm93RGV0YWlsVmlldy5wb3N0VGVtcGxhdGUpIHtcbiAgICAgICAgdGhpcy5fdmlld0NvbXBvbmVudCA9IHRoaXMuZ3JpZE9wdGlvbnM/LnJvd0RldGFpbFZpZXc/LnZpZXdDb21wb25lbnQ7XG4gICAgICAgIHRoaXMuYWRkb25PcHRpb25zLnBvc3RUZW1wbGF0ZSA9IChpdGVtRGV0YWlsOiBhbnkpID0+XG4gICAgICAgICAgY3JlYXRlRG9tRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6IGAke1JPV19ERVRBSUxfQ09OVEFJTkVSX1BSRUZJWH0ke2l0ZW1EZXRhaWxbdGhpcy5kYXRhc2V0SWRQcm9wTmFtZV19YCB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gdGhpcyBhbHNvIHJlcXVpcmVzIHRoZSBSb3cgU2VsZWN0aW9uIE1vZGVsIHRvIGJlIHJlZ2lzdGVyZWQgYXMgd2VsbFxuICAgICAgaWYgKCFyb3dTZWxlY3Rpb25QbHVnaW4gfHwgIXRoaXMuX2dyaWQuZ2V0U2VsZWN0aW9uTW9kZWwoKSkge1xuICAgICAgICByb3dTZWxlY3Rpb25QbHVnaW4gPSBuZXcgU2xpY2tSb3dTZWxlY3Rpb25Nb2RlbCh0aGlzLmdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbk9wdGlvbnMgfHwgeyBzZWxlY3RBY3RpdmVSb3c6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuX2dyaWQuc2V0U2VsZWN0aW9uTW9kZWwocm93U2VsZWN0aW9uUGx1Z2luKTtcbiAgICAgIH1cblxuICAgICAgLy8gaG9vayBhbGwgZXZlbnRzXG4gICAgICBpZiAodGhpcy5fZ3JpZCAmJiB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uRXh0ZW5zaW9uUmVnaXN0ZXJlZCkge1xuICAgICAgICAgIHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMub25FeHRlbnNpb25SZWdpc3RlcmVkKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuc3Vic2NyaWJlKHRoaXMub25Bc3luY1Jlc3BvbnNlLCAoZXZlbnQsIGFyZ3MpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkFzeW5jUmVzcG9uc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMub25Bc3luY1Jlc3BvbnNlKGV2ZW50LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLm9uQXN5bmNFbmRVcGRhdGUsIChlLCBhcmdzKSA9PiB7XG4gICAgICAgICAgLy8gZGVzdHJveSBwcmVsb2FkIGlmIGV4aXN0c1xuICAgICAgICAgIHRoaXMuX3ByZWxvYWRDb21wUmVmPy5kZXN0cm95KCk7XG5cbiAgICAgICAgICAvLyB0cmlnZ2VycyBhZnRlciBiYWNrZW5kIGNhbGxlZCBcIm9uQXN5bmNSZXNwb25zZS5ub3RpZnkoKVwiXG4gICAgICAgICAgdGhpcy5yZW5kZXJWaWV3TW9kZWwoYXJncz8uaXRlbSk7XG5cbiAgICAgICAgICBpZiAodGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucyAmJiB0eXBlb2YgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkFzeW5jRW5kVXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uQXN5bmNFbmRVcGRhdGUoZSwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5zdWJzY3JpYmUoXG4gICAgICAgICAgdGhpcy5vbkFmdGVyUm93RGV0YWlsVG9nZ2xlLFxuICAgICAgICAgIChlOiBhbnksIGFyZ3M6IHsgZ3JpZDogU2xpY2tHcmlkOyBpdGVtOiBhbnk7IGV4cGFuZGVkUm93czogQXJyYXk8bnVtYmVyIHwgc3RyaW5nPiB9KSA9PiB7XG4gICAgICAgICAgICAvLyBkaXNwbGF5IHByZWxvYWQgdGVtcGxhdGUgJiByZS1yZW5kZXIgYWxsIHRoZSBvdGhlciBEZXRhaWwgVmlld3MgYWZ0ZXIgdG9nZ2xpbmdcbiAgICAgICAgICAgIC8vIHRoZSBwcmVsb2FkIFZpZXcgd2lsbCBldmVudHVhbGx5IGdvIGF3YXkgb25jZSB0aGUgZGF0YSBnZXRzIGxvYWRlZCBhZnRlciB0aGUgXCJvbkFzeW5jRW5kVXBkYXRlXCIgZXZlbnRcbiAgICAgICAgICAgIHRoaXMucmVuZGVyUHJlbG9hZFZpZXcoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMgJiYgdHlwZW9mIHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMub25BZnRlclJvd0RldGFpbFRvZ2dsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uQWZ0ZXJSb3dEZXRhaWxUb2dnbGUoZSwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLm9uQmVmb3JlUm93RGV0YWlsVG9nZ2xlLCAoZSwgYXJncykgPT4ge1xuICAgICAgICAgIC8vIGJlZm9yZSB0b2dnbGluZyByb3cgZGV0YWlsLCB3ZSBuZWVkIHRvIGNyZWF0ZSBWaWV3IENvbXBvbmVudCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgdGhpcy5oYW5kbGVPbkJlZm9yZVJvd0RldGFpbFRvZ2dsZShlLCBhcmdzKTtcblxuICAgICAgICAgIGlmICh0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zICYmIHR5cGVvZiB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uQmVmb3JlUm93RGV0YWlsVG9nZ2xlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vbkJlZm9yZVJvd0RldGFpbFRvZ2dsZShlLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLm9uUm93QmFja1RvVmlld3BvcnRSYW5nZSwgKGUsIGFyZ3MpID0+IHtcbiAgICAgICAgICAvLyB3aGVuIHJvdyBpcyBiYWNrIHRvIHZpZXdwb3J0IHJhbmdlLCB3ZSB3aWxsIHJlLXJlbmRlciB0aGUgVmlldyBDb21wb25lbnQocylcbiAgICAgICAgICB0aGlzLmhhbmRsZU9uUm93QmFja1RvVmlld3BvcnRSYW5nZShlLCBhcmdzKTtcblxuICAgICAgICAgIGlmICh0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zICYmIHR5cGVvZiB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uUm93QmFja1RvVmlld3BvcnRSYW5nZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucy5vblJvd0JhY2tUb1ZpZXdwb3J0UmFuZ2UoZSwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXIuc3Vic2NyaWJlKHRoaXMub25CZWZvcmVSb3dPdXRPZlZpZXdwb3J0UmFuZ2UsIChldmVudCwgYXJncykgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5yb3dEZXRhaWxWaWV3T3B0aW9ucz8ub25CZWZvcmVSb3dPdXRPZlZpZXdwb3J0UmFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucm93RGV0YWlsVmlld09wdGlvbnMub25CZWZvcmVSb3dPdXRPZlZpZXdwb3J0UmFuZ2UoZXZlbnQsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRpc3Bvc2VWaWV3QnlJdGVtKGFyZ3MuaXRlbSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLm9uUm93T3V0T2ZWaWV3cG9ydFJhbmdlLCAoZSwgYXJncykgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zICYmIHR5cGVvZiB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uUm93T3V0T2ZWaWV3cG9ydFJhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zLm9uUm93T3V0T2ZWaWV3cG9ydFJhbmdlKGUsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLS1cbiAgICAgICAgLy8gaG9vayBzb21lIGV2ZW50cyBuZWVkZWQgYnkgdGhlIFBsdWdpbiBpdHNlbGZcblxuICAgICAgICAvLyB3ZSBuZWVkIHRvIHJlZHJhdyB0aGUgb3BlbiBkZXRhaWwgdmlld3MgaWYgd2UgY2hhbmdlIGNvbHVtbiBwb3NpdGlvbiAoY29sdW1uIHJlb3JkZXIpXG4gICAgICAgIHRoaXMuZXZlbnRIYW5kbGVyLnN1YnNjcmliZSh0aGlzLl9ncmlkLm9uQ29sdW1uc1Jlb3JkZXJlZCwgdGhpcy5yZWRyYXdBbGxWaWV3Q29tcG9uZW50cy5iaW5kKHRoaXMsIGZhbHNlKSk7XG5cbiAgICAgICAgLy8gb24gcm93IHNlbGVjdGlvbiBjaGFuZ2VkLCB3ZSBhbHNvIG5lZWQgdG8gcmVkcmF3XG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmVuYWJsZVJvd1NlbGVjdGlvbiB8fCB0aGlzLmdyaWRPcHRpb25zLmVuYWJsZUNoZWNrYm94U2VsZWN0b3IpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50SGFuZGxlci5zdWJzY3JpYmUodGhpcy5fZ3JpZC5vblNlbGVjdGVkUm93c0NoYW5nZWQsIHRoaXMucmVkcmF3QWxsVmlld0NvbXBvbmVudHMuYmluZCh0aGlzLCBmYWxzZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gb24gc29ydCwgYWxsIHJvdyBkZXRhaWwgYXJlIGNvbGxhcHNlZCBzbyB3ZSBjYW4gZGlzcG9zZSBvZiBhbGwgdGhlIFZpZXdzIGFzIHdlbGxcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXIuc3Vic2NyaWJlKHRoaXMuX2dyaWQub25Tb3J0LCB0aGlzLmRpc3Bvc2VBbGxWaWV3Q29tcG9uZW50cy5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyByZWRyYXcgYWxsIFZpZXdzIHdoZW5ldmVyIGNlcnRhaW4gZXZlbnRzIGFyZSB0cmlnZ2VyZWRcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgIHRoaXMuZXZlbnRQdWJTdWJTZXJ2aWNlPy5zdWJzY3JpYmUoXG4gICAgICAgICAgICBbJ29uRmlsdGVyQ2hhbmdlZCcsICdvbkdyaWRNZW51Q29sdW1uc0NoYW5nZWQnLCAnb25Db2x1bW5QaWNrZXJDb2x1bW5zQ2hhbmdlZCddLFxuICAgICAgICAgICAgdGhpcy5yZWRyYXdBbGxWaWV3Q29tcG9uZW50cy5iaW5kKHRoaXMsIGZhbHNlKVxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy5ldmVudFB1YlN1YlNlcnZpY2U/LnN1YnNjcmliZShbJ29uR3JpZE1lbnVDbGVhckFsbEZpbHRlcnMnLCAnb25HcmlkTWVudUNsZWFyQWxsU29ydGluZyddLCAoKSA9PlxuICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWRyYXdBbGxWaWV3Q29tcG9uZW50cygpKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogUmVkcmF3IChyZS1yZW5kZXIpIGFsbCB0aGUgZXhwYW5kZWQgcm93IGRldGFpbCBWaWV3IENvbXBvbmVudHMgKi9cbiAgcmVkcmF3QWxsVmlld0NvbXBvbmVudHMoZm9yY2VSZWRyYXcgPSBmYWxzZSkge1xuICAgIHRoaXMucmVzZXRSZW5kZXJlZFJvd3MoKTtcbiAgICB0aGlzLl92aWV3cy5mb3JFYWNoKCh2aWV3KSA9PiB7XG4gICAgICBpZiAoIXZpZXcucmVuZGVyZWQgfHwgZm9yY2VSZWRyYXcpIHtcbiAgICAgICAgZm9yY2VSZWRyYXcgJiYgdmlldy5jb21wb25lbnRSZWY/LmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5yZWRyYXdWaWV3Q29tcG9uZW50KHZpZXcpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlZHJhdyB0aGUgbmVjZXNzYXJ5IFZpZXcgQ29tcG9uZW50ICovXG4gIHJlZHJhd1ZpZXdDb21wb25lbnQoY3JlYXRlZFZpZXc6IENyZWF0ZWRWaWV3KSB7XG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihgLiR7Uk9XX0RFVEFJTF9DT05UQUlORVJfUFJFRklYfSR7Y3JlYXRlZFZpZXcuaWR9YCk7XG4gICAgaWYgKGNvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyVmlld01vZGVsKGNyZWF0ZWRWaWV3LmRhdGFDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVuZGVyIChvciByZS1yZW5kZXIpIHRoZSBWaWV3IENvbXBvbmVudCAoUm93IERldGFpbCkgKi9cbiAgcmVuZGVyUHJlbG9hZFZpZXcoKSB7XG4gICAgY29uc3QgY29udGFpbmVyRWxlbWVudCA9IHRoaXMuZ3JpZENvbnRhaW5lckVsZW1lbnQucXVlcnlTZWxlY3RvcihgLiR7UFJFTE9BRF9DT05UQUlORVJfUFJFRklYfWApO1xuICAgIGlmICh0aGlzLl9wcmVsb2FkQ29tcG9uZW50ICYmIGNvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHByZWxvYWRDb21wID0gdGhpcy5hbmd1bGFyVXRpbFNlcnZpY2UuY3JlYXRlQW5ndWxhckNvbXBvbmVudEFwcGVuZFRvRG9tKFxuICAgICAgICB0aGlzLl9wcmVsb2FkQ29tcG9uZW50LFxuICAgICAgICBjb250YWluZXJFbGVtZW50LFxuICAgICAgICB7fSxcbiAgICAgICAgeyBzYW5pdGl6ZXI6IHRoaXMuX2dyaWQuc2FuaXRpemVIdG1sU3RyaW5nIH1cbiAgICAgICk7XG4gICAgICB0aGlzLl9wcmVsb2FkQ29tcFJlZiA9IHByZWxvYWRDb21wLmNvbXBvbmVudFJlZjtcbiAgICB9XG4gIH1cblxuICAvKiogUmVuZGVyIChvciByZS1yZW5kZXIpIHRoZSBWaWV3IENvbXBvbmVudCAoUm93IERldGFpbCkgKi9cbiAgcmVuZGVyVmlld01vZGVsKGl0ZW06IGFueSk6IENyZWF0ZWRWaWV3IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBjb250YWluZXJFbGVtZW50ID0gdGhpcy5ncmlkQ29udGFpbmVyRWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgYC4ke1JPV19ERVRBSUxfQ09OVEFJTkVSX1BSRUZJWH0ke2l0ZW1bdGhpcy5kYXRhc2V0SWRQcm9wTmFtZV19YFxuICAgICk7XG4gICAgaWYgKHRoaXMuX3ZpZXdDb21wb25lbnQgJiYgY29udGFpbmVyRWxlbWVudCkge1xuICAgICAgLy8gcmVuZGVyIHJvdyBkZXRhaWxcbiAgICAgIGNvbnN0IGNvbXBvbmVudE91dHB1dCA9IHRoaXMuYW5ndWxhclV0aWxTZXJ2aWNlLmNyZWF0ZUFuZ3VsYXJDb21wb25lbnRBcHBlbmRUb0RvbShcbiAgICAgICAgdGhpcy5fdmlld0NvbXBvbmVudCxcbiAgICAgICAgY29udGFpbmVyRWxlbWVudCxcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiBpdGVtLFxuICAgICAgICAgIGFkZG9uOiB0aGlzLFxuICAgICAgICAgIGdyaWQ6IHRoaXMuX2dyaWQsXG4gICAgICAgICAgZGF0YVZpZXc6IHRoaXMuZGF0YVZpZXcsXG4gICAgICAgICAgcGFyZW50OiB0aGlzLnJvd0RldGFpbFZpZXdPcHRpb25zPy5wYXJlbnQsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBzYW5pdGl6ZXI6IHRoaXMuX2dyaWQuc2FuaXRpemVIdG1sU3RyaW5nLFxuICAgICAgICB9XG4gICAgICApO1xuXG4gICAgICBpZiAoY29tcG9uZW50T3V0cHV0Py5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgY29uc3Qgdmlld09iaiA9IHRoaXMuX3ZpZXdzLmZpbmQoKG9iaikgPT4gb2JqLmlkID09PSBpdGVtW3RoaXMuZGF0YXNldElkUHJvcE5hbWVdKTtcbiAgICAgICAgaWYgKHZpZXdPYmopIHtcbiAgICAgICAgICB2aWV3T2JqLmNvbXBvbmVudFJlZiA9IGNvbXBvbmVudE91dHB1dC5jb21wb25lbnRSZWY7XG4gICAgICAgICAgdmlld09iai5yZW5kZXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZpZXdPYmo7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyAtLVxuICAvLyBwcm90ZWN0ZWQgZnVuY3Rpb25zXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3RlY3RlZCBkaXNwb3NlVmlld0J5SXRlbShpdGVtOiBhbnksIHJlbW92ZUZyb21BcnJheSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgZm91bmRWaWV3SW5kZXggPSB0aGlzLl92aWV3cy5maW5kSW5kZXgoKHZpZXc6IENyZWF0ZWRWaWV3KSA9PiB2aWV3LmlkID09PSBpdGVtW3RoaXMuZGF0YXNldElkUHJvcE5hbWVdKTtcbiAgICBpZiAoZm91bmRWaWV3SW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5kaXNwb3NlVmlldyh0aGlzLl92aWV3c1tmb3VuZFZpZXdJbmRleF0pO1xuICAgICAgaWYgKHJlbW92ZUZyb21BcnJheSkge1xuICAgICAgICB0aGlzLl92aWV3cy5zcGxpY2UoZm91bmRWaWV3SW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNwb3NlVmlldyhleHBhbmRlZFZpZXc6IENyZWF0ZWRWaWV3KTogQ3JlYXRlZFZpZXcgfCB2b2lkIHtcbiAgICBleHBhbmRlZFZpZXcucmVuZGVyZWQgPSBmYWxzZTtcbiAgICBjb25zdCBjb21wUmVmID0gZXhwYW5kZWRWaWV3Py5jb21wb25lbnRSZWY7XG4gICAgaWYgKGNvbXBSZWYpIHtcbiAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcoY29tcFJlZi5ob3N0Vmlldyk7XG4gICAgICBpZiAodHlwZW9mIGNvbXBSZWY/LmRlc3Ryb3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29tcFJlZi5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXhwYW5kZWRWaWV3O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBub3RpZnkgdGhlIG9uQXN5bmNSZXNwb25zZSB3aXRoIHRoZSBcImFyZ3MuaXRlbVwiIChyZXF1aXJlZCBwcm9wZXJ0eSlcbiAgICogdGhlIHBsdWdpbiB3aWxsIHRoZW4gdXNlIGl0ZW0gdG8gcG9wdWxhdGUgdGhlIHJvdyBkZXRhaWwgcGFuZWwgd2l0aCB0aGUgXCJwb3N0VGVtcGxhdGVcIlxuICAgKiBAcGFyYW0gaXRlbVxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeVRlbXBsYXRlKGl0ZW06IGFueSkge1xuICAgIHRoaXMub25Bc3luY1Jlc3BvbnNlLm5vdGlmeSh7IGl0ZW0sIGl0ZW1EZXRhaWw6IGl0ZW0gfSwgbmV3IFNsaWNrRXZlbnREYXRhKCksIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9uIFByb2Nlc3NpbmcsIHdlIHdpbGwgbm90aWZ5IHRoZSBwbHVnaW4gd2l0aCB0aGUgbmV3IGl0ZW0gZGV0YWlsIG9uY2UgYmFja2VuZCBzZXJ2ZXIgY2FsbCBjb21wbGV0ZXNcbiAgICogQHBhcmFtIGl0ZW1cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvblByb2Nlc3NpbmcoaXRlbTogYW55KSB7XG4gICAgaWYgKGl0ZW0gJiYgdHlwZW9mIHRoaXMuX3VzZXJQcm9jZXNzRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxldCBhd2FpdGVkSXRlbURldGFpbDogYW55O1xuICAgICAgY29uc3QgdXNlclByb2Nlc3NGbiA9IHRoaXMuX3VzZXJQcm9jZXNzRm4oaXRlbSk7XG5cbiAgICAgIC8vIHdhaXQgZm9yIHRoZSBcInVzZXJQcm9jZXNzRm5cIiwgb25jZSByZXNvbHZlZCB3ZSB3aWxsIHNhdmUgaXQgaW50byB0aGUgXCJjb2xsZWN0aW9uXCJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgfCBhbnlbXSA9IGF3YWl0IHVzZXJQcm9jZXNzRm47XG5cbiAgICAgIGlmICh0aGlzLmRhdGFzZXRJZFByb3BOYW1lIGluIHJlc3BvbnNlKSB7XG4gICAgICAgIGF3YWl0ZWRJdGVtRGV0YWlsID0gcmVzcG9uc2U7IC8vIGZyb20gUHJvbWlzZVxuICAgICAgfSBlbHNlIGlmICgocmVzcG9uc2UgJiYgcmVzcG9uc2UgaW5zdGFuY2VvZiBPYnNlcnZhYmxlKSB8fCByZXNwb25zZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgYXdhaXRlZEl0ZW1EZXRhaWwgPSBhd2FpdCBjYXN0T2JzZXJ2YWJsZVRvUHJvbWlzZSh0aGlzLnJ4anMgYXMgUnhKc0ZhY2FkZSwgcmVzcG9uc2UpOyAvLyBmcm9tIEFuZ3VsYXItaHR0cC1jbGllbnRcbiAgICAgIH1cblxuICAgICAgaWYgKCFhd2FpdGVkSXRlbURldGFpbCB8fCAhKHRoaXMuZGF0YXNldElkUHJvcE5hbWUgaW4gYXdhaXRlZEl0ZW1EZXRhaWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnW0FuZ3VsYXItU2xpY2tncmlkXSBjb3VsZCBub3QgcHJvY2VzcyB0aGUgUm93IERldGFpbCwgeW91IG11c3QgbWFrZSBzdXJlIHRoYXQgeW91ciBcInByb2Nlc3NcIiBjYWxsYmFjayAnICtcbiAgICAgICAgICAgIGByZXR1cm5zIGFuIGl0ZW0gb2JqZWN0IHRoYXQgaGFzIGFuIFwiJHt0aGlzLmRhdGFzZXRJZFByb3BOYW1lfVwiIHByb3BlcnR5YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBub3RpZnkgdGhlIHBsdWdpbiB3aXRoIHRoZSBuZXcgaXRlbSBkZXRhaWxzXG4gICAgICB0aGlzLm5vdGlmeVRlbXBsYXRlKGF3YWl0ZWRJdGVtRGV0YWlsIHx8IHt9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSnVzdCBiZWZvcmUgdGhlIHJvdyBnZXQgZXhwYW5kZWQgb3IgY29sbGFwc2VkIHdlIHdpbGwgZG8gdGhlIGZvbGxvd2luZ1xuICAgKiBGaXJzdCBkZXRlcm1pbmUgaWYgdGhlIHJvdyBpcyBleHBhbmRpbmcgb3IgY29sbGFwc2luZyxcbiAgICogaWYgaXQncyBleHBhbmRpbmcgd2Ugd2lsbCBhZGQgaXQgdG8gb3VyIFZpZXcgQ29tcG9uZW50cyByZWZlcmVuY2UgYXJyYXkgaWYgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIGl0XG4gICAqIG9yIGlmIGl0J3MgY29sbGFwc2luZyB3ZSB3aWxsIHJlbW92ZSBpdCBmcm9tIG91ciBWaWV3IENvbXBvbmVudHMgcmVmZXJlbmNlIGFycmF5XG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlT25CZWZvcmVSb3dEZXRhaWxUb2dnbGUoX2U6IFNsaWNrRXZlbnREYXRhPE9uQmVmb3JlUm93RGV0YWlsVG9nZ2xlQXJncz4sIGFyZ3M6IHsgZ3JpZDogU2xpY2tHcmlkOyBpdGVtOiBhbnkgfSkge1xuICAgIC8vIGV4cGFuZGluZ1xuICAgIGlmIChhcmdzPy5pdGVtPy5fX2NvbGxhcHNlZCkge1xuICAgICAgLy8gZXhwYW5kaW5nIHJvdyBkZXRhaWxcbiAgICAgIGNvbnN0IHZpZXdJbmZvOiBDcmVhdGVkVmlldyA9IHtcbiAgICAgICAgaWQ6IGFyZ3MuaXRlbVt0aGlzLmRhdGFzZXRJZFByb3BOYW1lXSxcbiAgICAgICAgZGF0YUNvbnRleHQ6IGFyZ3MuaXRlbSxcbiAgICAgICAgcmVuZGVyZWQ6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGFkZFRvQXJyYXlXaGVuTm90RXhpc3RzKHRoaXMuX3ZpZXdzLCB2aWV3SW5mbywgdGhpcy5kYXRhc2V0SWRQcm9wTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbGxhcHNpbmcsIHNvIGRpc3Bvc2Ugb2YgdGhlIFZpZXcvQ29tcG9uZW50XG4gICAgICB0aGlzLmRpc3Bvc2VWaWV3QnlJdGVtKGFyZ3MuaXRlbSwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFdoZW4gUm93IGNvbWVzIGJhY2sgdG8gVmlld3BvcnQgUmFuZ2UsIHdlIG5lZWQgdG8gcmVkcmF3IHRoZSBWaWV3ICovXG4gIHByb3RlY3RlZCBoYW5kbGVPblJvd0JhY2tUb1ZpZXdwb3J0UmFuZ2UoX2U6IFNsaWNrRXZlbnREYXRhPE9uUm93QmFja1RvVmlld3BvcnRSYW5nZUFyZ3M+LCBhcmdzOiBPblJvd0JhY2tUb1ZpZXdwb3J0UmFuZ2VBcmdzKSB7XG4gICAgY29uc3Qgdmlld01vZGVsID0gdGhpcy5fdmlld3MuZmluZCgoeCkgPT4geC5pZCA9PT0gYXJncy5yb3dJZCk7XG4gICAgaWYgKHZpZXdNb2RlbCAmJiAhdmlld01vZGVsLnJlbmRlcmVkKSB7XG4gICAgICB0aGlzLnJlZHJhd1ZpZXdDb21wb25lbnQodmlld01vZGVsKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|