gamma-app-controller 1.0.1
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 -0
- package/esm2020/gamma-app-controller.mjs +2 -0
- package/esm2020/lib/application-controller/app.http.service.mjs +24 -0
- package/esm2020/lib/application-controller/application-content.service.mjs +482 -0
- package/esm2020/lib/application-controller/application-controller.module.mjs +324 -0
- package/esm2020/lib/application-controller/application-dataset-call.service.mjs +321 -0
- package/esm2020/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.mjs +390 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.mjs +349 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset-json/create-dataset-json.component.mjs +148 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset-sql/create-dataset-sql.component.mjs +167 -0
- package/esm2020/lib/application-controller/application-dataset-component/create-dataset-sql/sqlFormatter.mjs +17 -0
- package/esm2020/lib/application-controller/application-dataset-component/dataset-mongo/dataset-mongo.component.mjs +57 -0
- package/esm2020/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.mjs +409 -0
- package/esm2020/lib/application-controller/application-dataset-component/dataset-rest-api/dataset-rest-api.component.mjs +61 -0
- package/esm2020/lib/application-controller/application-filter/application-filter.component.mjs +186 -0
- package/esm2020/lib/application-controller/application-view-components/application-views/application-views.component.mjs +134 -0
- package/esm2020/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.mjs +559 -0
- package/esm2020/lib/application-controller/common-header/common-header.component.mjs +33 -0
- package/esm2020/lib/application-controller/common.mjs +1207 -0
- package/esm2020/lib/application-controller/environment.mjs +26 -0
- package/esm2020/lib/application-controller/kpi-comon-service.mjs +537 -0
- package/esm2020/lib/application-controller/kpi-service.mjs +108 -0
- package/esm2020/lib/application-controller/loading/loading.component.mjs +16 -0
- package/esm2020/lib/application-controller/loading/loadingModule.mjs +28 -0
- package/esm2020/lib/application-controller/moment-helper.mjs +4 -0
- package/esm2020/lib/application-controller/page-controller/page-config/page-config.component.mjs +977 -0
- package/esm2020/lib/application-controller/page-controller/page-controller/page-controller.component.mjs +172 -0
- package/esm2020/lib/application-controller/page-templates/cdr-config/cdr-config.component.mjs +227 -0
- package/esm2020/lib/application-controller/page-templates/dynamic-route-service.mjs +22 -0
- package/esm2020/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.mjs +118 -0
- package/esm2020/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.mjs +181 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.mjs +71 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.mjs +266 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.mjs +159 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.mjs +144 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.mjs +20 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.mjs +168 -0
- package/esm2020/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.mjs +74 -0
- package/esm2020/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.mjs +118 -0
- package/esm2020/lib/application-controller/shared/api.service.mjs +117 -0
- package/esm2020/lib/application-controller/shared/app-title/app-title.component.mjs +67 -0
- package/esm2020/lib/application-controller/shared/gamam-widget/gamam-widget.component.mjs +37 -0
- package/esm2020/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.mjs +229 -0
- package/esm2020/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.mjs +144 -0
- package/esm2020/lib/application-controller/shared/kpi-comon-service.mjs +537 -0
- package/esm2020/lib/application-controller/shared/loader/loader.component.mjs +14 -0
- package/esm2020/lib/application-controller/shared/loading/loading.component.mjs +16 -0
- package/esm2020/lib/application-controller/shared/loading/loadingModule.mjs +28 -0
- package/esm2020/lib/application-controller/shared/safeHtmlPipe.mjs +20 -0
- package/esm2020/lib/application-controller/support-components/dash-chart/dash-chart.component.mjs +294 -0
- package/esm2020/lib/application-controller/support-components/dash-table/dash-table.component.mjs +287 -0
- package/esm2020/lib/application-controller/support-components/geo-map/geo-map.component.mjs +255 -0
- package/esm2020/lib/application-controller/support-components/table-with-bar/table-with-bar.component.mjs +269 -0
- package/esm2020/lib/gamma-app-controller.component.mjs +16 -0
- package/esm2020/lib/gamma-app-controller.module.mjs +43 -0
- package/esm2020/lib/gamma-app-controller.service.mjs +20 -0
- package/esm2020/lib/icons.module.mjs +23 -0
- package/esm2020/public-api.mjs +49 -0
- package/fesm2015/gamma-app-controller.mjs +10250 -0
- package/fesm2015/gamma-app-controller.mjs.map +1 -0
- package/fesm2020/gamma-app-controller.mjs +10248 -0
- package/fesm2020/gamma-app-controller.mjs.map +1 -0
- package/index.d.ts +2 -0
- package/lib/application-controller/app.http.service.d.ts +15 -0
- package/lib/application-controller/application-content.service.d.ts +79 -0
- package/lib/application-controller/application-controller.module.d.ts +51 -0
- package/lib/application-controller/application-dataset-call.service.d.ts +20 -0
- package/lib/application-controller/application-dataset-component/application-dataset/application-dataset.component.d.ts +55 -0
- package/lib/application-controller/application-dataset-component/create-dataset/create-dataset.component.d.ts +121 -0
- package/lib/application-controller/application-dataset-component/create-dataset-json/create-dataset-json.component.d.ts +38 -0
- package/lib/application-controller/application-dataset-component/create-dataset-sql/create-dataset-sql.component.d.ts +42 -0
- package/lib/application-controller/application-dataset-component/create-dataset-sql/sqlFormatter.d.ts +7 -0
- package/lib/application-controller/application-dataset-component/dataset-mongo/dataset-mongo.component.d.ts +21 -0
- package/lib/application-controller/application-dataset-component/dataset-query-bulder/dataset-query-bulder.component.d.ts +62 -0
- package/lib/application-controller/application-dataset-component/dataset-rest-api/dataset-rest-api.component.d.ts +22 -0
- package/lib/application-controller/application-filter/application-filter.component.d.ts +36 -0
- package/lib/application-controller/application-view-components/application-views/application-views.component.d.ts +47 -0
- package/lib/application-controller/application-view-components/create-comp-view/create-comp-view.component.d.ts +73 -0
- package/lib/application-controller/common-header/common-header.component.d.ts +15 -0
- package/lib/application-controller/common.d.ts +148 -0
- package/lib/application-controller/environment.d.ts +25 -0
- package/lib/application-controller/kpi-comon-service.d.ts +14 -0
- package/lib/application-controller/kpi-service.d.ts +6 -0
- package/lib/application-controller/loading/loading.component.d.ts +9 -0
- package/lib/application-controller/loading/loadingModule.d.ts +10 -0
- package/lib/application-controller/moment-helper.d.ts +3 -0
- package/lib/application-controller/page-controller/page-config/page-config.component.d.ts +188 -0
- package/lib/application-controller/page-controller/page-controller/page-controller.component.d.ts +47 -0
- package/lib/application-controller/page-templates/cdr-config/cdr-config.component.d.ts +44 -0
- package/lib/application-controller/page-templates/dynamic-route-service.d.ts +8 -0
- package/lib/application-controller/shared/advanced-component/advance-widget-header-filter/advance-widget-header-filter.component.d.ts +33 -0
- package/lib/application-controller/shared/advanced-component/app-advance-header/app-header.component.d.ts +43 -0
- package/lib/application-controller/shared/advanced-component/gamm-single-number-card/gamm-single-number-card.component.d.ts +20 -0
- package/lib/application-controller/shared/advanced-component/gamma-advance-chart/gamma-advance-chart.component.d.ts +51 -0
- package/lib/application-controller/shared/advanced-component/gamma-advance-operator-table/gamma-advance-operator-table.component.d.ts +32 -0
- package/lib/application-controller/shared/advanced-component/gamma-table-clumn-bar-chart/gamma-table-clumn-bar-chart.component.d.ts +31 -0
- package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/contentSafeHtml.d.ts +10 -0
- package/lib/application-controller/shared/advanced-component/gamma-table-with-percentage/gamma-table-with-percentage.component.d.ts +26 -0
- package/lib/application-controller/shared/advanced-component/gamma-today-previous/gamma-today-previous.component.d.ts +21 -0
- package/lib/application-controller/shared/advanced-component/google-geo-map/google-geo-map.component.d.ts +29 -0
- package/lib/application-controller/shared/api.service.d.ts +26 -0
- package/lib/application-controller/shared/app-title/app-title.component.d.ts +28 -0
- package/lib/application-controller/shared/gamam-widget/gamam-widget.component.d.ts +20 -0
- package/lib/application-controller/shared/gamma-advance-filter/gamma-advance-filter.component.d.ts +45 -0
- package/lib/application-controller/shared/gamma-bread-crumbs/bread-crumbs.component.d.ts +32 -0
- package/lib/application-controller/shared/kpi-comon-service.d.ts +14 -0
- package/lib/application-controller/shared/loader/loader.component.d.ts +8 -0
- package/lib/application-controller/shared/loading/loading.component.d.ts +9 -0
- package/lib/application-controller/shared/loading/loadingModule.d.ts +10 -0
- package/lib/application-controller/shared/safeHtmlPipe.d.ts +10 -0
- package/lib/application-controller/support-components/dash-chart/dash-chart.component.d.ts +83 -0
- package/lib/application-controller/support-components/dash-table/dash-table.component.d.ts +67 -0
- package/lib/application-controller/support-components/geo-map/geo-map.component.d.ts +70 -0
- package/lib/application-controller/support-components/table-with-bar/table-with-bar.component.d.ts +70 -0
- package/lib/gamma-app-controller.component.d.ts +5 -0
- package/lib/gamma-app-controller.module.d.ts +10 -0
- package/lib/gamma-app-controller.service.d.ts +7 -0
- package/lib/icons.module.d.ts +11 -0
- package/package.json +33 -0
- package/public-api.d.ts +48 -0
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../common";
|
|
4
|
+
import * as i2 from "../../application-content.service";
|
|
5
|
+
import * as i3 from "ngx-toastr";
|
|
6
|
+
import * as i4 from "@angular/common";
|
|
7
|
+
import * as i5 from "devextreme-angular/ui/check-box";
|
|
8
|
+
import * as i6 from "devextreme-angular/ui/color-box";
|
|
9
|
+
import * as i7 from "devextreme-angular/ui/select-box";
|
|
10
|
+
import * as i8 from "devextreme-angular/ui/tag-box";
|
|
11
|
+
import * as i9 from "devextreme-angular/ui/text-box";
|
|
12
|
+
import * as i10 from "@angular/forms";
|
|
13
|
+
import * as i11 from "../../shared/loader/loader.component";
|
|
14
|
+
import * as i12 from "../../shared/advanced-component/google-geo-map/google-geo-map.component";
|
|
15
|
+
export class GeoMapComponent {
|
|
16
|
+
constructor(commonService, cdr, service, taostr) {
|
|
17
|
+
this.commonService = commonService;
|
|
18
|
+
this.cdr = cdr;
|
|
19
|
+
this.service = service;
|
|
20
|
+
this.taostr = taostr;
|
|
21
|
+
this.colors = [];
|
|
22
|
+
this.dataSourseForTable = [];
|
|
23
|
+
this.allConfiguredViews = [];
|
|
24
|
+
this.viewProperties = {
|
|
25
|
+
enableClickEvent: false,
|
|
26
|
+
enableRightClickEvent: true,
|
|
27
|
+
clickEventOptions: {
|
|
28
|
+
associatedViews: [],
|
|
29
|
+
eventType: ""
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
this.optionalDrilDownDataSource = [];
|
|
33
|
+
this.table_columns_config = {
|
|
34
|
+
"kpiConfig": {
|
|
35
|
+
"serviceId": "",
|
|
36
|
+
"api": "/kpi/trends/network/get-metric-data",
|
|
37
|
+
"displayType": "googleChart",
|
|
38
|
+
"formate": "",
|
|
39
|
+
"keyToPass": [],
|
|
40
|
+
"componentName": "GammaGeoChartComponent",
|
|
41
|
+
"dataConfig": {}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
this.tableDataConfig = {
|
|
45
|
+
"chart_config": [],
|
|
46
|
+
"title": "",
|
|
47
|
+
"argumentField": "",
|
|
48
|
+
"chartValueField": "",
|
|
49
|
+
"size": "450",
|
|
50
|
+
"chartType": "geochart",
|
|
51
|
+
"backgroundColor": "#1e293b",
|
|
52
|
+
"colors": ['#e7f0fd', '#003566', '#fd0000']
|
|
53
|
+
};
|
|
54
|
+
this.enrichNameList = ["abbreviateNumber", "getColorCodeSpan", "ThousandSeparator"];
|
|
55
|
+
this.isLoader = true;
|
|
56
|
+
this.activeTab = 'basic';
|
|
57
|
+
this.createOtherComponentView = new EventEmitter();
|
|
58
|
+
this.selectedViews = [];
|
|
59
|
+
}
|
|
60
|
+
set chartconfigData(value) {
|
|
61
|
+
if (value === undefined || value.length === 0) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.jsaonDatasource = value.data[0];
|
|
66
|
+
this.configColume = Object.keys(value.data[0]);
|
|
67
|
+
this.dataSourseForTable = value.data;
|
|
68
|
+
this.selectedViewConfigs = value;
|
|
69
|
+
this.selectedTableViewType = value.selectedViewType;
|
|
70
|
+
if (value.selectedWidgetConfig) {
|
|
71
|
+
this.table_columns_config['kpiConfig'] = value.selectedWidgetConfig;
|
|
72
|
+
this.tableDataConfig = value.selectedWidgetConfig.dataConfig;
|
|
73
|
+
this.tableDataConfig.chart_config = value.selectedWidgetConfig.dataConfig.chart_config;
|
|
74
|
+
if (value.selectedWidgetConfig.viewProperties && value.selectedWidgetConfig.viewProperties.clickEventOptions.associatedViews) {
|
|
75
|
+
this.viewProperties = value.selectedWidgetConfig.viewProperties;
|
|
76
|
+
this.viewProperties = {
|
|
77
|
+
"enableClickEvent": value.selectedWidgetConfig.viewProperties.enableClickEvent,
|
|
78
|
+
"enableRightClickEvent": value.selectedWidgetConfig.viewProperties.enableRightClickEvent
|
|
79
|
+
};
|
|
80
|
+
if (value.selectedWidgetConfig.viewProperties.enableClickEvent) {
|
|
81
|
+
this.viewProperties['clickEventOptions'] = {
|
|
82
|
+
"eventType": value.selectedWidgetConfig.viewProperties.clickEventOptions.eventType,
|
|
83
|
+
"associatedViews": value.selectedWidgetConfig.viewProperties.clickEventOptions.associatedViews
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.viewProperties['clickEventOptions'] = {};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
this.cdr.detectChanges();
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.tableDataConfig.chart_config = value.columnData;
|
|
94
|
+
if (this.tableDataConfig.chart_config) {
|
|
95
|
+
this.tableDataConfig.chart_config.forEach(element => {
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
this.tableDataConfig.chart_config = [];
|
|
100
|
+
this.configColume.forEach(element => {
|
|
101
|
+
let obj = {
|
|
102
|
+
"dataField": element,
|
|
103
|
+
"caption": this.commonService.convertString(element),
|
|
104
|
+
};
|
|
105
|
+
this.tableDataConfig.chart_config.push(obj);
|
|
106
|
+
});
|
|
107
|
+
console.log(this.configColume);
|
|
108
|
+
}
|
|
109
|
+
this.cdr.detectChanges();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
ngOnInit() {
|
|
114
|
+
this.isLoader = true;
|
|
115
|
+
this.service.getAppViewConfigs().subscribe({
|
|
116
|
+
next: (data) => {
|
|
117
|
+
this.allConfiguredViews = data;
|
|
118
|
+
this.isLoader = false;
|
|
119
|
+
}, error: (err) => {
|
|
120
|
+
this.taostr.error('Unexpected Server Exception. Please contact System Admin.', 'All Views');
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
this.optionalDrilDownDataSource = [
|
|
124
|
+
{
|
|
125
|
+
'viewId': "",
|
|
126
|
+
'filterCondition': ""
|
|
127
|
+
}
|
|
128
|
+
];
|
|
129
|
+
}
|
|
130
|
+
addColumns() {
|
|
131
|
+
let obj = {
|
|
132
|
+
"dataField": "",
|
|
133
|
+
"caption": "",
|
|
134
|
+
};
|
|
135
|
+
this.tableDataConfig.chart_config.push(obj);
|
|
136
|
+
}
|
|
137
|
+
deleteColumns(i) {
|
|
138
|
+
this.tableDataConfig.chart_config.splice(i, 1);
|
|
139
|
+
}
|
|
140
|
+
getEnrichClassName(e, item) {
|
|
141
|
+
item.enrichName = e.value;
|
|
142
|
+
}
|
|
143
|
+
moveItemForColumns(index, direction) {
|
|
144
|
+
if (index < 0 || index >= this.tableDataConfig.chart_config.length)
|
|
145
|
+
return;
|
|
146
|
+
const newPosition = direction === 'up' ? index - 1 : index + 1;
|
|
147
|
+
if (newPosition < 0 || newPosition >= this.tableDataConfig.chart_config.length)
|
|
148
|
+
return;
|
|
149
|
+
const itemToMove = this.tableDataConfig.chart_config[index];
|
|
150
|
+
this.tableDataConfig.chart_config.splice(index, 1);
|
|
151
|
+
this.tableDataConfig.chart_config.splice(newPosition, 0, itemToMove);
|
|
152
|
+
}
|
|
153
|
+
getObjectKeys(obj) {
|
|
154
|
+
return Object.keys(obj);
|
|
155
|
+
}
|
|
156
|
+
setActiveTab(tab) {
|
|
157
|
+
this.activeTab = tab;
|
|
158
|
+
}
|
|
159
|
+
getGroupColumns(columns) {
|
|
160
|
+
const groupedColumns = columns.reduce((acc, column) => {
|
|
161
|
+
let group = acc.find(item => item.caption === column.group);
|
|
162
|
+
if (!group) {
|
|
163
|
+
group = {
|
|
164
|
+
caption: column.group,
|
|
165
|
+
columns: []
|
|
166
|
+
};
|
|
167
|
+
acc.push(group);
|
|
168
|
+
}
|
|
169
|
+
group.columns.push({
|
|
170
|
+
dataField: column.dataField,
|
|
171
|
+
caption: column.caption
|
|
172
|
+
});
|
|
173
|
+
return acc;
|
|
174
|
+
}, []);
|
|
175
|
+
return groupedColumns;
|
|
176
|
+
}
|
|
177
|
+
geColumnsFromGroup(columns) {
|
|
178
|
+
const newColumns = [];
|
|
179
|
+
columns.forEach(group => {
|
|
180
|
+
group.columns.forEach(col => {
|
|
181
|
+
newColumns.push({
|
|
182
|
+
dataField: col.dataField,
|
|
183
|
+
caption: col.caption,
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
return newColumns;
|
|
188
|
+
}
|
|
189
|
+
getSaveChartConfig() {
|
|
190
|
+
this.table_columns_config.kpiConfig['dataConfig'] = this.tableDataConfig;
|
|
191
|
+
if (this.viewProperties.clickEventOptions.eventType == 'optionalDrillDown') {
|
|
192
|
+
this.viewProperties['clickEventOptions']['associatedViews'] = this.optionalDrilDownDataSource;
|
|
193
|
+
}
|
|
194
|
+
this.table_columns_config.kpiConfig['viewProperties'] = this.viewProperties;
|
|
195
|
+
console.log(this.table_columns_config);
|
|
196
|
+
}
|
|
197
|
+
deleteAssociatedParams(index) {
|
|
198
|
+
this.optionalDrilDownDataSource.splice(index, 1);
|
|
199
|
+
}
|
|
200
|
+
addAssociatedParams() {
|
|
201
|
+
this.optionalDrilDownDataSource.push({
|
|
202
|
+
'viewId': "",
|
|
203
|
+
'filterCondition': ""
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
getSelectedEventType(e) {
|
|
207
|
+
if (e.event) {
|
|
208
|
+
this.optionalDrilDownDataSource = [];
|
|
209
|
+
if (this.viewProperties.clickEventOptions.eventType == 'drilldown') {
|
|
210
|
+
this.table_columns_config.kpiConfig['viewProperties']['associatedViews'] = [];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
resetViewProprstise() {
|
|
215
|
+
this.viewProperties = {
|
|
216
|
+
enableClickEvent: false,
|
|
217
|
+
enableRightClickEvent: true,
|
|
218
|
+
clickEventOptions: {
|
|
219
|
+
associatedViews: [],
|
|
220
|
+
eventType: ""
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
addColor() {
|
|
225
|
+
this.tableDataConfig.colors.push('#000000');
|
|
226
|
+
}
|
|
227
|
+
removeColor(index) {
|
|
228
|
+
this.tableDataConfig.colors.splice(index, 1);
|
|
229
|
+
}
|
|
230
|
+
onColorChange(value, index) {
|
|
231
|
+
this.tableDataConfig.colors[index] = value;
|
|
232
|
+
}
|
|
233
|
+
viewMapForTest() {
|
|
234
|
+
this.table_columns_config.kpiConfig['dataConfig'] = this.tableDataConfig;
|
|
235
|
+
if (this.viewProperties.clickEventOptions.eventType == 'optionalDrillDown') {
|
|
236
|
+
this.viewProperties['clickEventOptions']['associatedViews'] = this.optionalDrilDownDataSource;
|
|
237
|
+
}
|
|
238
|
+
this.table_columns_config.kpiConfig['viewProperties'] = this.viewProperties;
|
|
239
|
+
this.table_columns_config.kpiConfig['dataSource'] = this.dataSourseForTable;
|
|
240
|
+
this.chartDataSourceForMap = this.table_columns_config;
|
|
241
|
+
this.isJsonPreview = true;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
GeoMapComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: GeoMapComponent, deps: [{ token: i1.CommonService }, { token: i0.ChangeDetectorRef }, { token: i2.ApplicationContentService }, { token: i3.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
|
|
245
|
+
GeoMapComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.3", type: GeoMapComponent, selector: "app-geo-map", inputs: { chartconfigData: ["datasetmodal", "chartconfigData"] }, outputs: { createOtherComponentView: "createOtherComponentView" }, ngImport: i0, template: "<div class=\"flex flex-wrap\">\n <div class=\"w-full mx-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <!-- <app-gamma-geo-chart [chartDataSource]=\"chartDataSourceForMap\"></app-gamma-geo-chart> -->\n <app-google-geo-map [chartDataSource]=\"chartDataSourceForMap\"></app-google-geo-map>\n\n <div #dynamicContainer></div>\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2\">\n\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic' \n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'chart_config',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'chart_config' \n }\" (click)=\"setActiveTab('chart_config')\" type=\"button\" role=\"tab\">\n Chart Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.title\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.argumentField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chartvalu Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.chartValueField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Background Color</div>\n <dx-color-box [(ngModel)]=\"tableDataConfig.backgroundColor\"></dx-color-box>\n </div>\n <!-- <div class=\"px-4 mt-6 w-full\">\n <dx-check-box [value]=\"tableDataConfig.commonConfig.isSearchBox\"\n [(ngModel)]=\"tableDataConfig.commonConfig.isSearchBox\"\n text=\"Search Box\"></dx-check-box>\n\n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\" pt-2 border-x border-b \">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Colors\n </div>\n <div class=\"flex flex-wrap px-1 mb-2 mt-2\">\n <div class=\"flex mr-2 mb-2\" *ngFor=\"let color of tableDataConfig.colors; let i = index\">\n <div class=\"mr-2\">\n <dx-color-box [(ngModel)]=\"tableDataConfig.colors[i]\"\n (onValueChanged)=\"onColorChange($event.value, i)\"></dx-color-box>\n </div>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer px-2\"\n (click)=\"removeColor(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n <!-- <div class=\"px-2\"> <button class=\"{{commonService.btn_danger_sm}}\" (click)=\"removeColor(i)\">Remove</button></div> -->\n </div>\n \n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}}\" (click)=\"addColor()\">Add Color</button>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Table Config\n </div>\n <div class=\"flex flse-row py-3 border-x border-b \">\n <div class=\"px-1 mb-2 mt-8 w-full\">\n <dx-check-box [value]=\"tableDataConfig.searchPanel\"\n [(ngModel)]=\"tableDataConfig.searchPanel\" text=\"Search Panel\"></dx-check-box>\n </div>\n <div class=\" px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">File Name</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.file_name\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Number Of Row</div>\n <dx-number-box [value]=\"tableDataConfig.numberOfRow\"\n [(ngModel)]=\"tableDataConfig.numberOfRow\"></dx-number-box>\n </div>\n <div class=\"px-1 mb-2 mt-8 w-full\">\n <dx-check-box [value]=\"tableDataConfig.pageInfo\" [(ngModel)]=\"tableDataConfig.pageInfo\"\n text=\"Page Info\"></dx-check-box>\n </div>\n\n </div>\n\n </div> -->\n\n\n </div>\n <div *ngIf=\"activeTab === 'chart_config'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> \n Tooltip Columns\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of tableDataConfig.chart_config; let i = index;\">\n <!-- <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div> -->\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n <!-- <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.isShowBar\" [(ngModel)]=\"item.isShowBar\"\n text=\"Allow Bar\"></dx-check-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color</div>\n <dx-color-box [(ngModel)]=\"item.color\"></dx-color-box>\n </div> -->\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== tableDataConfig.chart_config.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box [items]=\"['drilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-2\"\n (click)=\"resetViewProprstise()\">Reset All</button>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"viewMapForTest()\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.DxCheckBoxComponent, selector: "dx-check-box", inputs: ["accessKey", "activeStateEnabled", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "iconSize", "isValid", "name", "readOnly", "rtlEnabled", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onContentReady", "onDisposing", "onInitialized", "onOptionChanged", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "iconSizeChange", "isValidChange", "nameChange", "readOnlyChange", "rtlEnabledChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i6.DxColorBoxComponent, selector: "dx-color-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyButtonText", "applyValueMode", "buttons", "cancelButtonText", "deferRendering", "disabled", "dropDownButtonTemplate", "dropDownOptions", "editAlphaChannel", "elementAttr", "fieldTemplate", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "keyStep", "label", "labelMode", "name", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showDropDownButton", "stylingMode", "tabIndex", "text", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "visible", "width"], outputs: ["onChange", "onClosed", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyButtonTextChange", "applyValueModeChange", "buttonsChange", "cancelButtonTextChange", "deferRenderingChange", "disabledChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "editAlphaChannelChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "keyStepChange", "labelChange", "labelModeChange", "nameChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showDropDownButtonChange", "stylingModeChange", "tabIndexChange", "textChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "component", type: i7.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i8.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.LoaderComponent, selector: "app-loader" }, { kind: "component", type: i12.GoogleGeoMapComponent, selector: "app-google-geo-map", inputs: ["rightClickEnable", "chartDataSource"], outputs: ["getTableConfigOutPut", "oRowClick", "onrightClickContextSelection"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }] });
|
|
246
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: GeoMapComponent, decorators: [{
|
|
247
|
+
type: Component,
|
|
248
|
+
args: [{ selector: 'app-geo-map', template: "<div class=\"flex flex-wrap\">\n <div class=\"w-full mx-2 border-r\">\n <ng-container *ngIf=\"!isJsonPreview\">\n <pre><code>{{jsaonDatasource | json}}</code></pre>\n </ng-container>\n <ng-container *ngIf=\"isJsonPreview\">\n <!-- <app-gamma-geo-chart [chartDataSource]=\"chartDataSourceForMap\"></app-gamma-geo-chart> -->\n <app-google-geo-map [chartDataSource]=\"chartDataSourceForMap\"></app-google-geo-map>\n\n <div #dynamicContainer></div>\n\n </ng-container>\n </div>\n <div class=\"w-full mx-2\">\n\n <div class=\"mb-4 border-b border-gray-200 dark:border-gray-700\">\n <ul class=\"flex flex-wrap -mb-px text-sm font-medium text-center\" role=\"tablist\">\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'basic',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'basic' \n }\" (click)=\"setActiveTab('basic')\" type=\"button\" role=\"tab\">\n Basic\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{ \n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'chart_config',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'chart_config' \n }\" (click)=\"setActiveTab('chart_config')\" type=\"button\" role=\"tab\">\n Chart Columns\n </button>\n </li>\n <li class=\"me-2\" role=\"presentation\">\n <button class=\"inline-block p-4 border-b-2 rounded-t-lg\" [ngClass]=\"{\n 'text-purple-600 border-purple-600 dark:text-purple-500 dark:border-purple-500': activeTab === 'properties',\n 'text-gray-500 dark:text-gray-400 border-transparent': activeTab !== 'properties'\n }\" (click)=\"setActiveTab('properties')\" type=\"button\" role=\"tab\">\n Properties\n </button>\n </li>\n\n </ul>\n </div>\n\n <div id=\"default-styled-tab-content\">\n <div *ngIf=\"activeTab === 'basic'\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Filter Title\n Config\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 flex justify-between\">\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Title</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.title\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Argument Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.argumentField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> Chartvalu Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"tableDataConfig.chartValueField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-1\"> size</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.size\"></dx-text-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Background Color</div>\n <dx-color-box [(ngModel)]=\"tableDataConfig.backgroundColor\"></dx-color-box>\n </div>\n <!-- <div class=\"px-4 mt-6 w-full\">\n <dx-check-box [value]=\"tableDataConfig.commonConfig.isSearchBox\"\n [(ngModel)]=\"tableDataConfig.commonConfig.isSearchBox\"\n text=\"Search Box\"></dx-check-box>\n\n </div> -->\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Display Formate </div>\n <dx-select-box [items]=\"['daily','hourly','monthly']\"\n [(ngModel)]=\"table_columns_config.kpiConfig.formate\"\n [readOnly]=\"false\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-1 w-full\">\n <div class=\"text-md mb-2\"> Key To Pass </div>\n <dx-tag-box [items]=\"configColume\"\n [(ngModel)]=\"table_columns_config.kpiConfig.keyToPass\"></dx-tag-box>\n </div>\n </div>\n </div>\n <div class=\" pt-2 border-x border-b \">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Colors\n </div>\n <div class=\"flex flex-wrap px-1 mb-2 mt-2\">\n <div class=\"flex mr-2 mb-2\" *ngFor=\"let color of tableDataConfig.colors; let i = index\">\n <div class=\"mr-2\">\n <dx-color-box [(ngModel)]=\"tableDataConfig.colors[i]\"\n (onValueChanged)=\"onColorChange($event.value, i)\"></dx-color-box>\n </div>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer px-2\"\n (click)=\"removeColor(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n <!-- <div class=\"px-2\"> <button class=\"{{commonService.btn_danger_sm}}\" (click)=\"removeColor(i)\">Remove</button></div> -->\n </div>\n \n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_success_sm}}\" (click)=\"addColor()\">Add Color</button>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Table Config\n </div>\n <div class=\"flex flse-row py-3 border-x border-b \">\n <div class=\"px-1 mb-2 mt-8 w-full\">\n <dx-check-box [value]=\"tableDataConfig.searchPanel\"\n [(ngModel)]=\"tableDataConfig.searchPanel\" text=\"Search Panel\"></dx-check-box>\n </div>\n <div class=\" px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">File Name</div>\n <dx-text-box [(ngModel)]=\"tableDataConfig.file_name\"></dx-text-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Number Of Row</div>\n <dx-number-box [value]=\"tableDataConfig.numberOfRow\"\n [(ngModel)]=\"tableDataConfig.numberOfRow\"></dx-number-box>\n </div>\n <div class=\"px-1 mb-2 mt-8 w-full\">\n <dx-check-box [value]=\"tableDataConfig.pageInfo\" [(ngModel)]=\"tableDataConfig.pageInfo\"\n text=\"Page Info\"></dx-check-box>\n </div>\n\n </div>\n\n </div> -->\n\n\n </div>\n <div *ngIf=\"activeTab === 'chart_config'\">\n <div class=\"h-full overflow-x-auto\">\n <div class=\"flex flex-col flex-auto min-w-0\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> \n Tooltip Columns\n </div>\n <div class=\"pt-2 border-x border-b \">\n <div class=\"my-2 border-b flex flex-row\"\n *ngFor=\"let item of tableDataConfig.chart_config; let i = index;\">\n <!-- <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.visible\" [(ngModel)]=\"item.visible\"\n text=\"Visiblity\"></dx-check-box>\n </div> -->\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Value Field</div>\n <dx-select-box [searchEnabled]=\"true\" [items]=\"configColume\"\n [(ngModel)]=\"item.dataField\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\"> Caption</div>\n <dx-text-box [(ngModel)]=\"item.caption\"></dx-text-box>\n </div>\n <!-- <div class=\"px-2 mb-2 w-full\">\n <div class=\"text-md mb-2\"> UI Function</div>\n <dx-select-box [items]=\"enrichNameList\" [(ngModel)]=\"item.enrichName\"\n [searchEnabled]=\"true\"></dx-select-box>\n </div>\n <div class=\"px-1 mb-2 mt-6 w-full\">\n <dx-check-box [value]=\"item.isShowBar\" [(ngModel)]=\"item.isShowBar\"\n text=\"Allow Bar\"></dx-check-box>\n </div>\n\n <div class=\"px-1 mb-2 w-full\">\n <div class=\"text-md mb-2\">Color</div>\n <dx-color-box [(ngModel)]=\"item.color\"></dx-color-box>\n </div> -->\n <div class=\"text-center mt-8 w-full\">\n <button *ngIf=\"i !== 0\" class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== tableDataConfig.chart_config.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n <button class=\"{{commonService.btn_danger_sm}} cursor-pointer\"\n (click)=\"deleteColumns(i)\"><i class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n\n </div>\n </div>\n </div>\n <div class=\"flex flex-row justify-end my-2\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\" (click)=\"addColumns()\">Add\n Columns</button>\n </div>\n </div>\n </div>\n <div *ngIf=\"activeTab === 'properties'\">\n <div class=\"h-full overflow-x-auto\">\n <app-loader *ngIf=\"isLoader\"></app-loader>\n <ng-container *ngIf=\"!isLoader\">\n <div class=\"flex flex-row justify-between border-b py-3\">\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableClickEvent\"\n [(ngModel)]=\"viewProperties.enableClickEvent\"\n text=\"Enable Click Event\"></dx-check-box>\n </div>\n <div class=\"mx-2\">\n <dx-check-box [value]=\"viewProperties.enableRightClickEvent\"\n [(ngModel)]=\"viewProperties.enableRightClickEvent\"\n text=\"Enable Right Click\"></dx-check-box>\n </div>\n </div>\n <div class=\"w-full p-2\" *ngIf=\"viewProperties.enableClickEvent\">\n\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"text-sm py-1 font-extrabold border-b bg-gray-700 text-white px-2\"> Event\n Type\n Option\n </div>\n <div class=\"w-full p-3 border-x border-b \">\n <div class=\"flex flex-row\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Event Type</div>\n </div>\n <div class=\"w-full\">\n <dx-select-box [items]=\"['drilldown','optionalDrillDown']\"\n (onValueChanged)=\"getSelectedEventType($event)\"\n [(ngModel)]=\"viewProperties.clickEventOptions.eventType\"></dx-select-box>\n </div>\n </div>\n <ng-container *ngIf=\"viewProperties.clickEventOptions.eventType == 'drilldown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"viewProperties.clickEventOptions.associatedViews\"\n valueExpr=\"viewId\" displayExpr=\"viewName\"\n [showSelectionControls]=\"true\" [searchEnabled]=\"true\"></dx-tag-box>\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"viewProperties.clickEventOptions.eventType == 'optionalDrillDown'\">\n <div class=\"flex flex-row justify-between mt-3\">\n <div class=\"w-full\">\n <ng-container\n *ngFor=\"let item of optionalDrilDownDataSource;let i = index;\">\n\n <div class=\"flex flex-row justify-between\">\n <div class=\"mx-2 w-full\">\n <div class=\"text-md mb-2\"> Associated Views</div>\n <dx-tag-box [items]=\"allConfiguredViews\"\n [(ngModel)]=\"item.viewId\" valueExpr=\"viewId\"\n displayExpr=\"viewName\" [showSelectionControls]=\"true\"\n [maxDisplayedTags]=\"2\"\n [searchEnabled]=\"true\"></dx-tag-box>\n\n </div>\n <div class=\"mx-2\">\n <div class=\"text-md mb-2\"> Associated Params</div>\n <dx-text-box\n [(ngModel)]=\"item.filterCondition\"></dx-text-box>\n </div>\n <div class=\"mx-2\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mt-8\"\n (click)=\"deleteAssociatedParams(i)\"><i\n class=\"fa fa-trash-o\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </ng-container>\n <div class=\"flex flex-row justify-end mt-4\">\n <button class=\"{{commonService.btn_primary_sm}} cursor-pointer\"\n (click)=\"addAssociatedParams()\">Add\n Params</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n </div>\n </ng-container>\n <button class=\"{{commonService.btn_light_md}} cursor-pointer mt-2\"\n (click)=\"resetViewProprstise()\">Reset All</button>\n </div>\n </div>\n\n </div>\n\n\n </div>\n</div>\n\n<div class=\"flex flex-row border-t pl-3\">\n <div class=\"flex justify-start mx-1\">\n <button class=\"{{commonService.btn_warning_md}} cursor-pointer mt-2\" (click)=\"viewMapForTest()\">\n Preview</button>\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer mt-2\" (click)=\"isJsonPreview = false\">Data\n Preview</button>\n </div>\n <div class=\"flex justify-end mx-1 flex-grow\">\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mt-2\"\n (click)=\"getSaveChartConfig()\">Submit</button>\n </div>\n</div>" }]
|
|
249
|
+
}], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i0.ChangeDetectorRef }, { type: i2.ApplicationContentService }, { type: i3.ToastrService }]; }, propDecorators: { createOtherComponentView: [{
|
|
250
|
+
type: Output
|
|
251
|
+
}], chartconfigData: [{
|
|
252
|
+
type: Input,
|
|
253
|
+
args: ['datasetmodal']
|
|
254
|
+
}] } });
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvLW1hcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2dlby1tYXAvZ2VvLW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvc3VwcG9ydC1jb21wb25lbnRzL2dlby1tYXAvZ2VvLW1hcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXFCLFNBQVMsRUFBNEIsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQStCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7OztBQVd6SixNQUFNLE9BQU8sZUFBZTtJQXFEMUIsWUFBbUIsYUFBNEIsRUFBVSxHQUFzQixFQUFVLE9BQWtDLEVBQVUsTUFBcUI7UUFBdkksa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQTJCO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQW5EMUosV0FBTSxHQUFhLEVBQUUsQ0FBQztRQUV0Qix1QkFBa0IsR0FBUSxFQUFFLENBQUM7UUFHN0IsdUJBQWtCLEdBQVEsRUFBRSxDQUFDO1FBRTdCLG1CQUFjLEdBQVE7WUFDcEIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixxQkFBcUIsRUFBRSxJQUFJO1lBQzNCLGlCQUFpQixFQUFFO2dCQUNqQixlQUFlLEVBQUUsRUFBRTtnQkFDbkIsU0FBUyxFQUFFLEVBQUU7YUFDZDtTQUNGLENBQUM7UUFDRiwrQkFBMEIsR0FBUSxFQUFFLENBQUM7UUFDckMseUJBQW9CLEdBQUc7WUFDckIsV0FB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QUFFO1lBQzFFLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQztTQUMvRjtRQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRTVFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1FBQzVFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFFdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFFNUIsQ0FBQzs7NEdBNVNVLGVBQWU7Z0dBQWYsZUFBZSx3TENaNUIsc3JvQkE4VE07MkZEbFRPLGVBQWU7a0JBTDNCLFNBQVM7K0JBQ0UsYUFBYTt3TUE0RE4sd0JBQXdCO3NCQUF4QyxNQUFNO2dCQUlILGVBQWU7c0JBRGxCLEtBQUs7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vYXBwbGljYXRpb24tY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1nZW8tbWFwJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlby1tYXAuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nZW8tbWFwLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2VvTWFwQ29tcG9uZW50IHtcbiAgY2hhcnREYXRhU291cmNlRm9yTWFwOiBhbnk7XG4gIGNvbG9yczogc3RyaW5nW10gPSBbXTsgLy8gQXJyYXkgdG8gaG9sZCBzZWxlY3RlZCBjb2xvcnNcbiAgaXNKc29uUHJldmlldzogYm9vbGVhblxuICBkYXRhU291cnNlRm9yVGFibGU6IGFueSA9IFtdO1xuICBqc2FvbkRhdGFzb3VyY2U6IGFueTtcbiAgY29uZmlnQ29sdW1lOiBhbnk7XG4gIGFsbENvbmZpZ3VyZWRWaWV3czogYW55ID0gW107XG4gIC8vIGdyb3VwT2ZWaWV3czogYW55O1xuICB2aWV3UHJvcGVydGllczogYW55ID0ge1xuICAgIGVuYWJsZUNsaWNrRXZlbnQ6IGZhbHNlLFxuICAgIGVuYWJsZVJpZ2h0Q2xpY2tFdmVudDogdHJ1ZSxcbiAgICBjbGlja0V2ZW50T3B0aW9uczoge1xuICAgICAgYXNzb2NpYXRlZFZpZXdzOiBbXSxcbiAgICAgIGV2ZW50VHlwZTogXCJcIlxuICAgIH1cbiAgfTtcbiAgb3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2U6IGFueSA9IFtdO1xuICB0YWJsZV9jb2x1bW5zX2NvbmZpZyA9IHtcbiAgICBcImtwaUNvbmZpZ1wiOiB7XG4gICAgICBcInNlcnZpY2VJZFwiOiBcIlwiLFxuICAgICAgXCJhcGlcIjogXCIva3BpL3RyZW5kcy9uZXR3b3JrL2dldC1tZXRyaWMtZGF0YVwiLFxuICAgICAgXCJkaXNwbGF5VHlwZVwiOiBcImdvb2dsZUNoYXJ0XCIsXG4gICAgICBcImZvcm1hdGVcIjogXCJcIixcbiAgICAgIFwia2V5VG9QYXNzXCI6IFtdLFxuICAgICAgXCJjb21wb25lbnROYW1lXCI6IFwiR2FtbWFHZW9DaGFydENvbXBvbmVudFwiLFxuICAgICAgXCJkYXRhQ29uZmlnXCI6IHt9XG4gICAgfSxcbiAgfTtcblxuICB0YWJsZURhdGFDb25maWcgPSB7XG5cbiAgICBcImNoYXJ0X2NvbmZpZ1wiOiBbXG5cbiAgICBdLFxuXG4gICAgXCJ0aXRsZVwiOiBcIlwiLFxuICAgIFwiYXJndW1lbnRGaWVsZFwiOiBcIlwiLFxuICAgIFwiY2hhcnRWYWx1ZUZpZWxkXCI6IFwiXCIsXG4gICAgXCJzaXplXCI6IFwiNDUwXCIsXG4gICAgXCJjaGFydFR5cGVcIjogXCJnZW9jaGFydFwiLFxuICAgIFwiYmFja2dyb3VuZENvbG9yXCI6IFwiIzFlMjkzYlwiLFxuICAgIFwiY29sb3JzXCI6IFsnI2U3ZjBmZCcsICcjMDAzNTY2JywgJyNmZDAwMDAnXVxuXG4gIH1cblxuICBlbnJpY2hOYW1lTGlzdCA9IFtcImFiYnJldmlhdGVOdW1iZXJcIiwgXCJnZXRDb2xvckNvZGVTcGFuXCIsIFwiVGhvdXNhbmRTZXBhcmF0b3JcIl1cbiAgc2VsZWN0ZWRUYWJsZVZpZXdUeXBlOiBhbnk7XG4gIGlzTG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcblxuICBzZWxlY3RlZFZpZXdDb25maWdzOiBhbnk7XG5cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tbW9uU2VydmljZTogQ29tbW9uU2VydmljZSwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHNlcnZpY2U6IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UsIHByaXZhdGUgdGFvc3RyOiBUb2FzdHJTZXJ2aWNlKSB7IH1cblxuICBhY3RpdmVUYWI6IHN0cmluZyA9ICdiYXNpYyc7XG4gIEBPdXRwdXQoKSBwdWJsaWMgY3JlYXRlT3RoZXJDb21wb25lbnRWaWV3OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgc2VsZWN0ZWRWaWV3cyA9IFtdO1xuXG4gIEBJbnB1dCgnZGF0YXNldG1vZGFsJylcbiAgc2V0IGNoYXJ0Y29uZmlnRGF0YSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIHRoaXMuanNhb25EYXRhc291cmNlID0gdmFsdWUuZGF0YVswXTtcbiAgICAgIHRoaXMuY29uZmlnQ29sdW1lID0gT2JqZWN0LmtleXModmFsdWUuZGF0YVswXSk7XG4gICAgICB0aGlzLmRhdGFTb3Vyc2VGb3JUYWJsZSA9IHZhbHVlLmRhdGE7XG4gICAgICB0aGlzLnNlbGVjdGVkVmlld0NvbmZpZ3MgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWJsZVZpZXdUeXBlID0gdmFsdWUuc2VsZWN0ZWRWaWV3VHlwZTtcbiAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZykge1xuICAgICAgICAvLyBkZWJ1Z2dlclxuICAgICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnWydrcGlDb25maWcnXSA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnO1xuICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWc7XG4gICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLmRhdGFDb25maWcuY2hhcnRfY29uZmlnO1xuICAgICAgICBpZiAodmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMgJiYgdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuYXNzb2NpYXRlZFZpZXdzKSB7XG4gICAgICAgICAgdGhpcy52aWV3UHJvcGVydGllcyA9IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzO1xuICAgICAgICAgIHRoaXMudmlld1Byb3BlcnRpZXMgPSB7XG4gICAgICAgICAgICBcImVuYWJsZUNsaWNrRXZlbnRcIjogdmFsdWUuc2VsZWN0ZWRXaWRnZXRDb25maWcudmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudCxcbiAgICAgICAgICAgIFwiZW5hYmxlUmlnaHRDbGlja0V2ZW50XCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmVuYWJsZVJpZ2h0Q2xpY2tFdmVudFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddID0ge1xuICAgICAgICAgICAgICBcImV2ZW50VHlwZVwiOiB2YWx1ZS5zZWxlY3RlZFdpZGdldENvbmZpZy52aWV3UHJvcGVydGllcy5jbGlja0V2ZW50T3B0aW9ucy5ldmVudFR5cGUsXG4gICAgICAgICAgICAgIFwiYXNzb2NpYXRlZFZpZXdzXCI6IHZhbHVlLnNlbGVjdGVkV2lkZ2V0Q29uZmlnLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3c1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzWydjbGlja0V2ZW50T3B0aW9ucyddID0ge31cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZyA9IHZhbHVlLmNvbHVtbkRhdGE7XG4gICAgICAgIGlmICh0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcpIHtcbiAgICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIC8vIGVsZW1lbnRbJ2NvbG9yJ10gPSAnJztcbiAgICAgICAgICAgIC8vIGVsZW1lbnRbJ2lzU2hvd0JhciddID0gdHJ1ZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZyA9IFtdO1xuICAgICAgICAgIHRoaXMuY29uZmlnQ29sdW1lLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAvLyBcInZpc2libGVcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgLy8gXCJpc1Nob3dCYXJcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJkYXRhRmllbGRcIjogZWxlbWVudCxcbiAgICAgICAgICAgICAgXCJjYXB0aW9uXCI6IHRoaXMuY29tbW9uU2VydmljZS5jb252ZXJ0U3RyaW5nKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAvLyBcImVucmljaE5hbWVcIjogXCJcIixcbiAgICAgICAgICAgICAgLy8gXCJjb2xvclwiOiBcIlwiLFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcucHVzaChvYmopO1xuXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc29sZS5sb2codGhpcy5jb25maWdDb2x1bWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRlciA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLmdldEFwcFZpZXdDb25maWdzKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5hbGxDb25maWd1cmVkVmlld3MgPSBkYXRhO1xuXG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy50YW9zdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdBbGwgVmlld3MnKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlID0gW1xuICAgICAge1xuICAgICAgICAndmlld0lkJzogXCJcIixcbiAgICAgICAgJ2ZpbHRlckNvbmRpdGlvbic6IFwiXCJcbiAgICAgIH1cbiAgICBdXG4gIH1cbiAgYWRkQ29sdW1ucygpIHtcbiAgICBsZXQgb2JqID0ge1xuICAgICAgLy8gXCJ2aXNpYmxlXCI6IHRydWUsXG4gICAgICAvLyBcImlzU2hvd0JhclwiOiB0cnVlLFxuICAgICAgXCJkYXRhRmllbGRcIjogXCJcIixcbiAgICAgIFwiY2FwdGlvblwiOiBcIlwiLFxuICAgICAgLy8gXCJlbnJpY2hOYW1lXCI6IFwiXCIsXG4gICAgICAvLyBcImNvbG9yXCI6IFwiXCIsXG4gICAgfVxuXG4gICAgdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnLnB1c2gob2JqKTtcbiAgfVxuXG4gIGRlbGV0ZUNvbHVtbnMoaSkge1xuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5zcGxpY2UoaSwgMSlcbiAgfVxuXG4gIGdldEVucmljaENsYXNzTmFtZShlLCBpdGVtKSB7XG4gICAgaXRlbS5lbnJpY2hOYW1lID0gZS52YWx1ZTtcblxuICB9XG5cblxuICBtb3ZlSXRlbUZvckNvbHVtbnMoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgLy8gUHJldmVudCBtb3ZpbmcgYmV5b25kIGFycmF5IGJvdW5kc1xuICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy50YWJsZURhdGFDb25maWcuY2hhcnRfY29uZmlnLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlyZWN0aW9uID09PSAndXAnID8gaW5kZXggLSAxIDogaW5kZXggKyAxO1xuICAgIC8vIFByZXZlbnQgbW92aW5nIGJleW9uZCBhcnJheSBib3VuZHNcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE1vdmUgaXRlbVxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWdbaW5kZXhdO1xuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5zcGxpY2UoaW5kZXgsIDEpOyAvLyBSZW1vdmUgaXRlbSBmcm9tIGN1cnJlbnQgcG9zaXRpb25cbiAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWcuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpdGVtVG9Nb3ZlKTsgLy8gSW5zZXJ0IGl0ZW0gaW4gbmV3IHBvc2l0aW9uXG4gIH1cblxuICBnZXRPYmplY3RLZXlzKG9iajogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xuICB9XG4gIHNldEFjdGl2ZVRhYih0YWI6IHN0cmluZykge1xuICAgIHRoaXMuYWN0aXZlVGFiID0gdGFiO1xuICB9XG5cbiAgZ2V0R3JvdXBDb2x1bW5zKGNvbHVtbnMpIHtcbiAgICBjb25zdCBncm91cGVkQ29sdW1ucyA9IGNvbHVtbnMucmVkdWNlKChhY2MsIGNvbHVtbikgPT4ge1xuICAgICAgbGV0IGdyb3VwID0gYWNjLmZpbmQoaXRlbSA9PiBpdGVtLmNhcHRpb24gPT09IGNvbHVtbi5ncm91cCk7XG4gICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgIGdyb3VwID0ge1xuICAgICAgICAgIGNhcHRpb246IGNvbHVtbi5ncm91cCxcbiAgICAgICAgICBjb2x1bW5zOiBbXVxuICAgICAgICB9O1xuICAgICAgICBhY2MucHVzaChncm91cCk7XG4gICAgICB9XG4gICAgICBncm91cC5jb2x1bW5zLnB1c2goe1xuICAgICAgICBkYXRhRmllbGQ6IGNvbHVtbi5kYXRhRmllbGQsXG4gICAgICAgIC8vIHZpc2libGU6IGNvbHVtbi52aXNpYmxlLFxuICAgICAgICBjYXB0aW9uOiBjb2x1bW4uY2FwdGlvblxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4gZ3JvdXBlZENvbHVtbnM7XG4gIH1cbiAgZ2VDb2x1bW5zRnJvbUdyb3VwKGNvbHVtbnMpIHtcbiAgICBjb25zdCBuZXdDb2x1bW5zID0gW107XG5cbiAgICBjb2x1bW5zLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgZ3JvdXAuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XG4gICAgICAgIG5ld0NvbHVtbnMucHVzaCh7XG4gICAgICAgICAgZGF0YUZpZWxkOiBjb2wuZGF0YUZpZWxkLFxuICAgICAgICAgIC8vIHZpc2libGU6IGNvbC52aXNpYmxlLFxuICAgICAgICAgIGNhcHRpb246IGNvbC5jYXB0aW9uLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdDb2x1bW5zO1xuICB9XG5cblxuICBnZXRTYXZlQ2hhcnRDb25maWcoKSB7XG5cbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy50YWJsZURhdGFDb25maWc7XG4gICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ11bJ2Fzc29jaWF0ZWRWaWV3cyddID0gdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG4gICAgLy8gYWxlcnQoSlNPTi5zdHJpbmdpZnkodGhpcy50YWJsZV9jb2x1bW5zX2NvbmZpZywgbnVsbCwgMikpO1xuICAgIC8vIGNvbnNvbGUubG9nKHRoaXMudGFibGVfY29sdW1uc19jb25maWcpO1xuICAgIGNvbnNvbGUubG9nKHRoaXMudGFibGVfY29sdW1uc19jb25maWcpO1xuXG4gICAgLy8gdGhpcy5jcmVhdGVPdGhlckNvbXBvbmVudFZpZXcuZW1pdCh0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnKTtcbiAgICAvLyB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddPSB0aGlzLmRhdGFTb3Vyc2VGb3JUYWJsZTtcbiAgICAvLyB0aGlzLmNoYXJ0RGF0YVNvdXJjZUZvck1hcCA9IHRoaXMudGFibGVfY29sdW1uc19jb25maWc7XG5cbiAgfVxuXG4gIGRlbGV0ZUFzc29jaWF0ZWRQYXJhbXMoaW5kZXgpIHtcbiAgICB0aGlzLm9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlLnNwbGljZShpbmRleCwgMSlcbiAgfVxuXG4gIGFkZEFzc29jaWF0ZWRQYXJhbXMoKSB7XG4gICAgdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZS5wdXNoKHtcbiAgICAgICd2aWV3SWQnOiBcIlwiLFxuICAgICAgJ2ZpbHRlckNvbmRpdGlvbic6IFwiXCJcbiAgICB9KVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWRFdmVudFR5cGUoZSkge1xuXG4gICAgaWYgKGUuZXZlbnQpIHtcbiAgICAgIHRoaXMub3B0aW9uYWxEcmlsRG93bkRhdGFTb3VyY2UgPSBbXTtcbiAgICAgIGlmICh0aGlzLnZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnZHJpbGxkb3duJykge1xuICAgICAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXVsnYXNzb2NpYXRlZFZpZXdzJ10gPSBbXTtcbiAgICAgIH1cbiAgICB9XG5cblxuICB9XG5cbiAgcmVzZXRWaWV3UHJvcHJzdGlzZSgpIHtcbiAgICB0aGlzLnZpZXdQcm9wZXJ0aWVzID0ge1xuICAgICAgZW5hYmxlQ2xpY2tFdmVudDogZmFsc2UsXG4gICAgICBlbmFibGVSaWdodENsaWNrRXZlbnQ6IHRydWUsXG4gICAgICBjbGlja0V2ZW50T3B0aW9uczoge1xuICAgICAgICBhc3NvY2lhdGVkVmlld3M6IFtdLFxuICAgICAgICBldmVudFR5cGU6IFwiXCJcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYWRkQ29sb3IoKSB7XG4gICAgdGhpcy50YWJsZURhdGFDb25maWcuY29sb3JzLnB1c2goJyMwMDAwMDAnKTsgLy8gQWRkIGRlZmF1bHQgY29sb3JcbiAgfVxuXG4gIHJlbW92ZUNvbG9yKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnRhYmxlRGF0YUNvbmZpZy5jb2xvcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIG9uQ29sb3JDaGFuZ2UodmFsdWU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMudGFibGVEYXRhQ29uZmlnLmNvbG9yc1tpbmRleF0gPSB2YWx1ZTsgLy8gVXBkYXRlIGNvbG9yIGF0IGluZGV4XG4gIH1cblxuICB2aWV3TWFwRm9yVGVzdCgpIHtcbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YUNvbmZpZyddID0gdGhpcy50YWJsZURhdGFDb25maWc7XG4gICAgaWYgKHRoaXMudmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdvcHRpb25hbERyaWxsRG93bicpIHtcbiAgICAgIHRoaXMudmlld1Byb3BlcnRpZXNbJ2NsaWNrRXZlbnRPcHRpb25zJ11bJ2Fzc29jaWF0ZWRWaWV3cyddID0gdGhpcy5vcHRpb25hbERyaWxEb3duRGF0YVNvdXJjZTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1sndmlld1Byb3BlcnRpZXMnXSA9IHRoaXMudmlld1Byb3BlcnRpZXM7XG5cbiAgICB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnLmtwaUNvbmZpZ1snZGF0YVNvdXJjZSddID0gdGhpcy5kYXRhU291cnNlRm9yVGFibGU7XG4gICAgdGhpcy5jaGFydERhdGFTb3VyY2VGb3JNYXAgPSB0aGlzLnRhYmxlX2NvbHVtbnNfY29uZmlnO1xuXG4gICAgdGhpcy5pc0pzb25QcmV2aWV3ID0gdHJ1ZTtcblxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXdyYXBcIj5cbiAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIG14LTIgYm9yZGVyLXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0pzb25QcmV2aWV3XCI+XG4gICAgICAgICAgICA8cHJlPjxjb2RlPnt7anNhb25EYXRhc291cmNlIHwganNvbn19PC9jb2RlPjwvcHJlPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzSnNvblByZXZpZXdcIj5cbiAgICAgICAgICAgIDwhLS0gPGFwcC1nYW1tYS1nZW8tY2hhcnQgW2NoYXJ0RGF0YVNvdXJjZV09XCJjaGFydERhdGFTb3VyY2VGb3JNYXBcIj48L2FwcC1nYW1tYS1nZW8tY2hhcnQ+IC0tPlxuICAgICAgICAgICAgPGFwcC1nb29nbGUtZ2VvLW1hcCBbY2hhcnREYXRhU291cmNlXT1cImNoYXJ0RGF0YVNvdXJjZUZvck1hcFwiPjwvYXBwLWdvb2dsZS1nZW8tbWFwPlxuXG4gICAgICAgICAgICA8ZGl2ICNkeW5hbWljQ29udGFpbmVyPjwvZGl2PlxuXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbXgtMlwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi00IGJvcmRlci1iIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTcwMFwiPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiZmxleCBmbGV4LXdyYXAgLW1iLXB4IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1jZW50ZXJcIiByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1lLTJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbmxpbmUtYmxvY2sgcC00IGJvcmRlci1iLTIgcm91bmRlZC10LWxnXCIgW25nQ2xhc3NdPVwieyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1wdXJwbGUtNjAwIGJvcmRlci1wdXJwbGUtNjAwIGRhcms6dGV4dC1wdXJwbGUtNTAwIGRhcms6Ym9yZGVyLXB1cnBsZS01MDAnOiBhY3RpdmVUYWIgPT09ICdiYXNpYycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwIGJvcmRlci10cmFuc3BhcmVudCc6IGFjdGl2ZVRhYiAhPT0gJ2Jhc2ljJyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKCdiYXNpYycpXCIgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJ0YWJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWUtMlwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlubGluZS1ibG9jayBwLTQgYm9yZGVyLWItMiByb3VuZGVkLXQtbGdcIiBbbmdDbGFzc109XCJ7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0LXB1cnBsZS02MDAgYm9yZGVyLXB1cnBsZS02MDAgZGFyazp0ZXh0LXB1cnBsZS01MDAgZGFyazpib3JkZXItcHVycGxlLTUwMCc6IGFjdGl2ZVRhYiA9PT0gJ2NoYXJ0X2NvbmZpZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwIGJvcmRlci10cmFuc3BhcmVudCc6IGFjdGl2ZVRhYiAhPT0gJ2NoYXJ0X2NvbmZpZycgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgKGNsaWNrKT1cInNldEFjdGl2ZVRhYignY2hhcnRfY29uZmlnJylcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cInRhYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnQgQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1lLTJcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpbmxpbmUtYmxvY2sgcC00IGJvcmRlci1iLTIgcm91bmRlZC10LWxnXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1wdXJwbGUtNjAwIGJvcmRlci1wdXJwbGUtNjAwIGRhcms6dGV4dC1wdXJwbGUtNTAwIGRhcms6Ym9yZGVyLXB1cnBsZS01MDAnOiBhY3RpdmVUYWIgPT09ICdwcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHQtZ3JheS01MDAgZGFyazp0ZXh0LWdyYXktNDAwIGJvcmRlci10cmFuc3BhcmVudCc6IGFjdGl2ZVRhYiAhPT0gJ3Byb3BlcnRpZXMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIChjbGljayk9XCJzZXRBY3RpdmVUYWIoJ3Byb3BlcnRpZXMnKVwiIHR5cGU9XCJidXR0b25cIiByb2xlPVwidGFiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvbGk+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJkZWZhdWx0LXN0eWxlZC10YWItY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ2Jhc2ljJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gRmlsdGVyIFRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0yIGJvcmRlci14IGJvcmRlci1iIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IFRpdGxlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy50aXRsZVwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMVwiPiBBcmd1bWVudCBGaWVsZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5hcmd1bWVudEZpZWxkXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTFcIj4gQ2hhcnR2YWx1IEZpZWxkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtzZWFyY2hFbmFibGVkXT1cInRydWVcIiBbaXRlbXNdPVwiY29uZmlnQ29sdW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLmNoYXJ0VmFsdWVGaWVsZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0xIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0xXCI+IHNpemU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLnNpemVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkJhY2tncm91bmQgQ29sb3I8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5iYWNrZ3JvdW5kQ29sb3JcIj48L2R4LWNvbG9yLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweC00IG10LTYgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInRhYmxlRGF0YUNvbmZpZy5jb21tb25Db25maWcuaXNTZWFyY2hCb3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YWJsZURhdGFDb25maWcuY29tbW9uQ29uZmlnLmlzU2VhcmNoQm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJTZWFyY2ggQm94XCI+PC9keC1jaGVjay1ib3g+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMSB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBEaXNwbGF5IEZvcm1hdGUgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ2RhaWx5JywnaG91cmx5JywnbW9udGhseSddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGFibGVfY29sdW1uc19jb25maWcua3BpQ29uZmlnLmZvcm1hdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImZhbHNlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTEgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gS2V5IFRvIFBhc3MgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtpdGVtc109XCJjb25maWdDb2x1bWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0YWJsZV9jb2x1bW5zX2NvbmZpZy5rcGlDb25maWcua2V5VG9QYXNzXCI+PC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIHB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBDb2xvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggIGZsZXgtd3JhcCBweC0xIG1iLTIgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1yLTIgbWItMlwiICpuZ0Zvcj1cImxldCBjb2xvciBvZiB0YWJsZURhdGFDb25maWcuY29sb3JzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1yLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNvbG9yLWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5jb2xvcnNbaV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25WYWx1ZUNoYW5nZWQpPVwib25Db2xvckNoYW5nZSgkZXZlbnQudmFsdWUsIGkpXCI+PC9keC1jb2xvci1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgcHgtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNvbG9yKGkpXCI+PGkgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicHgtMlwiPiA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9kYW5nZXJfc219fVwiIChjbGljayk9XCJyZW1vdmVDb2xvcihpKVwiPlJlbW92ZTwvYnV0dG9uPjwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1lbmQgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3Nfc219fVwiIChjbGljayk9XCJhZGRDb2xvcigpXCI+QWRkIENvbG9yPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHB5LTEgZm9udC1leHRyYWJvbGQgYm9yZGVyLWIgYmctZ3JheS03MDAgdGV4dC13aGl0ZSBweC0yXCI+IFRhYmxlIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxzZS1yb3cgcHktMyBib3JkZXIteCBib3JkZXItYiBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgbXQtOCB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFt2YWx1ZV09XCJ0YWJsZURhdGFDb25maWcuc2VhcmNoUGFuZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5zZWFyY2hQYW5lbFwiIHRleHQ9XCJTZWFyY2ggUGFuZWxcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkZpbGUgTmFtZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5maWxlX25hbWVcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gTnVtYmVyIE9mIFJvdzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1udW1iZXItYm94IFt2YWx1ZV09XCJ0YWJsZURhdGFDb25maWcubnVtYmVyT2ZSb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRhYmxlRGF0YUNvbmZpZy5udW1iZXJPZlJvd1wiPjwvZHgtbnVtYmVyLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTEgbWItMiBtdC04IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cInRhYmxlRGF0YUNvbmZpZy5wYWdlSW5mb1wiIFsobmdNb2RlbCldPVwidGFibGVEYXRhQ29uZmlnLnBhZ2VJbmZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIlBhZ2UgSW5mb1wiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYWN0aXZlVGFiID09PSAnY2hhcnRfY29uZmlnJ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLWZ1bGwgb3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBweS0xIGZvbnQtZXh0cmFib2xkIGJvcmRlci1iIGJnLWdyYXktNzAwIHRleHQtd2hpdGUgcHgtMlwiPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb29sdGlwIENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTIgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgYm9yZGVyLWIgZmxleCBmbGV4LXJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHRhYmxlRGF0YUNvbmZpZy5jaGFydF9jb25maWc7IGxldCBpID0gaW5kZXg7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInB4LTEgbWItMiBtdC02IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbdmFsdWVdPVwiaXRlbS52aXNpYmxlXCIgWyhuZ01vZGVsKV09XCJpdGVtLnZpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJWaXNpYmxpdHlcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFZhbHVlIEZpZWxkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCIgW2l0ZW1zXT1cImNvbmZpZ0NvbHVtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtLmRhdGFGaWVsZFwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IENhcHRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0uY2FwdGlvblwiPjwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJweC0yIG1iLTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IFVJIEZ1bmN0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiZW5yaWNoTmFtZUxpc3RcIiBbKG5nTW9kZWwpXT1cIml0ZW0uZW5yaWNoTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC0xIG1iLTIgbXQtNiB3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1jaGVjay1ib3ggW3ZhbHVlXT1cIml0ZW0uaXNTaG93QmFyXCIgWyhuZ01vZGVsKV09XCJpdGVtLmlzU2hvd0JhclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cIkFsbG93IEJhclwiPjwvZHgtY2hlY2stYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMSBtYi0yIHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkNvbG9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY29sb3ItYm94IFsobmdNb2RlbCldPVwiaXRlbS5jb2xvclwiPjwvZHgtY29sb3ItYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtdC04IHctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy11cFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gdGFibGVEYXRhQ29uZmlnLmNoYXJ0X2NvbmZpZy5sZW5ndGggLSAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LWRvd25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlQ29sdW1ucyhpKVwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9wcmltYXJ5X3NtfX0gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiYWRkQ29sdW1ucygpXCI+QWRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uczwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3Byb3BlcnRpZXMnXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtZnVsbCBvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1sb2FkZXIgKm5nSWY9XCJpc0xvYWRlclwiPjwvYXBwLWxvYWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIGJvcmRlci1iIHB5LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtY2hlY2stYm94IFt2YWx1ZV09XCJ2aWV3UHJvcGVydGllcy5lbmFibGVDbGlja0V2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmlld1Byb3BlcnRpZXMuZW5hYmxlQ2xpY2tFdmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PVwiRW5hYmxlIENsaWNrIEV2ZW50XCI+PC9keC1jaGVjay1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LWNoZWNrLWJveCBbdmFsdWVdPVwidmlld1Byb3BlcnRpZXMuZW5hYmxlUmlnaHRDbGlja0V2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmlld1Byb3BlcnRpZXMuZW5hYmxlUmlnaHRDbGlja0V2ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9XCJFbmFibGUgUmlnaHQgQ2xpY2tcIj48L2R4LWNoZWNrLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBwLTJcIiAqbmdJZj1cInZpZXdQcm9wZXJ0aWVzLmVuYWJsZUNsaWNrRXZlbnRcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byBtaW4tdy0wIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtc20gcHktMSBmb250LWV4dHJhYm9sZCBib3JkZXItYiBiZy1ncmF5LTcwMCB0ZXh0LXdoaXRlIHB4LTJcIj4gRXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBwLTMgYm9yZGVyLXggYm9yZGVyLWIgXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBFdmVudCBUeXBlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiWydkcmlsbGRvd24nLCdvcHRpb25hbERyaWxsRG93biddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXRTZWxlY3RlZEV2ZW50VHlwZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlld1Byb3BlcnRpZXMuY2xpY2tFdmVudE9wdGlvbnMuZXZlbnRUeXBlID09ICdkcmlsbGRvd24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBBc3NvY2lhdGVkIFZpZXdzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbaXRlbXNdPVwiYWxsQ29uZmlndXJlZFZpZXdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmFzc29jaWF0ZWRWaWV3c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVFeHByPVwidmlld0lkXCIgZGlzcGxheUV4cHI9XCJ2aWV3TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWxlY3Rpb25Db250cm9sc109XCJ0cnVlXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPjwvZHgtdGFnLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInZpZXdQcm9wZXJ0aWVzLmNsaWNrRXZlbnRPcHRpb25zLmV2ZW50VHlwZSA9PSAnb3B0aW9uYWxEcmlsbERvd24nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cganVzdGlmeS1iZXR3ZWVuIG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIG9wdGlvbmFsRHJpbERvd25EYXRhU291cmNlO2xldCBpID0gaW5kZXg7XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy1mdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEFzc29jaWF0ZWQgVmlld3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10YWctYm94IFtpdGVtc109XCJhbGxDb25maWd1cmVkVmlld3NcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbS52aWV3SWRcIiB2YWx1ZUV4cHI9XCJ2aWV3SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlFeHByPVwidmlld05hbWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhEaXNwbGF5ZWRUYWdzXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hFbmFibGVkXT1cInRydWVcIj48L2R4LXRhZy1ib3g+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+IEFzc29jaWF0ZWQgUGFyYW1zPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW0uZmlsdGVyQ29uZGl0aW9uXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyIG10LThcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVBc3NvY2lhdGVkUGFyYW1zKGkpXCI+PGlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBqdXN0aWZ5LWVuZCBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19IGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFkZEFzc29jaWF0ZWRQYXJhbXMoKVwiPkFkZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbXM8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRWaWV3UHJvcHJzdGlzZSgpXCI+UmVzZXQgQWxsPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L2Rpdj5cblxuXG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgYm9yZGVyLXQgcGwtM1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktc3RhcnQgbXgtMVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl93YXJuaW5nX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiIChjbGljayk9XCJ2aWV3TWFwRm9yVGVzdCgpXCI+XG4gICAgICAgICAgICBQcmV2aWV3PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBjdXJzb3ItcG9pbnRlciBtdC0yXCIgKGNsaWNrKT1cImlzSnNvblByZXZpZXcgPSBmYWxzZVwiPkRhdGFcbiAgICAgICAgICAgIFByZXZpZXc8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZCBteC0xIGZsZXgtZ3Jvd1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXQtMlwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ2V0U2F2ZUNoYXJ0Q29uZmlnKClcIj5TdWJtaXQ8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|