@schneideress/dashboardframework 0.0.77 → 0.0.78
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 +24 -24
- package/bundles/schneideress-dashboardframework.umd.js +7128 -6078
- package/bundles/schneideress-dashboardframework.umd.js.map +1 -1
- package/bundles/schneideress-dashboardframework.umd.min.js +15 -1
- package/bundles/schneideress-dashboardframework.umd.min.js.map +1 -1
- package/esm2015/gridster/index.js +18 -18
- package/esm2015/gridster/lib/gridster.component.js +700 -700
- package/esm2015/gridster/lib/gridster.interface.js +84 -84
- package/esm2015/gridster/lib/gridster.module.js +27 -27
- package/esm2015/gridster/lib/gridsterCompact.service.js +223 -223
- package/esm2015/gridster/lib/gridsterConfig.constant.js +179 -179
- package/esm2015/gridster/lib/gridsterConfig.interface.js +219 -219
- package/esm2015/gridster/lib/gridsterConfigS.interface.js +161 -161
- package/esm2015/gridster/lib/gridsterDraggable.service.js +510 -510
- package/esm2015/gridster/lib/gridsterEmptyCell.service.js +317 -317
- package/esm2015/gridster/lib/gridsterItem.component.js +213 -213
- package/esm2015/gridster/lib/gridsterItem.interface.js +46 -46
- package/esm2015/gridster/lib/gridsterItemComponent.interface.js +48 -48
- package/esm2015/gridster/lib/gridsterPreview.component.js +66 -66
- package/esm2015/gridster/lib/gridsterPush.service.js +467 -467
- package/esm2015/gridster/lib/gridsterPushResize.service.js +358 -358
- package/esm2015/gridster/lib/gridsterRenderer.service.js +277 -277
- package/esm2015/gridster/lib/gridsterResizable.service.js +552 -552
- package/esm2015/gridster/lib/gridsterResizeEventType.interface.js +19 -19
- package/esm2015/gridster/lib/gridsterScroll.service.js +195 -195
- package/esm2015/gridster/lib/gridsterSwap.service.js +134 -134
- package/esm2015/gridster/lib/gridsterUtils.service.js +137 -137
- package/esm2015/lib/custom.notifier.options.js +46 -46
- package/esm2015/lib/ra-dashboard-area/ra.dashboard.area.js +496 -496
- package/esm2015/lib/ra-widget-container/ra.widget.container.component.js +471 -471
- package/esm2015/lib/ra.base.dashboard.filter.js +75 -75
- package/esm2015/lib/ra.base.dashboard.template.js +71 -71
- package/esm2015/lib/ra.dashbard.event.bus.js +85 -85
- package/esm2015/lib/ra.dashboard.module.js +51 -51
- package/esm2015/lib/ra.dashboard.service.js +144 -144
- package/esm2015/lib/ra.event.enum.js +51 -51
- package/esm2015/lib/ra.gridster.config.js +67 -67
- package/esm2015/public-api.js +16 -16
- package/esm2015/schneideress-dashboardframework.js +13 -13
- package/esm5/gridster/index.js +18 -18
- package/esm5/gridster/lib/gridster.component.js +803 -803
- package/esm5/gridster/lib/gridster.interface.js +94 -94
- package/esm5/gridster/lib/gridster.module.js +31 -31
- package/esm5/gridster/lib/gridsterCompact.service.js +253 -253
- package/esm5/gridster/lib/gridsterConfig.constant.js +179 -179
- package/esm5/gridster/lib/gridsterConfig.interface.js +219 -219
- package/esm5/gridster/lib/gridsterConfigS.interface.js +161 -161
- package/esm5/gridster/lib/gridsterDraggable.service.js +549 -549
- package/esm5/gridster/lib/gridsterEmptyCell.service.js +358 -358
- package/esm5/gridster/lib/gridsterItem.component.js +238 -238
- package/esm5/gridster/lib/gridsterItem.interface.js +46 -46
- package/esm5/gridster/lib/gridsterItemComponent.interface.js +58 -58
- package/esm5/gridster/lib/gridsterPreview.component.js +70 -70
- package/esm5/gridster/lib/gridsterPush.service.js +547 -547
- package/esm5/gridster/lib/gridsterPushResize.service.js +423 -423
- package/esm5/gridster/lib/gridsterRenderer.service.js +323 -323
- package/esm5/gridster/lib/gridsterResizable.service.js +629 -629
- package/esm5/gridster/lib/gridsterResizeEventType.interface.js +19 -19
- package/esm5/gridster/lib/gridsterScroll.service.js +195 -195
- package/esm5/gridster/lib/gridsterSwap.service.js +152 -152
- package/esm5/gridster/lib/gridsterUtils.service.js +177 -177
- package/esm5/lib/custom.notifier.options.js +46 -46
- package/esm5/lib/ra-dashboard-area/ra.dashboard.area.js +588 -588
- package/esm5/lib/ra-widget-container/ra.widget.container.component.js +584 -584
- package/esm5/lib/ra.base.dashboard.filter.js +81 -81
- package/esm5/lib/ra.base.dashboard.template.js +74 -74
- package/esm5/lib/ra.dashbard.event.bus.js +125 -125
- package/esm5/lib/ra.dashboard.module.js +55 -55
- package/esm5/lib/ra.dashboard.service.js +221 -221
- package/esm5/lib/ra.event.enum.js +51 -51
- package/esm5/lib/ra.gridster.config.js +67 -67
- package/esm5/public-api.js +16 -16
- package/esm5/schneideress-dashboardframework.js +13 -13
- package/fesm2015/schneideress-dashboardframework.js +6121 -5181
- package/fesm2015/schneideress-dashboardframework.js.map +1 -1
- package/fesm5/schneideress-dashboardframework.js +7019 -6079
- package/fesm5/schneideress-dashboardframework.js.map +1 -1
- package/gridster/index.d.ts +11 -11
- package/gridster/lib/gridster.component.d.ts +67 -67
- package/gridster/lib/gridster.interface.d.ts +46 -46
- package/gridster/lib/gridster.module.d.ts +2 -2
- package/gridster/lib/gridsterCompact.service.d.ts +15 -15
- package/gridster/lib/gridsterConfig.constant.d.ts +2 -2
- package/gridster/lib/gridsterConfig.interface.d.ts +133 -133
- package/gridster/lib/gridsterConfigS.interface.d.ts +93 -93
- package/gridster/lib/gridsterDraggable.service.d.ts +59 -59
- package/gridster/lib/gridsterEmptyCell.service.d.ts +29 -29
- package/gridster/lib/gridsterItem.component.d.ts +32 -32
- package/gridster/lib/gridsterItem.interface.d.ts +21 -21
- package/gridster/lib/gridsterItemComponent.interface.d.ts +25 -25
- package/gridster/lib/gridsterPreview.component.d.ts +10 -10
- package/gridster/lib/gridsterPush.service.d.ts +33 -33
- package/gridster/lib/gridsterPushResize.service.d.ts +26 -26
- package/gridster/lib/gridsterRenderer.service.d.ts +38 -38
- package/gridster/lib/gridsterResizable.service.d.ts +67 -67
- package/gridster/lib/gridsterResizeEventType.interface.d.ts +6 -6
- package/gridster/lib/gridsterScroll.service.d.ts +4 -4
- package/gridster/lib/gridsterSwap.service.d.ts +13 -13
- package/gridster/lib/gridsterUtils.service.d.ts +16 -16
- package/lib/custom.notifier.options.d.ts +2 -2
- package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +64 -64
- package/lib/ra-widget-container/ra.widget.container.component.d.ts +64 -64
- package/lib/ra.base.dashboard.filter.d.ts +10 -10
- package/lib/ra.base.dashboard.template.d.ts +15 -15
- package/lib/ra.dashbard.event.bus.d.ts +20 -20
- package/lib/ra.dashboard.module.d.ts +2 -2
- package/lib/ra.dashboard.service.d.ts +22 -22
- package/lib/ra.event.enum.d.ts +42 -42
- package/lib/ra.gridster.config.d.ts +2 -2
- package/package.json +1 -1
- package/public-api.d.ts +8 -8
- package/schneideress-dashboardframework.d.ts +9 -9
- package/schneideress-dashboardframework.metadata.json +1 -1
|
@@ -1,584 +1,584 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
-
*/
|
|
5
|
-
import * as tslib_1 from "tslib";
|
|
6
|
-
import { Component, Input, ViewChild, ElementRef, EventEmitter, Output, NgZone, Renderer2 } from '@angular/core';
|
|
7
|
-
import { RaDashboardService } from './../ra.dashboard.service';
|
|
8
|
-
import { RADashboardEventBus } from '../ra.dashbard.event.bus';
|
|
9
|
-
import { RAEvent, RAEventKey } from '../ra.event.enum';
|
|
10
|
-
import { RADownloadType, RADownloadOption } from '@schneideress/widgetframework';
|
|
11
|
-
import { NgxUiLoaderService } from 'ngx-ui-loader';
|
|
12
|
-
import { NotifierService } from 'angular-notifier';
|
|
13
|
-
import { RATranslateService } from '@schneideress/ra-common';
|
|
14
|
-
var RAWidgetContainer = /** @class */ (function () {
|
|
15
|
-
function RAWidgetContainer(dashboardService, ngxService, translateService, ngZone, notifier, renderer) {
|
|
16
|
-
var _this = this;
|
|
17
|
-
this.dashboardService = dashboardService;
|
|
18
|
-
this.ngxService = ngxService;
|
|
19
|
-
this.translateService = translateService;
|
|
20
|
-
this.ngZone = ngZone;
|
|
21
|
-
this.notifier = notifier;
|
|
22
|
-
this.renderer = renderer;
|
|
23
|
-
this.showPanel = false;
|
|
24
|
-
this.isWidgetLoaded = false;
|
|
25
|
-
this.isIEOrEdge = /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
|
|
26
|
-
this.lockClass = "unlocked";
|
|
27
|
-
this.lockStatus = "unlock";
|
|
28
|
-
this.isDownloadIconVisible = false;
|
|
29
|
-
this.dropDownShown = false;
|
|
30
|
-
this.isDownloadChartVisible = false;
|
|
31
|
-
this.widgetDeleted = new EventEmitter();
|
|
32
|
-
this.renderer.listen('window', 'click', (/**
|
|
33
|
-
* @param {?} e
|
|
34
|
-
* @return {?}
|
|
35
|
-
*/
|
|
36
|
-
function (e) {
|
|
37
|
-
if (e.target !== _this.widgetDropdown.nativeElement) {
|
|
38
|
-
_this.dropDownShown = false;
|
|
39
|
-
}
|
|
40
|
-
}));
|
|
41
|
-
this.renderer.listen('window', 'click', (/**
|
|
42
|
-
* @param {?} e
|
|
43
|
-
* @return {?}
|
|
44
|
-
*/
|
|
45
|
-
function (e) {
|
|
46
|
-
if (_this.widgetDownload && e.target !== _this.widgetDownload.nativeElement) {
|
|
47
|
-
_this.isDownloadChartVisible = false;
|
|
48
|
-
}
|
|
49
|
-
}));
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* @param {?} changes
|
|
53
|
-
* @return {?}
|
|
54
|
-
*/
|
|
55
|
-
RAWidgetContainer.prototype.ngOnChanges = /**
|
|
56
|
-
* @param {?} changes
|
|
57
|
-
* @return {?}
|
|
58
|
-
*/
|
|
59
|
-
function (changes) {
|
|
60
|
-
var _this = this;
|
|
61
|
-
if (changes.raDashboardEventBus && changes.raDashboardEventBus.currentValue != changes.raDashboardEventBus.previousValue) {
|
|
62
|
-
this.configChanged = this.raDashboardEventBus.subscribeWithKey(RAEvent.ConfigChanged, RAEventKey.WidgetInstanceId, this.data.widgetInfo.widgetInstanceId.toString()).subscribe((/**
|
|
63
|
-
* @param {?} e
|
|
64
|
-
* @return {?}
|
|
65
|
-
*/
|
|
66
|
-
function (e) {
|
|
67
|
-
_this.ngZone.run((/**
|
|
68
|
-
* @return {?}
|
|
69
|
-
*/
|
|
70
|
-
function () {
|
|
71
|
-
_this.configChangeEventHandler(e);
|
|
72
|
-
}));
|
|
73
|
-
}));
|
|
74
|
-
}
|
|
75
|
-
if (this.widgetElement && changes.globalFilter && changes.globalFilter.currentValue != changes.globalFilter.previousValue) {
|
|
76
|
-
this.refreshWidget(this.data.widgetInfo);
|
|
77
|
-
}
|
|
78
|
-
if (changes.width && changes.width.currentValue != changes.width.previousValue ||
|
|
79
|
-
(changes.height && changes.height.currentValue != changes.height.previousValue)) {
|
|
80
|
-
if (this.widgetElement) {
|
|
81
|
-
/** @type {?} */
|
|
82
|
-
var size = {};
|
|
83
|
-
size.height = this.height;
|
|
84
|
-
size.width = this.width;
|
|
85
|
-
this.widgetElement.widgetResized(size);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
/**
|
|
90
|
-
* @return {?}
|
|
91
|
-
*/
|
|
92
|
-
RAWidgetContainer.prototype.ngAfterViewInit = /**
|
|
93
|
-
* @return {?}
|
|
94
|
-
*/
|
|
95
|
-
function () {
|
|
96
|
-
var _this = this;
|
|
97
|
-
setTimeout((/**
|
|
98
|
-
* @return {?}
|
|
99
|
-
*/
|
|
100
|
-
function () {
|
|
101
|
-
_this.loadWidget(_this.data.widgetInfo);
|
|
102
|
-
}));
|
|
103
|
-
};
|
|
104
|
-
/**
|
|
105
|
-
* @return {?}
|
|
106
|
-
*/
|
|
107
|
-
RAWidgetContainer.prototype.ngOnDestroy = /**
|
|
108
|
-
* @return {?}
|
|
109
|
-
*/
|
|
110
|
-
function () {
|
|
111
|
-
if (this.configChanged)
|
|
112
|
-
this.configChanged.unsubscribe();
|
|
113
|
-
};
|
|
114
|
-
/** To Edit current widget configuration*/
|
|
115
|
-
/**
|
|
116
|
-
* To Edit current widget configuration
|
|
117
|
-
* @return {?}
|
|
118
|
-
*/
|
|
119
|
-
RAWidgetContainer.prototype.editWidget = /**
|
|
120
|
-
* To Edit current widget configuration
|
|
121
|
-
* @return {?}
|
|
122
|
-
*/
|
|
123
|
-
function () {
|
|
124
|
-
this.raDashboardEventBus.publish(RAEvent.WidgetEditClicked, this.data.widgetInfo);
|
|
125
|
-
};
|
|
126
|
-
/** To Delete current widget from DOM*/
|
|
127
|
-
/**
|
|
128
|
-
* To Delete current widget from DOM
|
|
129
|
-
* @return {?}
|
|
130
|
-
*/
|
|
131
|
-
RAWidgetContainer.prototype.deleteWidget = /**
|
|
132
|
-
* To Delete current widget from DOM
|
|
133
|
-
* @return {?}
|
|
134
|
-
*/
|
|
135
|
-
function () {
|
|
136
|
-
var _this = this;
|
|
137
|
-
/** @type {?} */
|
|
138
|
-
var widgetContainerContext = this;
|
|
139
|
-
widgetContainerContext.ngxService.start();
|
|
140
|
-
widgetContainerContext.dashboardService.deleteWidget(this.data.widgetInfo, this.appConfig).subscribe((/**
|
|
141
|
-
* @param {?} status
|
|
142
|
-
* @return {?}
|
|
143
|
-
*/
|
|
144
|
-
function (status) {
|
|
145
|
-
widgetContainerContext.ngxService.stop();
|
|
146
|
-
if (status) {
|
|
147
|
-
widgetContainerContext.widgetDeleted.emit(_this.data.widgetInfo.widgetInstanceId);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
widgetContainerContext.notifier.notify('error', " " + _this.translateService.translate('FailedToRemoveWidget') + " (" + _this.data.widgetInfo.widgetTitle + ")!");
|
|
151
|
-
}
|
|
152
|
-
}));
|
|
153
|
-
};
|
|
154
|
-
/** To Move or change position if current widget container*/
|
|
155
|
-
/**
|
|
156
|
-
* To Move or change position if current widget container
|
|
157
|
-
* @return {?}
|
|
158
|
-
*/
|
|
159
|
-
RAWidgetContainer.prototype.moveWidget = /**
|
|
160
|
-
* To Move or change position if current widget container
|
|
161
|
-
* @return {?}
|
|
162
|
-
*/
|
|
163
|
-
function () {
|
|
164
|
-
this.raDashboardEventBus.publish(RAEvent.MoveWidget, this.data.widgetInfo);
|
|
165
|
-
// this.dashboardService.moveWidget(widgetInfo);
|
|
166
|
-
};
|
|
167
|
-
/** To Copy Current widget with same configuration*/
|
|
168
|
-
/**
|
|
169
|
-
* To Copy Current widget with same configuration
|
|
170
|
-
* @return {?}
|
|
171
|
-
*/
|
|
172
|
-
RAWidgetContainer.prototype.copyWidget = /**
|
|
173
|
-
* To Copy Current widget with same configuration
|
|
174
|
-
* @return {?}
|
|
175
|
-
*/
|
|
176
|
-
function () {
|
|
177
|
-
this.raDashboardEventBus.publish(RAEvent.CopyWidget, this.data.widgetInfo);
|
|
178
|
-
//this.dashboardService.copyWidget(widgetInfo);
|
|
179
|
-
};
|
|
180
|
-
/**
|
|
181
|
-
* @param {?} widgetInfo
|
|
182
|
-
* @return {?}
|
|
183
|
-
*/
|
|
184
|
-
RAWidgetContainer.prototype.configChangeEventHandler = /**
|
|
185
|
-
* @param {?} widgetInfo
|
|
186
|
-
* @return {?}
|
|
187
|
-
*/
|
|
188
|
-
function (widgetInfo) {
|
|
189
|
-
this.data.widgetInfo = widgetInfo;
|
|
190
|
-
this.refreshWidget(this.data.widgetInfo);
|
|
191
|
-
// this.updateWidget(widgetInfo);
|
|
192
|
-
};
|
|
193
|
-
/** To load external custom element to the widget container*/
|
|
194
|
-
/**
|
|
195
|
-
* To load external custom element to the widget container
|
|
196
|
-
* @param {?} widgetInfo
|
|
197
|
-
* @return {?}
|
|
198
|
-
*/
|
|
199
|
-
RAWidgetContainer.prototype.loadWidget = /**
|
|
200
|
-
* To load external custom element to the widget container
|
|
201
|
-
* @param {?} widgetInfo
|
|
202
|
-
* @return {?}
|
|
203
|
-
*/
|
|
204
|
-
function (widgetInfo) {
|
|
205
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
206
|
-
var widgetConfigFilter, widgetContainer;
|
|
207
|
-
var _this = this;
|
|
208
|
-
return tslib_1.__generator(this, function (_a) {
|
|
209
|
-
widgetConfigFilter = (/** @type {?} */ ({
|
|
210
|
-
config: widgetInfo.widgetConfigInfo.config,
|
|
211
|
-
globalFilter: this.globalFilter
|
|
212
|
-
}));
|
|
213
|
-
widgetContainer = this;
|
|
214
|
-
this.dashboardService.loadExternalScript(widgetInfo.scriptUrl, (/**
|
|
215
|
-
* @return {?}
|
|
216
|
-
*/
|
|
217
|
-
function () {
|
|
218
|
-
_this.translateService.loadTranslations(_this.appConfig.appManagementBaseUrl, _this.data.widgetInfo.widgetName).then((/**
|
|
219
|
-
* @return {?}
|
|
220
|
-
*/
|
|
221
|
-
function () {
|
|
222
|
-
widgetContainer.widgetElement = document.createElement(widgetInfo.customTag);
|
|
223
|
-
widgetContainer.widgetElement.setAttribute("widget-instance-id", widgetInfo.widgetInstanceId);
|
|
224
|
-
document.body.addEventListener('widgetinitiated' + widgetInfo.widgetInstanceId, (/**
|
|
225
|
-
* @return {?}
|
|
226
|
-
*/
|
|
227
|
-
function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
228
|
-
var _this = this;
|
|
229
|
-
return tslib_1.__generator(this, function (_a) {
|
|
230
|
-
setTimeout((/**
|
|
231
|
-
* @return {?}
|
|
232
|
-
*/
|
|
233
|
-
function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
234
|
-
var _this = this;
|
|
235
|
-
return tslib_1.__generator(this, function (_a) {
|
|
236
|
-
switch (_a.label) {
|
|
237
|
-
case 0:
|
|
238
|
-
this.widgetElement.addEventListener('on-data-load', (/**
|
|
239
|
-
* @param {?} e
|
|
240
|
-
* @return {?}
|
|
241
|
-
*/
|
|
242
|
-
function (e) {
|
|
243
|
-
if (e.detail)
|
|
244
|
-
_this.showPanel = true;
|
|
245
|
-
else
|
|
246
|
-
_this.showPanel = false;
|
|
247
|
-
}));
|
|
248
|
-
widgetContainer.isWidgetLoaded = true;
|
|
249
|
-
widgetConfigFilter.appConfig = this.appConfig;
|
|
250
|
-
widgetConfigFilter.widgetInfo = widgetInfo;
|
|
251
|
-
// widgetConfigFilter.widgetInfo = <IWidgetInfo>{};
|
|
252
|
-
widgetConfigFilter.widgetInfo.widgetName = widgetInfo.widgetName;
|
|
253
|
-
widgetContainer.widgetElement.loadContent(widgetConfigFilter);
|
|
254
|
-
return [4 /*yield*/, widgetContainer.setLock(widgetConfigFilter.config)];
|
|
255
|
-
case 1:
|
|
256
|
-
_a.sent();
|
|
257
|
-
return [4 /*yield*/, widgetContainer.setDownloadIcon()];
|
|
258
|
-
case 2:
|
|
259
|
-
_a.sent();
|
|
260
|
-
return [2 /*return*/];
|
|
261
|
-
}
|
|
262
|
-
});
|
|
263
|
-
}); }));
|
|
264
|
-
return [2 /*return*/];
|
|
265
|
-
});
|
|
266
|
-
}); }));
|
|
267
|
-
_this.ctlWidget.nativeElement.appendChild(_this.widgetElement);
|
|
268
|
-
}));
|
|
269
|
-
}));
|
|
270
|
-
return [2 /*return*/];
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
};
|
|
274
|
-
/** To refresh widget on input config changes */
|
|
275
|
-
/**
|
|
276
|
-
* To refresh widget on input config changes
|
|
277
|
-
* @param {?} widgetInfo
|
|
278
|
-
* @return {?}
|
|
279
|
-
*/
|
|
280
|
-
RAWidgetContainer.prototype.refreshWidget = /**
|
|
281
|
-
* To refresh widget on input config changes
|
|
282
|
-
* @param {?} widgetInfo
|
|
283
|
-
* @return {?}
|
|
284
|
-
*/
|
|
285
|
-
function (widgetInfo) {
|
|
286
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
287
|
-
var widgetContainerContext, widgetConfigFilter;
|
|
288
|
-
return tslib_1.__generator(this, function (_a) {
|
|
289
|
-
switch (_a.label) {
|
|
290
|
-
case 0:
|
|
291
|
-
widgetContainerContext = this;
|
|
292
|
-
widgetConfigFilter = (/** @type {?} */ ({
|
|
293
|
-
config: widgetInfo.widgetConfigInfo.config,
|
|
294
|
-
globalFilter: this.globalFilter,
|
|
295
|
-
appConfig: this.appConfig,
|
|
296
|
-
widgetInfo: widgetInfo
|
|
297
|
-
}));
|
|
298
|
-
if (!widgetContainerContext.isWidgetLoaded) return [3 /*break*/, 3];
|
|
299
|
-
widgetContainerContext.widgetElement.loadContent(widgetConfigFilter);
|
|
300
|
-
return [4 /*yield*/, this.setLock(widgetConfigFilter.config)];
|
|
301
|
-
case 1:
|
|
302
|
-
_a.sent();
|
|
303
|
-
return [4 /*yield*/, this.setDownloadIcon()];
|
|
304
|
-
case 2:
|
|
305
|
-
_a.sent();
|
|
306
|
-
_a.label = 3;
|
|
307
|
-
case 3: return [2 /*return*/];
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
|
-
});
|
|
311
|
-
};
|
|
312
|
-
/**
|
|
313
|
-
* @private
|
|
314
|
-
* @param {?} config
|
|
315
|
-
* @return {?}
|
|
316
|
-
*/
|
|
317
|
-
RAWidgetContainer.prototype.setLock = /**
|
|
318
|
-
* @private
|
|
319
|
-
* @param {?} config
|
|
320
|
-
* @return {?}
|
|
321
|
-
*/
|
|
322
|
-
function (config) {
|
|
323
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
324
|
-
var _a;
|
|
325
|
-
return tslib_1.__generator(this, function (_b) {
|
|
326
|
-
switch (_b.label) {
|
|
327
|
-
case 0:
|
|
328
|
-
debugger;
|
|
329
|
-
_a = this;
|
|
330
|
-
return [4 /*yield*/, this.widgetElement.loadLockStatus(config)];
|
|
331
|
-
case 1:
|
|
332
|
-
_a.lockStatus = _b.sent();
|
|
333
|
-
if (this.lockStatus == 'lock') {
|
|
334
|
-
this.lockTitle = 'Locked';
|
|
335
|
-
console.log(this.lockTitle);
|
|
336
|
-
}
|
|
337
|
-
else {
|
|
338
|
-
this.lockTitle = 'Partially Locked';
|
|
339
|
-
}
|
|
340
|
-
if (this.lockStatus) {
|
|
341
|
-
switch (this.lockStatus) {
|
|
342
|
-
case "lock": {
|
|
343
|
-
this.lockClass = "fas fa-lock locked";
|
|
344
|
-
break;
|
|
345
|
-
}
|
|
346
|
-
case "unlock": {
|
|
347
|
-
this.lockClass = "unlocked";
|
|
348
|
-
break;
|
|
349
|
-
}
|
|
350
|
-
case "partiallock": {
|
|
351
|
-
this.lockClass = "fas fa-lock partiallocked";
|
|
352
|
-
break;
|
|
353
|
-
}
|
|
354
|
-
default: {
|
|
355
|
-
this.lockClass = "unlocked";
|
|
356
|
-
break;
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
return [2 /*return*/];
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
};
|
|
365
|
-
/**
|
|
366
|
-
* @return {?}
|
|
367
|
-
*/
|
|
368
|
-
RAWidgetContainer.prototype.setDownloadIcon = /**
|
|
369
|
-
* @return {?}
|
|
370
|
-
*/
|
|
371
|
-
function () {
|
|
372
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
373
|
-
var downloadType;
|
|
374
|
-
return tslib_1.__generator(this, function (_a) {
|
|
375
|
-
switch (_a.label) {
|
|
376
|
-
case 0: return [4 /*yield*/, this.widgetElement.getDownloadType()];
|
|
377
|
-
case 1:
|
|
378
|
-
downloadType = _a.sent();
|
|
379
|
-
this.downloadIconType = downloadType;
|
|
380
|
-
if (downloadType != RADownloadType.None) {
|
|
381
|
-
this.isDownloadIconVisible = true;
|
|
382
|
-
}
|
|
383
|
-
return [2 /*return*/];
|
|
384
|
-
}
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
};
|
|
388
|
-
/**
|
|
389
|
-
* @return {?}
|
|
390
|
-
*/
|
|
391
|
-
RAWidgetContainer.prototype.downloadClicked = /**
|
|
392
|
-
* @return {?}
|
|
393
|
-
*/
|
|
394
|
-
function () {
|
|
395
|
-
switch (this.downloadIconType) {
|
|
396
|
-
case RADownloadType.Grid:
|
|
397
|
-
this.downloadIconClicked('CSV');
|
|
398
|
-
break;
|
|
399
|
-
case RADownloadType.Chart:
|
|
400
|
-
this.isDownloadChartVisible = true;
|
|
401
|
-
break;
|
|
402
|
-
case RADownloadType.Custom:
|
|
403
|
-
break;
|
|
404
|
-
}
|
|
405
|
-
};
|
|
406
|
-
/**
|
|
407
|
-
* @param {?} type
|
|
408
|
-
* @return {?}
|
|
409
|
-
*/
|
|
410
|
-
RAWidgetContainer.prototype.downloadIconClicked = /**
|
|
411
|
-
* @param {?} type
|
|
412
|
-
* @return {?}
|
|
413
|
-
*/
|
|
414
|
-
function (type) {
|
|
415
|
-
switch (type) {
|
|
416
|
-
case "CSV":
|
|
417
|
-
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.CSV);
|
|
418
|
-
break;
|
|
419
|
-
case "PNG":
|
|
420
|
-
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.PNG);
|
|
421
|
-
break;
|
|
422
|
-
case "PDF":
|
|
423
|
-
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.PDF);
|
|
424
|
-
break;
|
|
425
|
-
case "SVG":
|
|
426
|
-
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.SVG);
|
|
427
|
-
break;
|
|
428
|
-
case "JPEG":
|
|
429
|
-
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.JPEG);
|
|
430
|
-
break;
|
|
431
|
-
}
|
|
432
|
-
};
|
|
433
|
-
/**Show dropdown on gear icon click */
|
|
434
|
-
/**
|
|
435
|
-
* Show dropdown on gear icon click
|
|
436
|
-
* @return {?}
|
|
437
|
-
*/
|
|
438
|
-
RAWidgetContainer.prototype.showDropDown = /**
|
|
439
|
-
* Show dropdown on gear icon click
|
|
440
|
-
* @return {?}
|
|
441
|
-
*/
|
|
442
|
-
function () {
|
|
443
|
-
this.dropDownShown = !this.dropDownShown;
|
|
444
|
-
};
|
|
445
|
-
/**Hide dropdown on outside click */
|
|
446
|
-
/**
|
|
447
|
-
* Hide dropdown on outside click
|
|
448
|
-
* @return {?}
|
|
449
|
-
*/
|
|
450
|
-
RAWidgetContainer.prototype.hideDropDown = /**
|
|
451
|
-
* Hide dropdown on outside click
|
|
452
|
-
* @return {?}
|
|
453
|
-
*/
|
|
454
|
-
function () {
|
|
455
|
-
if (this.dropDownShown) {
|
|
456
|
-
this.dropDownShown = false;
|
|
457
|
-
}
|
|
458
|
-
this.isDownloadChartVisible = false;
|
|
459
|
-
};
|
|
460
|
-
RAWidgetContainer.decorators = [
|
|
461
|
-
{ type: Component, args: [{
|
|
462
|
-
selector: 'ra-widget-container',
|
|
463
|
-
template: "<div class=\"wc-wrapper\" (mouseleave)=\"hideDropDown()\">\
|
|
464
|
-
styles: [".wcheader{width:100%;height:24px;background:#fff;color:#3dcd58;font-family:\"Arial Rounded MT\";font-size:16px;position:absolute;left:0;top:0}.wc-wrapper{height:100%;position:relative;margin:auto 15px}.wc-mover{cursor:all-scroll}.wcBody{width:100%;position:absolute;top:46px;left:0;bottom:15px}.wcBodyBorder{border:1px dashed #e6e2e2}.sp_icon{float:left;margin:0 15% 0 0}.dropbtn{cursor:pointer;color:#42b4e6}.dropdown{visibility:hidden;opacity:0;transition:visibility,opacity .5s linear;position:relative}.dropdown hr{margin:0!important}.dropdown-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:100px;box-shadow:0 8px 16px 8px rgba(0,0,0,.2);z-index:2;font-size:12px;font-weight:400}.dropdown-content a{color:#000;padding:5px 16px;text-decoration:none;display:block;cursor:pointer}.dropdown-content a:hover{background-color:#f1f1f1}.dropdown-click{display:block!important;-webkit-animation:.3s ease-out slide-down;animation:.3s ease-out slide-down}.download-icon{cursor:pointer}.dropdown:hover .dropdown-content{color:#fff}.wc-wrapper:hover .dropdown{visibility:visible;opacity:1}.title-bar-icon{margin:0 3px;color:#42b4e6}.title-bar-lock-icon{margin:0 3px}.hr{border:0;border-top:1px solid rgba(0,0,0,.1)}@keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0)}}.widget-config-item i{font-size:17px;color:#42b4e6}.widget-config-item span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}.locked{color:#42b4e6}.partiallocked{color:#a0d9f2}.unlocked{display:none}.download{visibility:hidden;opacity:0;transition:visibility,opacity .5s linear;position:relative}.wc-wrapper:hover .download{visibility:visible;opacity:1}.download-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:100px;box-shadow:0 8px 16px 8px rgba(0,0,0,.2);z-index:2;font-size:12px;font-weight:400}.download-content a{color:#000;padding:5px 16px;text-decoration:none;display:block;cursor:pointer}.download-content a:hover{background-color:#f1f1f1}.download-content a i{font-size:17px;color:#42b4e6}.download-content a span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}"]
|
|
465
|
-
}] }
|
|
466
|
-
];
|
|
467
|
-
/** @nocollapse */
|
|
468
|
-
RAWidgetContainer.ctorParameters = function () { return [
|
|
469
|
-
{ type: RaDashboardService },
|
|
470
|
-
{ type: NgxUiLoaderService },
|
|
471
|
-
{ type: RATranslateService },
|
|
472
|
-
{ type: NgZone },
|
|
473
|
-
{ type: NotifierService },
|
|
474
|
-
{ type: Renderer2 }
|
|
475
|
-
]; };
|
|
476
|
-
RAWidgetContainer.propDecorators = {
|
|
477
|
-
ctlWidget: [{ type: ViewChild, args: ['ctlWidget', { static: false },] }],
|
|
478
|
-
widgetDropdown: [{ type: ViewChild, args: ['widgetDropdown', { static: false },] }],
|
|
479
|
-
widgetDownload: [{ type: ViewChild, args: ['widgetDownload', { static: false },] }],
|
|
480
|
-
widgetInstanceId: [{ type: Input, args: ['widget-instance-id',] }],
|
|
481
|
-
globalFilter: [{ type: Input, args: ['global-filter',] }],
|
|
482
|
-
data: [{ type: Input, args: ['data',] }],
|
|
483
|
-
raDashboardEventBus: [{ type: Input, args: ['event-bus',] }],
|
|
484
|
-
appConfig: [{ type: Input, args: ['app-config',] }],
|
|
485
|
-
width: [{ type: Input, args: ['widget-width',] }],
|
|
486
|
-
height: [{ type: Input, args: ['widget-height',] }],
|
|
487
|
-
widgetDeleted: [{ type: Output }]
|
|
488
|
-
};
|
|
489
|
-
return RAWidgetContainer;
|
|
490
|
-
}());
|
|
491
|
-
export { RAWidgetContainer };
|
|
492
|
-
if (false) {
|
|
493
|
-
/** @type {?} */
|
|
494
|
-
RAWidgetContainer.prototype.showPanel;
|
|
495
|
-
/**
|
|
496
|
-
* @type {?}
|
|
497
|
-
* @private
|
|
498
|
-
*/
|
|
499
|
-
RAWidgetContainer.prototype.isWidgetLoaded;
|
|
500
|
-
/**
|
|
501
|
-
* @type {?}
|
|
502
|
-
* @private
|
|
503
|
-
*/
|
|
504
|
-
RAWidgetContainer.prototype.widgetElement;
|
|
505
|
-
/**
|
|
506
|
-
* @type {?}
|
|
507
|
-
* @private
|
|
508
|
-
*/
|
|
509
|
-
RAWidgetContainer.prototype.configChanged;
|
|
510
|
-
/**
|
|
511
|
-
* @type {?}
|
|
512
|
-
* @private
|
|
513
|
-
*/
|
|
514
|
-
RAWidgetContainer.prototype.isIEOrEdge;
|
|
515
|
-
/** @type {?} */
|
|
516
|
-
RAWidgetContainer.prototype.widgetHeight;
|
|
517
|
-
/** @type {?} */
|
|
518
|
-
RAWidgetContainer.prototype.lockClass;
|
|
519
|
-
/** @type {?} */
|
|
520
|
-
RAWidgetContainer.prototype.lockStatus;
|
|
521
|
-
/** @type {?} */
|
|
522
|
-
RAWidgetContainer.prototype.isDownloadIconVisible;
|
|
523
|
-
/** @type {?} */
|
|
524
|
-
RAWidgetContainer.prototype.dropDownShown;
|
|
525
|
-
/** @type {?} */
|
|
526
|
-
RAWidgetContainer.prototype.isDownloadChartVisible;
|
|
527
|
-
/** @type {?} */
|
|
528
|
-
RAWidgetContainer.prototype.downloadIconType;
|
|
529
|
-
/** @type {?} */
|
|
530
|
-
RAWidgetContainer.prototype.ctlWidget;
|
|
531
|
-
/** @type {?} */
|
|
532
|
-
RAWidgetContainer.prototype.widgetDropdown;
|
|
533
|
-
/** @type {?} */
|
|
534
|
-
RAWidgetContainer.prototype.widgetDownload;
|
|
535
|
-
/** @type {?} */
|
|
536
|
-
RAWidgetContainer.prototype.widgetInstanceId;
|
|
537
|
-
/** @type {?} */
|
|
538
|
-
RAWidgetContainer.prototype.globalFilter;
|
|
539
|
-
/** @type {?} */
|
|
540
|
-
RAWidgetContainer.prototype.data;
|
|
541
|
-
/** @type {?} */
|
|
542
|
-
RAWidgetContainer.prototype.raDashboardEventBus;
|
|
543
|
-
/** @type {?} */
|
|
544
|
-
RAWidgetContainer.prototype.appConfig;
|
|
545
|
-
/** @type {?} */
|
|
546
|
-
RAWidgetContainer.prototype.width;
|
|
547
|
-
/** @type {?} */
|
|
548
|
-
RAWidgetContainer.prototype.height;
|
|
549
|
-
/** @type {?} */
|
|
550
|
-
RAWidgetContainer.prototype.widgetDeleted;
|
|
551
|
-
/** @type {?} */
|
|
552
|
-
RAWidgetContainer.prototype.lockTitle;
|
|
553
|
-
/**
|
|
554
|
-
* @type {?}
|
|
555
|
-
* @private
|
|
556
|
-
*/
|
|
557
|
-
RAWidgetContainer.prototype.dashboardService;
|
|
558
|
-
/**
|
|
559
|
-
* @type {?}
|
|
560
|
-
* @private
|
|
561
|
-
*/
|
|
562
|
-
RAWidgetContainer.prototype.ngxService;
|
|
563
|
-
/**
|
|
564
|
-
* @type {?}
|
|
565
|
-
* @private
|
|
566
|
-
*/
|
|
567
|
-
RAWidgetContainer.prototype.translateService;
|
|
568
|
-
/**
|
|
569
|
-
* @type {?}
|
|
570
|
-
* @private
|
|
571
|
-
*/
|
|
572
|
-
RAWidgetContainer.prototype.ngZone;
|
|
573
|
-
/**
|
|
574
|
-
* @type {?}
|
|
575
|
-
* @private
|
|
576
|
-
*/
|
|
577
|
-
RAWidgetContainer.prototype.notifier;
|
|
578
|
-
/**
|
|
579
|
-
* @type {?}
|
|
580
|
-
* @private
|
|
581
|
-
*/
|
|
582
|
-
RAWidgetContainer.prototype.renderer;
|
|
583
|
-
}
|
|
584
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmEud2lkZ2V0LmNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2NobmVpZGVyZXNzL2Rhc2hib2FyZGZyYW1ld29yay8iLCJzb3VyY2VzIjpbImxpYi9yYS13aWRnZXQtY29udGFpbmVyL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFvRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNMLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFnRCxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzdEO0lBcUNFLDJCQUFvQixnQkFBb0MsRUFDOUMsVUFBOEIsRUFDOUIsZ0JBQW9DLEVBQ3BDLE1BQWMsRUFDZCxRQUF5QixFQUN6QixRQUFtQjtRQUw3QixpQkFvQkM7UUFwQm1CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsYUFB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O0lBR2IsNkNBQTRDOzs7OztJQUN0RCx1Q0FBc0M7Ozs7O0lBQ3RDLDZDQUE0Qzs7Ozs7SUFDNUMsbUNBQXNCOzs7OztJQUN0QixxQ0FBaUM7Ozs7O0lBQ2pDLHFDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBTaW1wbGVDaGFuZ2UsIE9uRGVzdHJveSwgTmdab25lLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUmFEYXNoYm9hcmRTZXJ2aWNlIH0gZnJvbSAnLi8uLi9yYS5kYXNoYm9hcmQuc2VydmljZSc7XHJcbmltcG9ydCB7IFJBRGFzaGJvYXJkRXZlbnRCdXMgfSBmcm9tICcuLi9yYS5kYXNoYmFyZC5ldmVudC5idXMnO1xyXG5pbXBvcnQgeyBSQUV2ZW50LCBSQUV2ZW50S2V5IH0gZnJvbSAnLi4vcmEuZXZlbnQuZW51bSc7XHJcbmltcG9ydCB7IElBcHBDb25maWcsIElXaWRnZXRDb25maWdGaWx0ZXIsIElXaWRnZXRJbmZvLCBSQURvd25sb2FkVHlwZSwgUkFEb3dubG9hZE9wdGlvbiB9IGZyb20gJ0BzY2huZWlkZXJlc3Mvd2lkZ2V0ZnJhbWV3b3JrJztcclxuaW1wb3J0IHsgTmd4VWlMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnbmd4LXVpLWxvYWRlcic7XHJcbmltcG9ydCB7IE5vdGlmaWVyU2VydmljZSB9IGZyb20gJ2FuZ3VsYXItbm90aWZpZXInO1xyXG5cclxuaW1wb3J0IHsgUkFUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQHNjaG5laWRlcmVzcy9yYS1jb21tb24nO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncmEtd2lkZ2V0LWNvbnRhaW5lcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSQVdpZGdldENvbnRhaW5lciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgcHVibGljIHNob3dQYW5lbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgaXNXaWRnZXRMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHdpZGdldEVsZW1lbnQ6IGFueTtcclxuICBwcml2YXRlIGNvbmZpZ0NoYW5nZWQ6IGFueTtcclxuICBwcml2YXRlIGlzSUVPckVkZ2UgPSAvbXNpZVxcc3x0cmlkZW50XFwvfGVkZ2VcXC8vaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KTtcclxuICBwdWJsaWMgd2lkZ2V0SGVpZ2h0OiBudW1iZXI7XHJcbiAgcHVibGljIGxvY2tDbGFzczogc3RyaW5nID0gXCJ1bmxvY2tlZFwiO1xyXG4gIHB1YmxpYyBsb2NrU3RhdHVzOiBzdHJpbmcgPSBcInVubG9ja1wiO1xyXG4gIHB1YmxpYyBpc0Rvd25sb2FkSWNvblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgZHJvcERvd25TaG93bjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0Rvd25sb2FkQ2hhcnRWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRvd25sb2FkSWNvblR5cGU6IFJBRG93bmxvYWRUeXBlO1xyXG5cclxuICBAVmlld0NoaWxkKCdjdGxXaWRnZXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgY3RsV2lkZ2V0OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3dpZGdldERyb3Bkb3duJywgeyBzdGF0aWM6IGZhbHNlIH0pIHdpZGdldERyb3Bkb3duOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3dpZGdldERvd25sb2FkJywgeyBzdGF0aWM6IGZhbHNlIH0pIHdpZGdldERvd25sb2FkOiBFbGVtZW50UmVmO1xyXG5cclxuXHJcbiAgQElucHV0KCd3aWRnZXQtaW5zdGFuY2UtaWQnKSB3aWRnZXRJbnN0YW5jZUlkOiBudW1iZXI7XHJcbiAgQElucHV0KCdnbG9iYWwtZmlsdGVyJykgZ2xvYmFsRmlsdGVyOiBhbnk7XHJcbiAgQElucHV0KCdkYXRhJykgZGF0YTogYW55O1xyXG4gIEBJbnB1dCgnZXZlbnQtYnVzJykgcmFEYXNoYm9hcmRFdmVudEJ1czogUkFEYXNoYm9hcmRFdmVudEJ1cztcclxuICBASW5wdXQoJ2FwcC1jb25maWcnKSBhcHBDb25maWc6IElBcHBDb25maWc7XHJcbiAgQElucHV0KCd3aWRnZXQtd2lkdGgnKSB3aWR0aDogbnVtYmVyO1xyXG4gIEBJbnB1dCgnd2lkZ2V0LWhlaWdodCcpIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICBAT3V0cHV0KCkgd2lkZ2V0RGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIHB1YmxpYyBsb2NrVGl0bGU6IHN0cmluZztcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGFzaGJvYXJkU2VydmljZTogUmFEYXNoYm9hcmRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBuZ3hTZXJ2aWNlOiBOZ3hVaUxvYWRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFJBVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIG5vdGlmaWVyOiBOb3RpZmllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdGhpcy53aWRnZXREcm9wZG93bi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgdGhpcy5kcm9wRG93blNob3duID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAnY2xpY2snLCAoZTogRXZlbnQpID0+IHtcclxuICAgICAgaWYgKHRoaXMud2lkZ2V0RG93bmxvYWQgJiYgZS50YXJnZXQgIT09IHRoaXMud2lkZ2V0RG93bmxvYWQubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICAgIHRoaXMuaXNEb3dubG9hZENoYXJ0VmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cyAmJiBjaGFuZ2VzLnJhRGFzaGJvYXJkRXZlbnRCdXMuY3VycmVudFZhbHVlICE9IGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnQ2hhbmdlZCA9IHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5zdWJzY3JpYmVXaXRoS2V5KFJBRXZlbnQuQ29uZmlnQ2hhbmdlZCwgUkFFdmVudEtleS5XaWRnZXRJbnN0YW5jZUlkLCB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkLnRvU3RyaW5nKCkpLnN1YnNjcmliZSgoZSkgPT4ge1xyXG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NoYW5nZUV2ZW50SGFuZGxlcihlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMud2lkZ2V0RWxlbWVudCAmJiBjaGFuZ2VzLmdsb2JhbEZpbHRlciAmJiBjaGFuZ2VzLmdsb2JhbEZpbHRlci5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5nbG9iYWxGaWx0ZXIucHJldmlvdXNWYWx1ZSkge1xyXG5cclxuICAgICAgdGhpcy5yZWZyZXNoV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hhbmdlcy53aWR0aCAmJiBjaGFuZ2VzLndpZHRoLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLndpZHRoLnByZXZpb3VzVmFsdWUgfHxcclxuICAgICAgKGNoYW5nZXMuaGVpZ2h0ICYmIGNoYW5nZXMuaGVpZ2h0LmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLmhlaWdodC5wcmV2aW91c1ZhbHVlKSkge1xyXG4gICAgICBpZiAodGhpcy53aWRnZXRFbGVtZW50KSB7XHJcbiAgICAgICAgbGV0IHNpemU6IGFueSA9IHt9O1xyXG4gICAgICAgIHNpemUuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XHJcbiAgICAgICAgc2l6ZS53aWR0aCA9IHRoaXMud2lkdGg7XHJcbiAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LndpZGdldFJlc2l6ZWQoc2l6ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5sb2FkV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb25maWdDaGFuZ2VkKVxyXG4gICAgICB0aGlzLmNvbmZpZ0NoYW5nZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG5cclxuICAvKiogVG8gRWRpdCBjdXJyZW50IHdpZGdldCBjb25maWd1cmF0aW9uKi9cclxuICBwdWJsaWMgZWRpdFdpZGdldCgpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuV2lkZ2V0RWRpdENsaWNrZWQsIHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBEZWxldGUgY3VycmVudCB3aWRnZXQgZnJvbSBET00qL1xyXG4gIHB1YmxpYyBkZWxldGVXaWRnZXQoKSB7XHJcbiAgICBsZXQgd2lkZ2V0Q29udGFpbmVyQ29udGV4dCA9IHRoaXM7XHJcbiAgICB3aWRnZXRDb250YWluZXJDb250ZXh0Lm5neFNlcnZpY2Uuc3RhcnQoKTtcclxuICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQuZGFzaGJvYXJkU2VydmljZS5kZWxldGVXaWRnZXQodGhpcy5kYXRhLndpZGdldEluZm8sIHRoaXMuYXBwQ29uZmlnKS5zdWJzY3JpYmUoc3RhdHVzID0+IHtcclxuICAgICAgd2lkZ2V0Q29udGFpbmVyQ29udGV4dC5uZ3hTZXJ2aWNlLnN0b3AoKTtcclxuICAgICAgaWYgKHN0YXR1cykge1xyXG4gICAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQud2lkZ2V0RGVsZXRlZC5lbWl0KHRoaXMuZGF0YS53aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHdpZGdldENvbnRhaW5lckNvbnRleHQubm90aWZpZXIubm90aWZ5KCdlcnJvcicsIFwiIFwiICsgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnRyYW5zbGF0ZSgnRmFpbGVkVG9SZW1vdmVXaWRnZXQnKSArIFwiICAoXCIgKyB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRUaXRsZSArIFwiKSFcIik7XHJcblxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBNb3ZlIG9yIGNoYW5nZSBwb3NpdGlvbiBpZiBjdXJyZW50IHdpZGdldCBjb250YWluZXIqL1xyXG4gIHB1YmxpYyBtb3ZlV2lkZ2V0KCkge1xyXG4gICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5Nb3ZlV2lkZ2V0LCB0aGlzLmRhdGEud2lkZ2V0SW5mbyk7XHJcbiAgICAvLyB0aGlzLmRhc2hib2FyZFNlcnZpY2UubW92ZVdpZGdldCh3aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIC8qKiBUbyBDb3B5IEN1cnJlbnQgd2lkZ2V0IHdpdGggc2FtZSBjb25maWd1cmF0aW9uKi9cclxuICBwdWJsaWMgY29weVdpZGdldCgpIHtcclxuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuQ29weVdpZGdldCwgdGhpcy5kYXRhLndpZGdldEluZm8pO1xyXG4gICAgLy90aGlzLmRhc2hib2FyZFNlcnZpY2UuY29weVdpZGdldCh3aWRnZXRJbmZvKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb25maWdDaGFuZ2VFdmVudEhhbmRsZXIod2lkZ2V0SW5mbykge1xyXG4gICAgdGhpcy5kYXRhLndpZGdldEluZm8gPSB3aWRnZXRJbmZvO1xyXG4gICAgdGhpcy5yZWZyZXNoV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcclxuICAgIC8vIHRoaXMudXBkYXRlV2lkZ2V0KHdpZGdldEluZm8pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKiAgVG8gbG9hZCBleHRlcm5hbCBjdXN0b20gZWxlbWVudCB0byB0aGUgd2lkZ2V0IGNvbnRhaW5lciovXHJcbiAgYXN5bmMgbG9hZFdpZGdldCh3aWRnZXRJbmZvOiBhbnkpIHtcclxuICAgIGxldCB3aWRnZXRDb25maWdGaWx0ZXIgPSA8SVdpZGdldENvbmZpZ0ZpbHRlcj57XHJcbiAgICAgIGNvbmZpZzogd2lkZ2V0SW5mby53aWRnZXRDb25maWdJbmZvLmNvbmZpZyxcclxuICAgICAgZ2xvYmFsRmlsdGVyOiB0aGlzLmdsb2JhbEZpbHRlclxyXG4gICAgfVxyXG5cclxuICAgIGxldCB3aWRnZXRDb250YWluZXIgPSB0aGlzO1xyXG4gICAgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmxvYWRFeHRlcm5hbFNjcmlwdCh3aWRnZXRJbmZvLnNjcmlwdFVybCwgKCkgPT4ge1xyXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UubG9hZFRyYW5zbGF0aW9ucyh0aGlzLmFwcENvbmZpZy5hcHBNYW5hZ2VtZW50QmFzZVVybCwgdGhpcy5kYXRhLndpZGdldEluZm8ud2lkZ2V0TmFtZSkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgd2lkZ2V0Q29udGFpbmVyLndpZGdldEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHdpZGdldEluZm8uY3VzdG9tVGFnKTtcclxuICAgICAgICB3aWRnZXRDb250YWluZXIud2lkZ2V0RWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJ3aWRnZXQtaW5zdGFuY2UtaWRcIiwgd2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3dpZGdldGluaXRpYXRlZCcgKyB3aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQsIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb24tZGF0YS1sb2FkJywgKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChlLmRldGFpbClcclxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1BhbmVsID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQYW5lbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmlzV2lkZ2V0TG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgd2lkZ2V0Q29uZmlnRmlsdGVyLmFwcENvbmZpZyA9IHRoaXMuYXBwQ29uZmlnO1xyXG4gICAgICAgICAgICB3aWRnZXRDb25maWdGaWx0ZXIud2lkZ2V0SW5mbyA9IHdpZGdldEluZm87XHJcbiAgICAgICAgICAgIC8vIHdpZGdldENvbmZpZ0ZpbHRlci53aWRnZXRJbmZvID0gPElXaWRnZXRJbmZvPnt9O1xyXG4gICAgICAgICAgICB3aWRnZXRDb25maWdGaWx0ZXIud2lkZ2V0SW5mby53aWRnZXROYW1lID0gd2lkZ2V0SW5mby53aWRnZXROYW1lO1xyXG4gICAgICAgICAgICB3aWRnZXRDb250YWluZXIud2lkZ2V0RWxlbWVudC5sb2FkQ29udGVudCh3aWRnZXRDb25maWdGaWx0ZXIpO1xyXG4gICAgICAgICAgICBhd2FpdCB3aWRnZXRDb250YWluZXIuc2V0TG9jayh3aWRnZXRDb25maWdGaWx0ZXIuY29uZmlnKTtcclxuICAgICAgICAgICAgYXdhaXQgd2lkZ2V0Q29udGFpbmVyLnNldERvd25sb2FkSWNvbigpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5jdGxXaWRnZXQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLndpZGdldEVsZW1lbnQpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRvIHJlZnJlc2ggd2lkZ2V0IG9uIGlucHV0IGNvbmZpZyBjaGFuZ2VzICovXHJcbiAgYXN5bmMgcmVmcmVzaFdpZGdldCh3aWRnZXRJbmZvOiBJV2lkZ2V0SW5mbykge1xyXG4gICAgbGV0IHdpZGdldENvbnRhaW5lckNvbnRleHQgPSB0aGlzO1xyXG4gICAgbGV0IHdpZGdldENvbmZpZ0ZpbHRlciA9IDxJV2lkZ2V0Q29uZmlnRmlsdGVyPntcclxuICAgICAgY29uZmlnOiB3aWRnZXRJbmZvLndpZGdldENvbmZpZ0luZm8uY29uZmlnLFxyXG4gICAgICBnbG9iYWxGaWx0ZXI6IHRoaXMuZ2xvYmFsRmlsdGVyLFxyXG4gICAgICBhcHBDb25maWc6IHRoaXMuYXBwQ29uZmlnLFxyXG4gICAgICB3aWRnZXRJbmZvOiB3aWRnZXRJbmZvXHJcbiAgICB9XHJcbiAgICBpZiAod2lkZ2V0Q29udGFpbmVyQ29udGV4dC5pc1dpZGdldExvYWRlZCkge1xyXG4gICAgICB3aWRnZXRDb250YWluZXJDb250ZXh0LndpZGdldEVsZW1lbnQubG9hZENvbnRlbnQod2lkZ2V0Q29uZmlnRmlsdGVyKTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRMb2NrKHdpZGdldENvbmZpZ0ZpbHRlci5jb25maWcpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNldERvd25sb2FkSWNvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRMb2NrKGNvbmZpZzogc3RyaW5nKSB7ZGVidWdnZXJcclxuICAgIHRoaXMubG9ja1N0YXR1cyA9IGF3YWl0IHRoaXMud2lkZ2V0RWxlbWVudC5sb2FkTG9ja1N0YXR1cyhjb25maWcpO1xyXG4gICAgaWYodGhpcy5sb2NrU3RhdHVzID09ICdsb2NrJyl7XHJcbiAgICAgIHRoaXMubG9ja1RpdGxlID0gJ0xvY2tlZCc7XHJcbiAgICAgIGNvbnNvbGUubG9nKHRoaXMubG9ja1RpdGxlKTtcclxuICAgIH1cclxuICAgIGVsc2V7XHJcbiAgICAgIHRoaXMubG9ja1RpdGxlID0gJ1BhcnRpYWxseSBMb2NrZWQnO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubG9ja1N0YXR1cykge1xyXG4gICAgICBzd2l0Y2ggKHRoaXMubG9ja1N0YXR1cykge1xyXG4gICAgICAgIGNhc2UgXCJsb2NrXCI6IHtcclxuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJmYXMgZmEtbG9jayBsb2NrZWRcIjtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwidW5sb2NrXCI6IHtcclxuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJ1bmxvY2tlZFwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJwYXJ0aWFsbG9ja1wiOiB7XHJcbiAgICAgICAgICB0aGlzLmxvY2tDbGFzcyA9IFwiZmFzIGZhLWxvY2sgcGFydGlhbGxvY2tlZFwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJ1bmxvY2tlZFwiO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0RG93bmxvYWRJY29uKCkge1xyXG4gICAgbGV0IGRvd25sb2FkVHlwZSA9IGF3YWl0IHRoaXMud2lkZ2V0RWxlbWVudC5nZXREb3dubG9hZFR5cGUoKTtcclxuICAgIHRoaXMuZG93bmxvYWRJY29uVHlwZSA9IGRvd25sb2FkVHlwZTtcclxuXHJcblxyXG4gICAgaWYgKGRvd25sb2FkVHlwZSAhPSBSQURvd25sb2FkVHlwZS5Ob25lKSB7XHJcbiAgICAgIHRoaXMuaXNEb3dubG9hZEljb25WaXNpYmxlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb3dubG9hZENsaWNrZWQoKSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuZG93bmxvYWRJY29uVHlwZSkge1xyXG4gICAgICBjYXNlIFJBRG93bmxvYWRUeXBlLkdyaWQ6XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZEljb25DbGlja2VkKCdDU1YnKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBSQURvd25sb2FkVHlwZS5DaGFydDpcclxuICAgICAgICB0aGlzLmlzRG93bmxvYWRDaGFydFZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFJBRG93bmxvYWRUeXBlLkN1c3RvbTpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb3dubG9hZEljb25DbGlja2VkKHR5cGU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgXCJDU1ZcIjpcclxuICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuZG93bmxvYWRDbGlja2VkKHRoaXMuZG93bmxvYWRJY29uVHlwZSwgUkFEb3dubG9hZE9wdGlvbi5DU1YpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiUE5HXCI6XHJcbiAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LmRvd25sb2FkQ2xpY2tlZCh0aGlzLmRvd25sb2FkSWNvblR5cGUsIFJBRG93bmxvYWRPcHRpb24uUE5HKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcIlBERlwiOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5kb3dubG9hZENsaWNrZWQodGhpcy5kb3dubG9hZEljb25UeXBlLCBSQURvd25sb2FkT3B0aW9uLlBERik7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJTVkdcIjpcclxuICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuZG93bmxvYWRDbGlja2VkKHRoaXMuZG93bmxvYWRJY29uVHlwZSwgUkFEb3dubG9hZE9wdGlvbi5TVkcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiSlBFR1wiOlxyXG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5kb3dubG9hZENsaWNrZWQodGhpcy5kb3dubG9hZEljb25UeXBlLCBSQURvd25sb2FkT3B0aW9uLkpQRUcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqU2hvdyBkcm9wZG93biBvbiBnZWFyIGljb24gY2xpY2sgICovXHJcbiAgcHVibGljIHNob3dEcm9wRG93bigpIHtcclxuICAgIHRoaXMuZHJvcERvd25TaG93biA9ICF0aGlzLmRyb3BEb3duU2hvd247XHJcbiAgfVxyXG5cclxuICAvKipIaWRlIGRyb3Bkb3duIG9uIG91dHNpZGUgY2xpY2sgKi9cclxuICBwdWJsaWMgaGlkZURyb3BEb3duKCkge1xyXG4gICAgaWYgKHRoaXMuZHJvcERvd25TaG93bikge1xyXG4gICAgICB0aGlzLmRyb3BEb3duU2hvd24gPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNEb3dubG9hZENoYXJ0VmlzaWJsZSA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview added by tsickle
|
|
3
|
+
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
4
|
+
*/
|
|
5
|
+
import * as tslib_1 from "tslib";
|
|
6
|
+
import { Component, Input, ViewChild, ElementRef, EventEmitter, Output, NgZone, Renderer2 } from '@angular/core';
|
|
7
|
+
import { RaDashboardService } from './../ra.dashboard.service';
|
|
8
|
+
import { RADashboardEventBus } from '../ra.dashbard.event.bus';
|
|
9
|
+
import { RAEvent, RAEventKey } from '../ra.event.enum';
|
|
10
|
+
import { RADownloadType, RADownloadOption } from '@schneideress/widgetframework';
|
|
11
|
+
import { NgxUiLoaderService } from 'ngx-ui-loader';
|
|
12
|
+
import { NotifierService } from 'angular-notifier';
|
|
13
|
+
import { RATranslateService } from '@schneideress/ra-common';
|
|
14
|
+
var RAWidgetContainer = /** @class */ (function () {
|
|
15
|
+
function RAWidgetContainer(dashboardService, ngxService, translateService, ngZone, notifier, renderer) {
|
|
16
|
+
var _this = this;
|
|
17
|
+
this.dashboardService = dashboardService;
|
|
18
|
+
this.ngxService = ngxService;
|
|
19
|
+
this.translateService = translateService;
|
|
20
|
+
this.ngZone = ngZone;
|
|
21
|
+
this.notifier = notifier;
|
|
22
|
+
this.renderer = renderer;
|
|
23
|
+
this.showPanel = false;
|
|
24
|
+
this.isWidgetLoaded = false;
|
|
25
|
+
this.isIEOrEdge = /msie\s|trident\/|edge\//i.test(window.navigator.userAgent);
|
|
26
|
+
this.lockClass = "unlocked";
|
|
27
|
+
this.lockStatus = "unlock";
|
|
28
|
+
this.isDownloadIconVisible = false;
|
|
29
|
+
this.dropDownShown = false;
|
|
30
|
+
this.isDownloadChartVisible = false;
|
|
31
|
+
this.widgetDeleted = new EventEmitter();
|
|
32
|
+
this.renderer.listen('window', 'click', (/**
|
|
33
|
+
* @param {?} e
|
|
34
|
+
* @return {?}
|
|
35
|
+
*/
|
|
36
|
+
function (e) {
|
|
37
|
+
if (e.target !== _this.widgetDropdown.nativeElement) {
|
|
38
|
+
_this.dropDownShown = false;
|
|
39
|
+
}
|
|
40
|
+
}));
|
|
41
|
+
this.renderer.listen('window', 'click', (/**
|
|
42
|
+
* @param {?} e
|
|
43
|
+
* @return {?}
|
|
44
|
+
*/
|
|
45
|
+
function (e) {
|
|
46
|
+
if (_this.widgetDownload && e.target !== _this.widgetDownload.nativeElement) {
|
|
47
|
+
_this.isDownloadChartVisible = false;
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @param {?} changes
|
|
53
|
+
* @return {?}
|
|
54
|
+
*/
|
|
55
|
+
RAWidgetContainer.prototype.ngOnChanges = /**
|
|
56
|
+
* @param {?} changes
|
|
57
|
+
* @return {?}
|
|
58
|
+
*/
|
|
59
|
+
function (changes) {
|
|
60
|
+
var _this = this;
|
|
61
|
+
if (changes.raDashboardEventBus && changes.raDashboardEventBus.currentValue != changes.raDashboardEventBus.previousValue) {
|
|
62
|
+
this.configChanged = this.raDashboardEventBus.subscribeWithKey(RAEvent.ConfigChanged, RAEventKey.WidgetInstanceId, this.data.widgetInfo.widgetInstanceId.toString()).subscribe((/**
|
|
63
|
+
* @param {?} e
|
|
64
|
+
* @return {?}
|
|
65
|
+
*/
|
|
66
|
+
function (e) {
|
|
67
|
+
_this.ngZone.run((/**
|
|
68
|
+
* @return {?}
|
|
69
|
+
*/
|
|
70
|
+
function () {
|
|
71
|
+
_this.configChangeEventHandler(e);
|
|
72
|
+
}));
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
if (this.widgetElement && changes.globalFilter && changes.globalFilter.currentValue != changes.globalFilter.previousValue) {
|
|
76
|
+
this.refreshWidget(this.data.widgetInfo);
|
|
77
|
+
}
|
|
78
|
+
if (changes.width && changes.width.currentValue != changes.width.previousValue ||
|
|
79
|
+
(changes.height && changes.height.currentValue != changes.height.previousValue)) {
|
|
80
|
+
if (this.widgetElement) {
|
|
81
|
+
/** @type {?} */
|
|
82
|
+
var size = {};
|
|
83
|
+
size.height = this.height;
|
|
84
|
+
size.width = this.width;
|
|
85
|
+
this.widgetElement.widgetResized(size);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* @return {?}
|
|
91
|
+
*/
|
|
92
|
+
RAWidgetContainer.prototype.ngAfterViewInit = /**
|
|
93
|
+
* @return {?}
|
|
94
|
+
*/
|
|
95
|
+
function () {
|
|
96
|
+
var _this = this;
|
|
97
|
+
setTimeout((/**
|
|
98
|
+
* @return {?}
|
|
99
|
+
*/
|
|
100
|
+
function () {
|
|
101
|
+
_this.loadWidget(_this.data.widgetInfo);
|
|
102
|
+
}));
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* @return {?}
|
|
106
|
+
*/
|
|
107
|
+
RAWidgetContainer.prototype.ngOnDestroy = /**
|
|
108
|
+
* @return {?}
|
|
109
|
+
*/
|
|
110
|
+
function () {
|
|
111
|
+
if (this.configChanged)
|
|
112
|
+
this.configChanged.unsubscribe();
|
|
113
|
+
};
|
|
114
|
+
/** To Edit current widget configuration*/
|
|
115
|
+
/**
|
|
116
|
+
* To Edit current widget configuration
|
|
117
|
+
* @return {?}
|
|
118
|
+
*/
|
|
119
|
+
RAWidgetContainer.prototype.editWidget = /**
|
|
120
|
+
* To Edit current widget configuration
|
|
121
|
+
* @return {?}
|
|
122
|
+
*/
|
|
123
|
+
function () {
|
|
124
|
+
this.raDashboardEventBus.publish(RAEvent.WidgetEditClicked, this.data.widgetInfo);
|
|
125
|
+
};
|
|
126
|
+
/** To Delete current widget from DOM*/
|
|
127
|
+
/**
|
|
128
|
+
* To Delete current widget from DOM
|
|
129
|
+
* @return {?}
|
|
130
|
+
*/
|
|
131
|
+
RAWidgetContainer.prototype.deleteWidget = /**
|
|
132
|
+
* To Delete current widget from DOM
|
|
133
|
+
* @return {?}
|
|
134
|
+
*/
|
|
135
|
+
function () {
|
|
136
|
+
var _this = this;
|
|
137
|
+
/** @type {?} */
|
|
138
|
+
var widgetContainerContext = this;
|
|
139
|
+
widgetContainerContext.ngxService.start();
|
|
140
|
+
widgetContainerContext.dashboardService.deleteWidget(this.data.widgetInfo, this.appConfig).subscribe((/**
|
|
141
|
+
* @param {?} status
|
|
142
|
+
* @return {?}
|
|
143
|
+
*/
|
|
144
|
+
function (status) {
|
|
145
|
+
widgetContainerContext.ngxService.stop();
|
|
146
|
+
if (status) {
|
|
147
|
+
widgetContainerContext.widgetDeleted.emit(_this.data.widgetInfo.widgetInstanceId);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
widgetContainerContext.notifier.notify('error', " " + _this.translateService.translate('FailedToRemoveWidget') + " (" + _this.data.widgetInfo.widgetTitle + ")!");
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
};
|
|
154
|
+
/** To Move or change position if current widget container*/
|
|
155
|
+
/**
|
|
156
|
+
* To Move or change position if current widget container
|
|
157
|
+
* @return {?}
|
|
158
|
+
*/
|
|
159
|
+
RAWidgetContainer.prototype.moveWidget = /**
|
|
160
|
+
* To Move or change position if current widget container
|
|
161
|
+
* @return {?}
|
|
162
|
+
*/
|
|
163
|
+
function () {
|
|
164
|
+
this.raDashboardEventBus.publish(RAEvent.MoveWidget, this.data.widgetInfo);
|
|
165
|
+
// this.dashboardService.moveWidget(widgetInfo);
|
|
166
|
+
};
|
|
167
|
+
/** To Copy Current widget with same configuration*/
|
|
168
|
+
/**
|
|
169
|
+
* To Copy Current widget with same configuration
|
|
170
|
+
* @return {?}
|
|
171
|
+
*/
|
|
172
|
+
RAWidgetContainer.prototype.copyWidget = /**
|
|
173
|
+
* To Copy Current widget with same configuration
|
|
174
|
+
* @return {?}
|
|
175
|
+
*/
|
|
176
|
+
function () {
|
|
177
|
+
this.raDashboardEventBus.publish(RAEvent.CopyWidget, this.data.widgetInfo);
|
|
178
|
+
//this.dashboardService.copyWidget(widgetInfo);
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* @param {?} widgetInfo
|
|
182
|
+
* @return {?}
|
|
183
|
+
*/
|
|
184
|
+
RAWidgetContainer.prototype.configChangeEventHandler = /**
|
|
185
|
+
* @param {?} widgetInfo
|
|
186
|
+
* @return {?}
|
|
187
|
+
*/
|
|
188
|
+
function (widgetInfo) {
|
|
189
|
+
this.data.widgetInfo = widgetInfo;
|
|
190
|
+
this.refreshWidget(this.data.widgetInfo);
|
|
191
|
+
// this.updateWidget(widgetInfo);
|
|
192
|
+
};
|
|
193
|
+
/** To load external custom element to the widget container*/
|
|
194
|
+
/**
|
|
195
|
+
* To load external custom element to the widget container
|
|
196
|
+
* @param {?} widgetInfo
|
|
197
|
+
* @return {?}
|
|
198
|
+
*/
|
|
199
|
+
RAWidgetContainer.prototype.loadWidget = /**
|
|
200
|
+
* To load external custom element to the widget container
|
|
201
|
+
* @param {?} widgetInfo
|
|
202
|
+
* @return {?}
|
|
203
|
+
*/
|
|
204
|
+
function (widgetInfo) {
|
|
205
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
206
|
+
var widgetConfigFilter, widgetContainer;
|
|
207
|
+
var _this = this;
|
|
208
|
+
return tslib_1.__generator(this, function (_a) {
|
|
209
|
+
widgetConfigFilter = (/** @type {?} */ ({
|
|
210
|
+
config: widgetInfo.widgetConfigInfo.config,
|
|
211
|
+
globalFilter: this.globalFilter
|
|
212
|
+
}));
|
|
213
|
+
widgetContainer = this;
|
|
214
|
+
this.dashboardService.loadExternalScript(widgetInfo.scriptUrl, (/**
|
|
215
|
+
* @return {?}
|
|
216
|
+
*/
|
|
217
|
+
function () {
|
|
218
|
+
_this.translateService.loadTranslations(_this.appConfig.appManagementBaseUrl, _this.data.widgetInfo.widgetName, false).then((/**
|
|
219
|
+
* @return {?}
|
|
220
|
+
*/
|
|
221
|
+
function () {
|
|
222
|
+
widgetContainer.widgetElement = document.createElement(widgetInfo.customTag);
|
|
223
|
+
widgetContainer.widgetElement.setAttribute("widget-instance-id", widgetInfo.widgetInstanceId);
|
|
224
|
+
document.body.addEventListener('widgetinitiated' + widgetInfo.widgetInstanceId, (/**
|
|
225
|
+
* @return {?}
|
|
226
|
+
*/
|
|
227
|
+
function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
228
|
+
var _this = this;
|
|
229
|
+
return tslib_1.__generator(this, function (_a) {
|
|
230
|
+
setTimeout((/**
|
|
231
|
+
* @return {?}
|
|
232
|
+
*/
|
|
233
|
+
function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
234
|
+
var _this = this;
|
|
235
|
+
return tslib_1.__generator(this, function (_a) {
|
|
236
|
+
switch (_a.label) {
|
|
237
|
+
case 0:
|
|
238
|
+
this.widgetElement.addEventListener('on-data-load', (/**
|
|
239
|
+
* @param {?} e
|
|
240
|
+
* @return {?}
|
|
241
|
+
*/
|
|
242
|
+
function (e) {
|
|
243
|
+
if (e.detail)
|
|
244
|
+
_this.showPanel = true;
|
|
245
|
+
else
|
|
246
|
+
_this.showPanel = false;
|
|
247
|
+
}));
|
|
248
|
+
widgetContainer.isWidgetLoaded = true;
|
|
249
|
+
widgetConfigFilter.appConfig = this.appConfig;
|
|
250
|
+
widgetConfigFilter.widgetInfo = widgetInfo;
|
|
251
|
+
// widgetConfigFilter.widgetInfo = <IWidgetInfo>{};
|
|
252
|
+
widgetConfigFilter.widgetInfo.widgetName = widgetInfo.widgetName;
|
|
253
|
+
widgetContainer.widgetElement.loadContent(widgetConfigFilter);
|
|
254
|
+
return [4 /*yield*/, widgetContainer.setLock(widgetConfigFilter.config)];
|
|
255
|
+
case 1:
|
|
256
|
+
_a.sent();
|
|
257
|
+
return [4 /*yield*/, widgetContainer.setDownloadIcon()];
|
|
258
|
+
case 2:
|
|
259
|
+
_a.sent();
|
|
260
|
+
return [2 /*return*/];
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
}); }));
|
|
264
|
+
return [2 /*return*/];
|
|
265
|
+
});
|
|
266
|
+
}); }));
|
|
267
|
+
_this.ctlWidget.nativeElement.appendChild(_this.widgetElement);
|
|
268
|
+
}));
|
|
269
|
+
}));
|
|
270
|
+
return [2 /*return*/];
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
};
|
|
274
|
+
/** To refresh widget on input config changes */
|
|
275
|
+
/**
|
|
276
|
+
* To refresh widget on input config changes
|
|
277
|
+
* @param {?} widgetInfo
|
|
278
|
+
* @return {?}
|
|
279
|
+
*/
|
|
280
|
+
RAWidgetContainer.prototype.refreshWidget = /**
|
|
281
|
+
* To refresh widget on input config changes
|
|
282
|
+
* @param {?} widgetInfo
|
|
283
|
+
* @return {?}
|
|
284
|
+
*/
|
|
285
|
+
function (widgetInfo) {
|
|
286
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
287
|
+
var widgetContainerContext, widgetConfigFilter;
|
|
288
|
+
return tslib_1.__generator(this, function (_a) {
|
|
289
|
+
switch (_a.label) {
|
|
290
|
+
case 0:
|
|
291
|
+
widgetContainerContext = this;
|
|
292
|
+
widgetConfigFilter = (/** @type {?} */ ({
|
|
293
|
+
config: widgetInfo.widgetConfigInfo.config,
|
|
294
|
+
globalFilter: this.globalFilter,
|
|
295
|
+
appConfig: this.appConfig,
|
|
296
|
+
widgetInfo: widgetInfo
|
|
297
|
+
}));
|
|
298
|
+
if (!widgetContainerContext.isWidgetLoaded) return [3 /*break*/, 3];
|
|
299
|
+
widgetContainerContext.widgetElement.loadContent(widgetConfigFilter);
|
|
300
|
+
return [4 /*yield*/, this.setLock(widgetConfigFilter.config)];
|
|
301
|
+
case 1:
|
|
302
|
+
_a.sent();
|
|
303
|
+
return [4 /*yield*/, this.setDownloadIcon()];
|
|
304
|
+
case 2:
|
|
305
|
+
_a.sent();
|
|
306
|
+
_a.label = 3;
|
|
307
|
+
case 3: return [2 /*return*/];
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
};
|
|
312
|
+
/**
|
|
313
|
+
* @private
|
|
314
|
+
* @param {?} config
|
|
315
|
+
* @return {?}
|
|
316
|
+
*/
|
|
317
|
+
RAWidgetContainer.prototype.setLock = /**
|
|
318
|
+
* @private
|
|
319
|
+
* @param {?} config
|
|
320
|
+
* @return {?}
|
|
321
|
+
*/
|
|
322
|
+
function (config) {
|
|
323
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
324
|
+
var _a;
|
|
325
|
+
return tslib_1.__generator(this, function (_b) {
|
|
326
|
+
switch (_b.label) {
|
|
327
|
+
case 0:
|
|
328
|
+
debugger;
|
|
329
|
+
_a = this;
|
|
330
|
+
return [4 /*yield*/, this.widgetElement.loadLockStatus(config)];
|
|
331
|
+
case 1:
|
|
332
|
+
_a.lockStatus = _b.sent();
|
|
333
|
+
if (this.lockStatus == 'lock') {
|
|
334
|
+
this.lockTitle = 'Locked';
|
|
335
|
+
console.log(this.lockTitle);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
this.lockTitle = 'Partially Locked';
|
|
339
|
+
}
|
|
340
|
+
if (this.lockStatus) {
|
|
341
|
+
switch (this.lockStatus) {
|
|
342
|
+
case "lock": {
|
|
343
|
+
this.lockClass = "fas fa-lock locked";
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
case "unlock": {
|
|
347
|
+
this.lockClass = "unlocked";
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
case "partiallock": {
|
|
351
|
+
this.lockClass = "fas fa-lock partiallocked";
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
default: {
|
|
355
|
+
this.lockClass = "unlocked";
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
return [2 /*return*/];
|
|
361
|
+
}
|
|
362
|
+
});
|
|
363
|
+
});
|
|
364
|
+
};
|
|
365
|
+
/**
|
|
366
|
+
* @return {?}
|
|
367
|
+
*/
|
|
368
|
+
RAWidgetContainer.prototype.setDownloadIcon = /**
|
|
369
|
+
* @return {?}
|
|
370
|
+
*/
|
|
371
|
+
function () {
|
|
372
|
+
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
373
|
+
var downloadType;
|
|
374
|
+
return tslib_1.__generator(this, function (_a) {
|
|
375
|
+
switch (_a.label) {
|
|
376
|
+
case 0: return [4 /*yield*/, this.widgetElement.getDownloadType()];
|
|
377
|
+
case 1:
|
|
378
|
+
downloadType = _a.sent();
|
|
379
|
+
this.downloadIconType = downloadType;
|
|
380
|
+
if (downloadType != RADownloadType.None) {
|
|
381
|
+
this.isDownloadIconVisible = true;
|
|
382
|
+
}
|
|
383
|
+
return [2 /*return*/];
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
};
|
|
388
|
+
/**
|
|
389
|
+
* @return {?}
|
|
390
|
+
*/
|
|
391
|
+
RAWidgetContainer.prototype.downloadClicked = /**
|
|
392
|
+
* @return {?}
|
|
393
|
+
*/
|
|
394
|
+
function () {
|
|
395
|
+
switch (this.downloadIconType) {
|
|
396
|
+
case RADownloadType.Grid:
|
|
397
|
+
this.downloadIconClicked('CSV');
|
|
398
|
+
break;
|
|
399
|
+
case RADownloadType.Chart:
|
|
400
|
+
this.isDownloadChartVisible = true;
|
|
401
|
+
break;
|
|
402
|
+
case RADownloadType.Custom:
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
};
|
|
406
|
+
/**
|
|
407
|
+
* @param {?} type
|
|
408
|
+
* @return {?}
|
|
409
|
+
*/
|
|
410
|
+
RAWidgetContainer.prototype.downloadIconClicked = /**
|
|
411
|
+
* @param {?} type
|
|
412
|
+
* @return {?}
|
|
413
|
+
*/
|
|
414
|
+
function (type) {
|
|
415
|
+
switch (type) {
|
|
416
|
+
case "CSV":
|
|
417
|
+
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.CSV);
|
|
418
|
+
break;
|
|
419
|
+
case "PNG":
|
|
420
|
+
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.PNG);
|
|
421
|
+
break;
|
|
422
|
+
case "PDF":
|
|
423
|
+
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.PDF);
|
|
424
|
+
break;
|
|
425
|
+
case "SVG":
|
|
426
|
+
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.SVG);
|
|
427
|
+
break;
|
|
428
|
+
case "JPEG":
|
|
429
|
+
this.widgetElement.downloadClicked(this.downloadIconType, RADownloadOption.JPEG);
|
|
430
|
+
break;
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
/**Show dropdown on gear icon click */
|
|
434
|
+
/**
|
|
435
|
+
* Show dropdown on gear icon click
|
|
436
|
+
* @return {?}
|
|
437
|
+
*/
|
|
438
|
+
RAWidgetContainer.prototype.showDropDown = /**
|
|
439
|
+
* Show dropdown on gear icon click
|
|
440
|
+
* @return {?}
|
|
441
|
+
*/
|
|
442
|
+
function () {
|
|
443
|
+
this.dropDownShown = !this.dropDownShown;
|
|
444
|
+
};
|
|
445
|
+
/**Hide dropdown on outside click */
|
|
446
|
+
/**
|
|
447
|
+
* Hide dropdown on outside click
|
|
448
|
+
* @return {?}
|
|
449
|
+
*/
|
|
450
|
+
RAWidgetContainer.prototype.hideDropDown = /**
|
|
451
|
+
* Hide dropdown on outside click
|
|
452
|
+
* @return {?}
|
|
453
|
+
*/
|
|
454
|
+
function () {
|
|
455
|
+
if (this.dropDownShown) {
|
|
456
|
+
this.dropDownShown = false;
|
|
457
|
+
}
|
|
458
|
+
this.isDownloadChartVisible = false;
|
|
459
|
+
};
|
|
460
|
+
RAWidgetContainer.decorators = [
|
|
461
|
+
{ type: Component, args: [{
|
|
462
|
+
selector: 'ra-widget-container',
|
|
463
|
+
template: "<div class=\"wc-wrapper\" (mouseleave)=\"hideDropDown()\">\n <div class=\"wcheader widget-move\">\n <div class=\"col-md-12 wc-mover\" style=\"padding-left: 0px;height:inherit;\">\n <div style=\"display:flex;margin-top:10px;\">\n <div class=\"col-md-11 float-left\" style=\"width:96%;padding-left: 0px\">{{data.widgetInfo.widgetTitle}}\n </div>\n <div class=\"col-md-1\" style=\"cursor:default;padding-right: 0px;\">\n <div class=\"float-right\" style=\"display: flex;\">\n <div class=\"title-bar-icon download download-icon\" *ngIf=\"isDownloadIconVisible\">\n <i class=\"fas fa-download\" (mouseover)=\"setDownloadIcon()\" #widgetDownload\n (click)=\"downloadClicked()\"></i>\n <div class=\"download-content\" [ngClass]=\"{'dropdown-click': isDownloadChartVisible}\">\n <a (click)=\"downloadIconClicked('PNG')\">\n <i class=\"fal fa-file-image\"></i>\n <span>{{'PNG'|translate}}</span>\n </a>\n <a (click)=\"downloadIconClicked('JPEG')\">\n <i class=\"fal fa-file\"></i>\n <span>{{'JPEG'|translate}}</span>\n </a>\n <a (click)=\"downloadIconClicked('PDF')\">\n <i class=\"fal fa-file-pdf\"></i>\n <span>{{'PDF'|translate}}</span>\n </a>\n <a (click)=\"downloadIconClicked('SVG')\">\n <i class=\"fal fa-file-alt\"></i>\n <span>{{'SVG'|translate}}</span>\n </a>\n </div>\n </div>\n <div class=\"dropdown\">\n <div class=\"dropbtn title-bar-icon\"> <i #widgetDropdown class=\"fas fa-cog\" (click)=\"showDropDown()\"></i>\n </div>\n <div class=\"dropdown-content widget-config-item\" [ngClass]=\"{'dropdown-click': dropDownShown}\">\n <a (click)=\"editWidget()\">\n <i class=\"fal fa-edit\"></i>\n <span>{{'Edit'|translate}}</span>\n </a>\n <a (click)=\"copyWidget()\">\n <i class=\"fal fa-copy\"></i>\n <span>{{'Copy'|translate}}</span>\n </a>\n <a (click)=\"moveWidget()\">\n <i class=\"fal fa-arrows-alt\"></i>\n <span>{{'Move'|translate}}</span>\n </a>\n <hr class=\"hr\">\n <a (click)=\"deleteWidget()\">\n <i class=\"fal fa-times\" style=\"padding-left: 3px;\"></i>\n <span>{{'Delete'|translate}}</span>\n </a>\n </div>\n </div>\n <ra-tooltip [value]=\"lockTitle\" [width]=\"'300px'\">\n <div class=\"title-bar-lock-icon\">\n \n <i [ngClass]=\"lockClass\" ></i>\n \n <!-- <i [ngClass]=\"lockClass\"\n [attr.title]=\"lockStatus=='lock' ? 'Locked' : 'Partially Locked'\"></i> -->\n </div>\n </ra-tooltip>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"wcBody\">\n <div class=\"m-fadeOut widget-overlay\" [ngClass]=\"{'m-fadeIn': showPanel}\">\n <div class=\"lds-roller\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n </div>\n <perfect-scrollbar [scrollIndicators]=\"true\">\n <div #ctlWidget></div>\n </perfect-scrollbar>\n </div>\n</div>",
|
|
464
|
+
styles: [".wcheader{width:100%;height:24px;background:#fff;color:#3dcd58;font-family:\"Arial Rounded MT\";font-size:16px;position:absolute;left:0;top:0}.wc-wrapper{height:100%;position:relative;margin:auto 15px}.wc-mover{cursor:all-scroll}.wcBody{width:100%;position:absolute;top:46px;left:0;bottom:15px}.wcBodyBorder{border:1px dashed #e6e2e2}.sp_icon{float:left;margin:0 15% 0 0}.dropbtn{cursor:pointer;color:#42b4e6}.dropdown{visibility:hidden;opacity:0;-webkit-transition:visibility,opacity .5s linear;transition:visibility,opacity .5s linear;position:relative}.dropdown hr{margin:0!important}.dropdown-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:100px;box-shadow:0 8px 16px 8px rgba(0,0,0,.2);z-index:2;font-size:12px;font-weight:400}.dropdown-content a{color:#000;padding:5px 16px;text-decoration:none;display:block;cursor:pointer}.dropdown-content a:hover{background-color:#f1f1f1}.dropdown-click{display:block!important;-webkit-animation:.3s ease-out slide-down;animation:.3s ease-out slide-down}.download-icon{cursor:pointer}.dropdown:hover .dropdown-content{color:#fff}.wc-wrapper:hover .dropdown{visibility:visible;opacity:1}.title-bar-icon{margin:0 3px;color:#42b4e6}.title-bar-lock-icon{margin:0 3px}.hr{border:0;border-top:1px solid rgba(0,0,0,.1)}@keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%);transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes slide-down{0%{opacity:0;-webkit-transform:translateY(-20%)}100%{opacity:1;-webkit-transform:translateY(0)}}.widget-config-item i{font-size:17px;color:#42b4e6}.widget-config-item span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}.locked{color:#42b4e6}.partiallocked{color:#a0d9f2}.unlocked{display:none}.download{visibility:hidden;opacity:0;-webkit-transition:visibility,opacity .5s linear;transition:visibility,opacity .5s linear;position:relative}.wc-wrapper:hover .download{visibility:visible;opacity:1}.download-content{display:none;position:absolute;right:0;background-color:#f9f9f9;min-width:100px;box-shadow:0 8px 16px 8px rgba(0,0,0,.2);z-index:2;font-size:12px;font-weight:400}.download-content a{color:#000;padding:5px 16px;text-decoration:none;display:block;cursor:pointer}.download-content a:hover{background-color:#f1f1f1}.download-content a i{font-size:17px;color:#42b4e6}.download-content a span{font-size:12px;font:inherit;padding-left:12px;color:#42b4e6}"]
|
|
465
|
+
}] }
|
|
466
|
+
];
|
|
467
|
+
/** @nocollapse */
|
|
468
|
+
RAWidgetContainer.ctorParameters = function () { return [
|
|
469
|
+
{ type: RaDashboardService },
|
|
470
|
+
{ type: NgxUiLoaderService },
|
|
471
|
+
{ type: RATranslateService },
|
|
472
|
+
{ type: NgZone },
|
|
473
|
+
{ type: NotifierService },
|
|
474
|
+
{ type: Renderer2 }
|
|
475
|
+
]; };
|
|
476
|
+
RAWidgetContainer.propDecorators = {
|
|
477
|
+
ctlWidget: [{ type: ViewChild, args: ['ctlWidget', { static: false },] }],
|
|
478
|
+
widgetDropdown: [{ type: ViewChild, args: ['widgetDropdown', { static: false },] }],
|
|
479
|
+
widgetDownload: [{ type: ViewChild, args: ['widgetDownload', { static: false },] }],
|
|
480
|
+
widgetInstanceId: [{ type: Input, args: ['widget-instance-id',] }],
|
|
481
|
+
globalFilter: [{ type: Input, args: ['global-filter',] }],
|
|
482
|
+
data: [{ type: Input, args: ['data',] }],
|
|
483
|
+
raDashboardEventBus: [{ type: Input, args: ['event-bus',] }],
|
|
484
|
+
appConfig: [{ type: Input, args: ['app-config',] }],
|
|
485
|
+
width: [{ type: Input, args: ['widget-width',] }],
|
|
486
|
+
height: [{ type: Input, args: ['widget-height',] }],
|
|
487
|
+
widgetDeleted: [{ type: Output }]
|
|
488
|
+
};
|
|
489
|
+
return RAWidgetContainer;
|
|
490
|
+
}());
|
|
491
|
+
export { RAWidgetContainer };
|
|
492
|
+
if (false) {
|
|
493
|
+
/** @type {?} */
|
|
494
|
+
RAWidgetContainer.prototype.showPanel;
|
|
495
|
+
/**
|
|
496
|
+
* @type {?}
|
|
497
|
+
* @private
|
|
498
|
+
*/
|
|
499
|
+
RAWidgetContainer.prototype.isWidgetLoaded;
|
|
500
|
+
/**
|
|
501
|
+
* @type {?}
|
|
502
|
+
* @private
|
|
503
|
+
*/
|
|
504
|
+
RAWidgetContainer.prototype.widgetElement;
|
|
505
|
+
/**
|
|
506
|
+
* @type {?}
|
|
507
|
+
* @private
|
|
508
|
+
*/
|
|
509
|
+
RAWidgetContainer.prototype.configChanged;
|
|
510
|
+
/**
|
|
511
|
+
* @type {?}
|
|
512
|
+
* @private
|
|
513
|
+
*/
|
|
514
|
+
RAWidgetContainer.prototype.isIEOrEdge;
|
|
515
|
+
/** @type {?} */
|
|
516
|
+
RAWidgetContainer.prototype.widgetHeight;
|
|
517
|
+
/** @type {?} */
|
|
518
|
+
RAWidgetContainer.prototype.lockClass;
|
|
519
|
+
/** @type {?} */
|
|
520
|
+
RAWidgetContainer.prototype.lockStatus;
|
|
521
|
+
/** @type {?} */
|
|
522
|
+
RAWidgetContainer.prototype.isDownloadIconVisible;
|
|
523
|
+
/** @type {?} */
|
|
524
|
+
RAWidgetContainer.prototype.dropDownShown;
|
|
525
|
+
/** @type {?} */
|
|
526
|
+
RAWidgetContainer.prototype.isDownloadChartVisible;
|
|
527
|
+
/** @type {?} */
|
|
528
|
+
RAWidgetContainer.prototype.downloadIconType;
|
|
529
|
+
/** @type {?} */
|
|
530
|
+
RAWidgetContainer.prototype.ctlWidget;
|
|
531
|
+
/** @type {?} */
|
|
532
|
+
RAWidgetContainer.prototype.widgetDropdown;
|
|
533
|
+
/** @type {?} */
|
|
534
|
+
RAWidgetContainer.prototype.widgetDownload;
|
|
535
|
+
/** @type {?} */
|
|
536
|
+
RAWidgetContainer.prototype.widgetInstanceId;
|
|
537
|
+
/** @type {?} */
|
|
538
|
+
RAWidgetContainer.prototype.globalFilter;
|
|
539
|
+
/** @type {?} */
|
|
540
|
+
RAWidgetContainer.prototype.data;
|
|
541
|
+
/** @type {?} */
|
|
542
|
+
RAWidgetContainer.prototype.raDashboardEventBus;
|
|
543
|
+
/** @type {?} */
|
|
544
|
+
RAWidgetContainer.prototype.appConfig;
|
|
545
|
+
/** @type {?} */
|
|
546
|
+
RAWidgetContainer.prototype.width;
|
|
547
|
+
/** @type {?} */
|
|
548
|
+
RAWidgetContainer.prototype.height;
|
|
549
|
+
/** @type {?} */
|
|
550
|
+
RAWidgetContainer.prototype.widgetDeleted;
|
|
551
|
+
/** @type {?} */
|
|
552
|
+
RAWidgetContainer.prototype.lockTitle;
|
|
553
|
+
/**
|
|
554
|
+
* @type {?}
|
|
555
|
+
* @private
|
|
556
|
+
*/
|
|
557
|
+
RAWidgetContainer.prototype.dashboardService;
|
|
558
|
+
/**
|
|
559
|
+
* @type {?}
|
|
560
|
+
* @private
|
|
561
|
+
*/
|
|
562
|
+
RAWidgetContainer.prototype.ngxService;
|
|
563
|
+
/**
|
|
564
|
+
* @type {?}
|
|
565
|
+
* @private
|
|
566
|
+
*/
|
|
567
|
+
RAWidgetContainer.prototype.translateService;
|
|
568
|
+
/**
|
|
569
|
+
* @type {?}
|
|
570
|
+
* @private
|
|
571
|
+
*/
|
|
572
|
+
RAWidgetContainer.prototype.ngZone;
|
|
573
|
+
/**
|
|
574
|
+
* @type {?}
|
|
575
|
+
* @private
|
|
576
|
+
*/
|
|
577
|
+
RAWidgetContainer.prototype.notifier;
|
|
578
|
+
/**
|
|
579
|
+
* @type {?}
|
|
580
|
+
* @private
|
|
581
|
+
*/
|
|
582
|
+
RAWidgetContainer.prototype.renderer;
|
|
583
|
+
}
|
|
584
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmEud2lkZ2V0LmNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2NobmVpZGVyZXNzL2Rhc2hib2FyZGZyYW1ld29yay8iLCJzb3VyY2VzIjpbImxpYi9yYS13aWRnZXQtY29udGFpbmVyL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFvRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNMLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFnRCxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRzdEO0lBcUNFLDJCQUFvQixnQkFBb0MsRUFDOUMsVUFBOEIsRUFDOUIsZ0JBQW9DLEVBQ3BDLE1BQWMsRUFDZCxRQUF5QixFQUN6QixRQUFtQjtRQUw3QixpQkFvQkM7UUFwQm1CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBb0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBb0I7UUFDOUIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFvQjtRQUNwQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsYUFB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c0NBQXlCOzs7OztJQUdiLDZDQUE0Qzs7Ozs7SUFDdEQsdUNBQXNDOzs7OztJQUN0Qyw2Q0FBNEM7Ozs7O0lBQzVDLG1DQUFzQjs7Ozs7SUFDdEIscUNBQWlDOzs7OztJQUNqQyxxQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgU2ltcGxlQ2hhbmdlLCBPbkRlc3Ryb3ksIE5nWm9uZSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSYURhc2hib2FyZFNlcnZpY2UgfSBmcm9tICcuLy4uL3JhLmRhc2hib2FyZC5zZXJ2aWNlJztcbmltcG9ydCB7IFJBRGFzaGJvYXJkRXZlbnRCdXMgfSBmcm9tICcuLi9yYS5kYXNoYmFyZC5ldmVudC5idXMnO1xuaW1wb3J0IHsgUkFFdmVudCwgUkFFdmVudEtleSB9IGZyb20gJy4uL3JhLmV2ZW50LmVudW0nO1xuaW1wb3J0IHsgSUFwcENvbmZpZywgSVdpZGdldENvbmZpZ0ZpbHRlciwgSVdpZGdldEluZm8sIFJBRG93bmxvYWRUeXBlLCBSQURvd25sb2FkT3B0aW9uIH0gZnJvbSAnQHNjaG5laWRlcmVzcy93aWRnZXRmcmFtZXdvcmsnO1xuaW1wb3J0IHsgTmd4VWlMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnbmd4LXVpLWxvYWRlcic7XG5pbXBvcnQgeyBOb3RpZmllclNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW5vdGlmaWVyJztcblxuaW1wb3J0IHsgUkFUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQHNjaG5laWRlcmVzcy9yYS1jb21tb24nO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JhLXdpZGdldC1jb250YWluZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcmEud2lkZ2V0LmNvbnRhaW5lci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JhLndpZGdldC5jb250YWluZXIuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIFJBV2lkZ2V0Q29udGFpbmVyIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBzaG93UGFuZWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1dpZGdldExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIHdpZGdldEVsZW1lbnQ6IGFueTtcbiAgcHJpdmF0ZSBjb25maWdDaGFuZ2VkOiBhbnk7XG4gIHByaXZhdGUgaXNJRU9yRWRnZSA9IC9tc2llXFxzfHRyaWRlbnRcXC98ZWRnZVxcLy9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpO1xuICBwdWJsaWMgd2lkZ2V0SGVpZ2h0OiBudW1iZXI7XG4gIHB1YmxpYyBsb2NrQ2xhc3M6IHN0cmluZyA9IFwidW5sb2NrZWRcIjtcbiAgcHVibGljIGxvY2tTdGF0dXM6IHN0cmluZyA9IFwidW5sb2NrXCI7XG4gIHB1YmxpYyBpc0Rvd25sb2FkSWNvblZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGRyb3BEb3duU2hvd246IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGlzRG93bmxvYWRDaGFydFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGRvd25sb2FkSWNvblR5cGU6IFJBRG93bmxvYWRUeXBlO1xuXG4gIEBWaWV3Q2hpbGQoJ2N0bFdpZGdldCcsIHsgc3RhdGljOiBmYWxzZSB9KSBjdGxXaWRnZXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3dpZGdldERyb3Bkb3duJywgeyBzdGF0aWM6IGZhbHNlIH0pIHdpZGdldERyb3Bkb3duOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd3aWRnZXREb3dubG9hZCcsIHsgc3RhdGljOiBmYWxzZSB9KSB3aWRnZXREb3dubG9hZDogRWxlbWVudFJlZjtcblxuXG4gIEBJbnB1dCgnd2lkZ2V0LWluc3RhbmNlLWlkJykgd2lkZ2V0SW5zdGFuY2VJZDogbnVtYmVyO1xuICBASW5wdXQoJ2dsb2JhbC1maWx0ZXInKSBnbG9iYWxGaWx0ZXI6IGFueTtcbiAgQElucHV0KCdkYXRhJykgZGF0YTogYW55O1xuICBASW5wdXQoJ2V2ZW50LWJ1cycpIHJhRGFzaGJvYXJkRXZlbnRCdXM6IFJBRGFzaGJvYXJkRXZlbnRCdXM7XG4gIEBJbnB1dCgnYXBwLWNvbmZpZycpIGFwcENvbmZpZzogSUFwcENvbmZpZztcbiAgQElucHV0KCd3aWRnZXQtd2lkdGgnKSB3aWR0aDogbnVtYmVyO1xuICBASW5wdXQoJ3dpZGdldC1oZWlnaHQnKSBoZWlnaHQ6IG51bWJlcjtcblxuICBAT3V0cHV0KCkgd2lkZ2V0RGVsZXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBwdWJsaWMgbG9ja1RpdGxlOiBzdHJpbmc7XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhc2hib2FyZFNlcnZpY2U6IFJhRGFzaGJvYXJkU2VydmljZSxcbiAgICBwcml2YXRlIG5neFNlcnZpY2U6IE5neFVpTG9hZGVyU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFJBVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgbm90aWZpZXI6IE5vdGlmaWVyU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcblxuICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKCd3aW5kb3cnLCAnY2xpY2snLCAoZTogRXZlbnQpID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdGhpcy53aWRnZXREcm9wZG93bi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZHJvcERvd25TaG93biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5yZW5kZXJlci5saXN0ZW4oJ3dpbmRvdycsICdjbGljaycsIChlOiBFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMud2lkZ2V0RG93bmxvYWQgJiYgZS50YXJnZXQgIT09IHRoaXMud2lkZ2V0RG93bmxvYWQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLmlzRG93bmxvYWRDaGFydFZpc2libGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cyAmJiBjaGFuZ2VzLnJhRGFzaGJvYXJkRXZlbnRCdXMuY3VycmVudFZhbHVlICE9IGNoYW5nZXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLmNvbmZpZ0NoYW5nZWQgPSB0aGlzLnJhRGFzaGJvYXJkRXZlbnRCdXMuc3Vic2NyaWJlV2l0aEtleShSQUV2ZW50LkNvbmZpZ0NoYW5nZWQsIFJBRXZlbnRLZXkuV2lkZ2V0SW5zdGFuY2VJZCwgdGhpcy5kYXRhLndpZGdldEluZm8ud2lkZ2V0SW5zdGFuY2VJZC50b1N0cmluZygpKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbmZpZ0NoYW5nZUV2ZW50SGFuZGxlcihlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy53aWRnZXRFbGVtZW50ICYmIGNoYW5nZXMuZ2xvYmFsRmlsdGVyICYmIGNoYW5nZXMuZ2xvYmFsRmlsdGVyLmN1cnJlbnRWYWx1ZSAhPSBjaGFuZ2VzLmdsb2JhbEZpbHRlci5wcmV2aW91c1ZhbHVlKSB7XG5cbiAgICAgIHRoaXMucmVmcmVzaFdpZGdldCh0aGlzLmRhdGEud2lkZ2V0SW5mbyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMud2lkdGggJiYgY2hhbmdlcy53aWR0aC5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy53aWR0aC5wcmV2aW91c1ZhbHVlIHx8XG4gICAgICAoY2hhbmdlcy5oZWlnaHQgJiYgY2hhbmdlcy5oZWlnaHQuY3VycmVudFZhbHVlICE9IGNoYW5nZXMuaGVpZ2h0LnByZXZpb3VzVmFsdWUpKSB7XG4gICAgICBpZiAodGhpcy53aWRnZXRFbGVtZW50KSB7XG4gICAgICAgIGxldCBzaXplOiBhbnkgPSB7fTtcbiAgICAgICAgc2l6ZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICAgICAgc2l6ZS53aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC53aWRnZXRSZXNpemVkKHNpemUpO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbmZpZ0NoYW5nZWQpXG4gICAgICB0aGlzLmNvbmZpZ0NoYW5nZWQudW5zdWJzY3JpYmUoKTtcbiAgfVxuXG5cbiAgLyoqIFRvIEVkaXQgY3VycmVudCB3aWRnZXQgY29uZmlndXJhdGlvbiovXG4gIHB1YmxpYyBlZGl0V2lkZ2V0KCkge1xuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuV2lkZ2V0RWRpdENsaWNrZWQsIHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcbiAgfVxuXG4gIC8qKiBUbyBEZWxldGUgY3VycmVudCB3aWRnZXQgZnJvbSBET00qL1xuICBwdWJsaWMgZGVsZXRlV2lkZ2V0KCkge1xuICAgIGxldCB3aWRnZXRDb250YWluZXJDb250ZXh0ID0gdGhpcztcbiAgICB3aWRnZXRDb250YWluZXJDb250ZXh0Lm5neFNlcnZpY2Uuc3RhcnQoKTtcbiAgICB3aWRnZXRDb250YWluZXJDb250ZXh0LmRhc2hib2FyZFNlcnZpY2UuZGVsZXRlV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvLCB0aGlzLmFwcENvbmZpZykuc3Vic2NyaWJlKHN0YXR1cyA9PiB7XG4gICAgICB3aWRnZXRDb250YWluZXJDb250ZXh0Lm5neFNlcnZpY2Uuc3RvcCgpO1xuICAgICAgaWYgKHN0YXR1cykge1xuICAgICAgICB3aWRnZXRDb250YWluZXJDb250ZXh0LndpZGdldERlbGV0ZWQuZW1pdCh0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXRJbnN0YW5jZUlkKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB3aWRnZXRDb250YWluZXJDb250ZXh0Lm5vdGlmaWVyLm5vdGlmeSgnZXJyb3InLCBcIiBcIiArIHRoaXMudHJhbnNsYXRlU2VydmljZS50cmFuc2xhdGUoJ0ZhaWxlZFRvUmVtb3ZlV2lkZ2V0JykgKyBcIiAgKFwiICsgdGhpcy5kYXRhLndpZGdldEluZm8ud2lkZ2V0VGl0bGUgKyBcIikhXCIpO1xuXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogVG8gTW92ZSBvciBjaGFuZ2UgcG9zaXRpb24gaWYgY3VycmVudCB3aWRnZXQgY29udGFpbmVyKi9cbiAgcHVibGljIG1vdmVXaWRnZXQoKSB7XG4gICAgdGhpcy5yYURhc2hib2FyZEV2ZW50QnVzLnB1Ymxpc2goUkFFdmVudC5Nb3ZlV2lkZ2V0LCB0aGlzLmRhdGEud2lkZ2V0SW5mbyk7XG4gICAgLy8gdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLm1vdmVXaWRnZXQod2lkZ2V0SW5mbyk7XG4gIH1cblxuICAvKiogVG8gQ29weSBDdXJyZW50IHdpZGdldCB3aXRoIHNhbWUgY29uZmlndXJhdGlvbiovXG4gIHB1YmxpYyBjb3B5V2lkZ2V0KCkge1xuICAgIHRoaXMucmFEYXNoYm9hcmRFdmVudEJ1cy5wdWJsaXNoKFJBRXZlbnQuQ29weVdpZGdldCwgdGhpcy5kYXRhLndpZGdldEluZm8pO1xuICAgIC8vdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmNvcHlXaWRnZXQod2lkZ2V0SW5mbyk7XG4gIH1cblxuICBwdWJsaWMgY29uZmlnQ2hhbmdlRXZlbnRIYW5kbGVyKHdpZGdldEluZm8pIHtcbiAgICB0aGlzLmRhdGEud2lkZ2V0SW5mbyA9IHdpZGdldEluZm87XG4gICAgdGhpcy5yZWZyZXNoV2lkZ2V0KHRoaXMuZGF0YS53aWRnZXRJbmZvKTtcbiAgICAvLyB0aGlzLnVwZGF0ZVdpZGdldCh3aWRnZXRJbmZvKTtcbiAgfVxuXG5cbiAgLyoqICBUbyBsb2FkIGV4dGVybmFsIGN1c3RvbSBlbGVtZW50IHRvIHRoZSB3aWRnZXQgY29udGFpbmVyKi9cbiAgYXN5bmMgbG9hZFdpZGdldCh3aWRnZXRJbmZvOiBhbnkpIHtcbiAgICBsZXQgd2lkZ2V0Q29uZmlnRmlsdGVyID0gPElXaWRnZXRDb25maWdGaWx0ZXI+e1xuICAgICAgY29uZmlnOiB3aWRnZXRJbmZvLndpZGdldENvbmZpZ0luZm8uY29uZmlnLFxuICAgICAgZ2xvYmFsRmlsdGVyOiB0aGlzLmdsb2JhbEZpbHRlclxuICAgIH1cblxuICAgIGxldCB3aWRnZXRDb250YWluZXIgPSB0aGlzO1xuICAgIHRoaXMuZGFzaGJvYXJkU2VydmljZS5sb2FkRXh0ZXJuYWxTY3JpcHQod2lkZ2V0SW5mby5zY3JpcHRVcmwsICgpID0+IHtcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5sb2FkVHJhbnNsYXRpb25zKHRoaXMuYXBwQ29uZmlnLmFwcE1hbmFnZW1lbnRCYXNlVXJsLCB0aGlzLmRhdGEud2lkZ2V0SW5mby53aWRnZXROYW1lLCBmYWxzZSkudGhlbigoKSA9PiB7XG4gICAgICAgIHdpZGdldENvbnRhaW5lci53aWRnZXRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh3aWRnZXRJbmZvLmN1c3RvbVRhZyk7XG4gICAgICAgIHdpZGdldENvbnRhaW5lci53aWRnZXRFbGVtZW50LnNldEF0dHJpYnV0ZShcIndpZGdldC1pbnN0YW5jZS1pZFwiLCB3aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ3dpZGdldGluaXRpYXRlZCcgKyB3aWRnZXRJbmZvLndpZGdldEluc3RhbmNlSWQsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdvbi1kYXRhLWxvYWQnLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlLmRldGFpbClcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQYW5lbCA9IHRydWU7XG4gICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQYW5lbCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB3aWRnZXRDb250YWluZXIuaXNXaWRnZXRMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgd2lkZ2V0Q29uZmlnRmlsdGVyLmFwcENvbmZpZyA9IHRoaXMuYXBwQ29uZmlnO1xuICAgICAgICAgICAgd2lkZ2V0Q29uZmlnRmlsdGVyLndpZGdldEluZm8gPSB3aWRnZXRJbmZvO1xuICAgICAgICAgICAgLy8gd2lkZ2V0Q29uZmlnRmlsdGVyLndpZGdldEluZm8gPSA8SVdpZGdldEluZm8+e307XG4gICAgICAgICAgICB3aWRnZXRDb25maWdGaWx0ZXIud2lkZ2V0SW5mby53aWRnZXROYW1lID0gd2lkZ2V0SW5mby53aWRnZXROYW1lO1xuICAgICAgICAgICAgd2lkZ2V0Q29udGFpbmVyLndpZGdldEVsZW1lbnQubG9hZENvbnRlbnQod2lkZ2V0Q29uZmlnRmlsdGVyKTtcbiAgICAgICAgICAgIGF3YWl0IHdpZGdldENvbnRhaW5lci5zZXRMb2NrKHdpZGdldENvbmZpZ0ZpbHRlci5jb25maWcpO1xuICAgICAgICAgICAgYXdhaXQgd2lkZ2V0Q29udGFpbmVyLnNldERvd25sb2FkSWNvbigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jdGxXaWRnZXQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLndpZGdldEVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVG8gcmVmcmVzaCB3aWRnZXQgb24gaW5wdXQgY29uZmlnIGNoYW5nZXMgKi9cbiAgYXN5bmMgcmVmcmVzaFdpZGdldCh3aWRnZXRJbmZvOiBJV2lkZ2V0SW5mbykge1xuICAgIGxldCB3aWRnZXRDb250YWluZXJDb250ZXh0ID0gdGhpcztcbiAgICBsZXQgd2lkZ2V0Q29uZmlnRmlsdGVyID0gPElXaWRnZXRDb25maWdGaWx0ZXI+e1xuICAgICAgY29uZmlnOiB3aWRnZXRJbmZvLndpZGdldENvbmZpZ0luZm8uY29uZmlnLFxuICAgICAgZ2xvYmFsRmlsdGVyOiB0aGlzLmdsb2JhbEZpbHRlcixcbiAgICAgIGFwcENvbmZpZzogdGhpcy5hcHBDb25maWcsXG4gICAgICB3aWRnZXRJbmZvOiB3aWRnZXRJbmZvXG4gICAgfVxuICAgIGlmICh3aWRnZXRDb250YWluZXJDb250ZXh0LmlzV2lkZ2V0TG9hZGVkKSB7XG4gICAgICB3aWRnZXRDb250YWluZXJDb250ZXh0LndpZGdldEVsZW1lbnQubG9hZENvbnRlbnQod2lkZ2V0Q29uZmlnRmlsdGVyKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0TG9jayh3aWRnZXRDb25maWdGaWx0ZXIuY29uZmlnKTtcbiAgICAgIGF3YWl0IHRoaXMuc2V0RG93bmxvYWRJY29uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRMb2NrKGNvbmZpZzogc3RyaW5nKSB7ZGVidWdnZXJcbiAgICB0aGlzLmxvY2tTdGF0dXMgPSBhd2FpdCB0aGlzLndpZGdldEVsZW1lbnQubG9hZExvY2tTdGF0dXMoY29uZmlnKTtcbiAgICBpZih0aGlzLmxvY2tTdGF0dXMgPT0gJ2xvY2snKXtcbiAgICAgIHRoaXMubG9ja1RpdGxlID0gJ0xvY2tlZCc7XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmxvY2tUaXRsZSk7XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICB0aGlzLmxvY2tUaXRsZSA9ICdQYXJ0aWFsbHkgTG9ja2VkJztcbiAgICB9XG4gICAgaWYgKHRoaXMubG9ja1N0YXR1cykge1xuICAgICAgc3dpdGNoICh0aGlzLmxvY2tTdGF0dXMpIHtcbiAgICAgICAgY2FzZSBcImxvY2tcIjoge1xuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJmYXMgZmEtbG9jayBsb2NrZWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwidW5sb2NrXCI6IHtcbiAgICAgICAgICB0aGlzLmxvY2tDbGFzcyA9IFwidW5sb2NrZWRcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFwicGFydGlhbGxvY2tcIjoge1xuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJmYXMgZmEtbG9jayBwYXJ0aWFsbG9ja2VkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRoaXMubG9ja0NsYXNzID0gXCJ1bmxvY2tlZFwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldERvd25sb2FkSWNvbigpIHtcbiAgICBsZXQgZG93bmxvYWRUeXBlID0gYXdhaXQgdGhpcy53aWRnZXRFbGVtZW50LmdldERvd25sb2FkVHlwZSgpO1xuICAgIHRoaXMuZG93bmxvYWRJY29uVHlwZSA9IGRvd25sb2FkVHlwZTtcblxuXG4gICAgaWYgKGRvd25sb2FkVHlwZSAhPSBSQURvd25sb2FkVHlwZS5Ob25lKSB7XG4gICAgICB0aGlzLmlzRG93bmxvYWRJY29uVmlzaWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25sb2FkQ2xpY2tlZCgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuZG93bmxvYWRJY29uVHlwZSkge1xuICAgICAgY2FzZSBSQURvd25sb2FkVHlwZS5HcmlkOlxuICAgICAgICB0aGlzLmRvd25sb2FkSWNvbkNsaWNrZWQoJ0NTVicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUkFEb3dubG9hZFR5cGUuQ2hhcnQ6XG4gICAgICAgIHRoaXMuaXNEb3dubG9hZENoYXJ0VmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBSQURvd25sb2FkVHlwZS5DdXN0b206XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEljb25DbGlja2VkKHR5cGU6IHN0cmluZykge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIkNTVlwiOlxuICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuZG93bmxvYWRDbGlja2VkKHRoaXMuZG93bmxvYWRJY29uVHlwZSwgUkFEb3dubG9hZE9wdGlvbi5DU1YpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJQTkdcIjpcbiAgICAgICAgdGhpcy53aWRnZXRFbGVtZW50LmRvd25sb2FkQ2xpY2tlZCh0aGlzLmRvd25sb2FkSWNvblR5cGUsIFJBRG93bmxvYWRPcHRpb24uUE5HKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiUERGXCI6XG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5kb3dubG9hZENsaWNrZWQodGhpcy5kb3dubG9hZEljb25UeXBlLCBSQURvd25sb2FkT3B0aW9uLlBERik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIlNWR1wiOlxuICAgICAgICB0aGlzLndpZGdldEVsZW1lbnQuZG93bmxvYWRDbGlja2VkKHRoaXMuZG93bmxvYWRJY29uVHlwZSwgUkFEb3dubG9hZE9wdGlvbi5TVkcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJKUEVHXCI6XG4gICAgICAgIHRoaXMud2lkZ2V0RWxlbWVudC5kb3dubG9hZENsaWNrZWQodGhpcy5kb3dubG9hZEljb25UeXBlLCBSQURvd25sb2FkT3B0aW9uLkpQRUcpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipTaG93IGRyb3Bkb3duIG9uIGdlYXIgaWNvbiBjbGljayAgKi9cbiAgcHVibGljIHNob3dEcm9wRG93bigpIHtcbiAgICB0aGlzLmRyb3BEb3duU2hvd24gPSAhdGhpcy5kcm9wRG93blNob3duO1xuICB9XG5cbiAgLyoqSGlkZSBkcm9wZG93biBvbiBvdXRzaWRlIGNsaWNrICovXG4gIHB1YmxpYyBoaWRlRHJvcERvd24oKSB7XG4gICAgaWYgKHRoaXMuZHJvcERvd25TaG93bikge1xuICAgICAgdGhpcy5kcm9wRG93blNob3duID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuaXNEb3dubG9hZENoYXJ0VmlzaWJsZSA9IGZhbHNlO1xuICB9XG59XG4iXX0=
|